在 JCuda 中加载多个模块不起作用

2024-02-22

在jCuda中,可以将cuda文件加载为PTX或CUBIN格式并调用(启动)__global__来自 Java 的函数(内核)。

考虑到这一点,我想使用 JCuda 开发一个框架来获取用户的__device__函数在一个.cu文件在运行时加载并运行它。 我已经实施了__global__函数中,每个线程找到其相关数据的起点,执行一些计算、初始化,然后调用用户的__device__功能。

这是我的内核伪代码:

extern "C" __device__ void userFunc(args);
extern "C" __global__ void kernel(){

    // initialize

    userFunc(args);

    // rest of the kernel
}

以及用户的__device__功能:

extern "C" __device__ void userFunc(args){
    // do something
}

在Java方面,这是我加载模块的部分(模块是由ptx使用以下命令从 cuda 文件成功创建的文件:nvcc -m64 -ptx path/to/cudaFile -o cudaFile.ptx)

CUmodule kernelModule = new CUmodule(); // 1 
CUmodule userFuncModule = new CUmodule(); // 2
cuModuleLoad(kernelModule, ptxKernelFileName); // 3 
cuModuleLoad(userFuncModule, ptxUserFuncFileName); // 4

当我尝试运行它时,我在第 3 行收到错误:CUDA_ERROR_NO_BINARY_FOR_GPU。经过一番搜索后我发现我的ptx文件有一些语法错误。运行此建议命令后:

ptxas -arch=sm_30 kernel.ptx

I got:

ptxas fatal : Unresolved extern function 'userFunc'

即使我将第 3 行替换为第 4 行来加载userFunc before kernel我收到这个错误。我就卡在这个阶段了。这是加载需要在 JCuda 中链接在一起的多个模块的正确方法吗?或者说有可能吗?

Edit:

问题的第二部分是here https://stackoverflow.com/questions/32535828/jit-in-jcuda-loading-multiple-ptx-modules


真正简短的答案是:不,您无法将多个模块加载到运行时 API 的上下文中。

您可以做您想做的事,但它需要显式设置和执行 JIT 链接调用。我不知道 JCUDA 中如何(甚至是否)实现了这一点,但我可以向您展示如何使用标准驱动程序 API 来实现。坚持,稍等...

如果一个文件中有一个设备函数,另一个文件中有一个内核,例如:

// test_function.cu
#include <math.h>
__device__ float mathop(float &x, float &y, float &z)
{
        float res = sin(x) + cos(y) + sqrt(z);
        return res;
}

and

// test_kernel.cu
extern __device__ float mathop(float & x, float & y, float & z);

__global__ void kernel(float *xvals, float * yvals, float * zvals, float *res)
{

        int tid = threadIdx.x + blockIdx.x * blockDim.x;

        res[tid] = mathop(xvals[tid], yvals[tid], zvals[tid]);
}

您可以照常将它们编译为 PTX:

$ nvcc -arch=sm_30 -ptx test_function.cu
$ nvcc -arch=sm_30 -ptx test_kernel.cu
$ head -14 test_kernel.ptx
//
// Generated by NVIDIA NVVM Compiler
//
// Compiler Build ID: CL-19324607
// Cuda compilation tools, release 7.0, V7.0.27
// Based on LLVM 3.4svn
//

.version 4.2
.target sm_30
.address_size 64

        // .globl       _Z6kernelPfS_S_S_
.extern .func  (.param .b32 func_retval0) _Z6mathopRfS_S_

在运行时,您的代码必须创建 JIT 链接会话,将每个 PTX 添加到链接器会话,然后完成链接器会话。这将为您提供已编译的 cubin 映像的句柄,该映像可以像往常一样作为模块加载。将它们放在一起的最简单的驱动程序 API 代码如下所示:

#include <cstdio>
#include <cuda.h>

#define drvErrChk(ans) { drvAssert(ans, __FILE__, __LINE__); }

inline void drvAssert(CUresult code, const char *file, int line, bool abort=true)
{
    if (code != CUDA_SUCCESS) {
        fprintf(stderr, "Driver API Error %04d at %s %d\n", int(code), file, line);
        exit(-1);
    }
}

int main()
{
    cuInit(0);

    CUdevice device;
    drvErrChk( cuDeviceGet(&device, 0) );

    CUcontext context;
    drvErrChk( cuCtxCreate(&context, 0, device) );

    CUlinkState state;
    drvErrChk( cuLinkCreate(0, 0, 0, &state) );
    drvErrChk( cuLinkAddFile(state, CU_JIT_INPUT_PTX, "test_function.ptx", 0, 0, 0) );
    drvErrChk( cuLinkAddFile(state, CU_JIT_INPUT_PTX, "test_kernel.ptx" , 0, 0, 0) );

    size_t sz;
    char * image;
    drvErrChk( cuLinkComplete(state, (void **)&image, &sz) );

    CUmodule module;
    drvErrChk( cuModuleLoadData(&module, image) );

    drvErrChk( cuLinkDestroy(state) );

    CUfunction function;
    drvErrChk( cuModuleGetFunction(&function, module, "_Z6kernelPfS_S_S_") );

    return 0;
}

您应该能够按照发布的方式编译并运行它,并验证它是否正常工作。如果它们实现了 JIT 链接支持,它应该充当 JCUDA 实现的模板。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 JCuda 中加载多个模块不起作用 的相关文章

  • 指定 NVCC 用于编译主机代码的编译器

    运行 nvcc 时 它始终使用 Visual C 编译器 cl exe 我怎样才能让它使用GCC编译器 设置CC环境变量到gcc没有修复它 我在可执行文件帮助输出中也找不到任何选项 在 Windows 上 NVCC 仅支持 Visual C
  • 运行JDK代码时Java JIT会作弊吗?

    我正在对一些代码进行基准测试 但我无法让它运行得像java math BigInteger https docs oracle com javase 7 docs api java math BigInteger html 即使使用完全相同
  • 为什么GK110有192个核心和4个扭曲?

    我想感受一下开普勒的架构 但这对我来说没有意义 如果一个 warp 有 32 个线程 其中 4 个被调度 执行 则意味着 128 个核心正在使用 64 个核心处于空闲状态 白皮书中提到了独立指令 那么64核是为这些指令保留的吗 如果是这样
  • 如何在 CUDA 应用程序中构建数据以获得最佳速度

    我正在尝试编写一个简单的粒子系统 利用 CUDA 来更新粒子位置 现在 我定义的粒子有一个对象 该对象的位置由三个浮点值定义 速度也由三个浮点值定义 更新粒子时 我向速度的 Y 分量添加一个常量值以模拟重力 然后将速度添加到当前位置以得出新
  • 在 64 位 Windows 计算机上使用 32 位 com 运行 32 位应用程序

    我有一个使用 C COM 对象的 C 应用程序 两者都构建在 32 位计算机上 现在我必须在 64 位机器上运行它们 我注册了COM对象 在计算机 hkey classes root wow6432node clsid xxx 下的寄存器中
  • 使用 CUDA __device__ 函数时出现链接器错误 2005 和 1169(多重定义的符号)(默认情况下应内联)

    这个问题与以下问题有很大关系 A 如何将CUDA代码分成多个文件 https stackoverflow com questions 2090974 how to separate cuda code into multiple files
  • 在新线程中调用支持 CUDA 的库

    我编写了一些代码并将其放入它自己的库中 该库使用 CUDA 在 GPU 上进行一些处理 我正在使用 Qt 构建 GUI 前端 作为加载 GUI 的一部分 我调用 CUresult res CUdevice dev CUcontext ctx
  • 如何将CUDA时钟周期转换为毫秒?

    我想用一些代码来测量时间within我的内核需要 我已经关注了这个问题 https stackoverflow com questions 11209228 timing different sections in cuda kernel连
  • cudaMemcpyToSymbol 的问题

    我正在尝试复制到恒定内存 但我不能 因为我对 cudaMemcpyToSymbol 函数的用法有误解 我正在努力追随this http developer download nvidia com compute cuda 4 1 rel t
  • cudaMallocManaged() 返回“不支持的操作”

    在 CUDA 6 0 中尝试托管内存给了我operation not supported打电话时cudaMallocManaged include cuda runtime h include
  • 同时使用 2 个 GPU 调用 cudaMalloc 时性能较差

    我有一个应用程序 可以在用户系统上的 GPU 之间分配处理负载 基本上 每个 GPU 都有一个 CPU 线程来启动一个GPU处理间隔当由主应用程序线程定期触发时 考虑以下图像 使用 NVIDIA 的 CUDA 分析器工具生成 作为示例GPU
  • 玩框架。无需编译

    我被介绍到 Play 框架 我发现它的令人惊奇的事情之一是不需要编译项目 您只需保存编辑的文件并重新加载网页即可 我听说 Java 源代码被编译为字节码 然后使用 JIT 编译器进行编译 那么 Play 框架内部到底有什么魔力呢 在 DEV
  • CUDA线程执行顺序

    我有一个 CUDA 程序的以下代码 include
  • Nvcc 的版本与 CUDA 不同

    我安装了 cuda 7 但是当我点击 nvcc version 时 它打印出 6 5 我想在 GTX 960 卡上安装 Theano 库 但它需要 nvcc 7 0 我尝试重新安装cuda 但它没有更新nvcc 当我运行 apt get i
  • 如何在 CUDA 中执行多个矩阵乘法?

    我有一个方阵数组int M 10 以便M i 定位第一个元素i th 矩阵 我想将所有矩阵相乘M i 通过另一个矩阵N 这样我就收到了方阵数组int P 10 作为输出 我看到有不同的可能性 分配不同元素的计算M i 到不同的线程 例如 我
  • Yocto for Nvidia Jetson 由于 GCC 7 而失败 - 无法计算目标文件的后缀

    我正在尝试将 Yocto 与 meta tegra 一起使用 https github com madisongh meta tegra https github com madisongh meta tegra 为 Nvidia Jets
  • CUDA 矩阵加法时序,按行与按行比较按栏目

    我目前正在学习 CUDA 并正在做一些练习 其中之一是实现以 3 种不同方式添加矩阵的内核 每个元素 1 个线程 每行 1 个线程和每列 1 个线程 矩阵是方阵 并被实现为一维向量 我只需用以下命令对其进行索引 A N row col 直觉
  • 在 cudaFree() 之前需要 cudaDeviceSynchronize() 吗?

    CUDA 版本 10 1 帕斯卡 GPU 所有命令都发送到默认流 void ptr cudaMalloc ptr launch kernel lt lt lt gt gt gt ptr cudaDeviceSynchronize Is th
  • __device__ __constant__ 常量

    有什么区别吗 在 CUDA 程序中定义设备常量的最佳方法是什么 在 C 主机 设备程序中 如果我想将常量定义在设备常量内存中 我可以这样做 device constant float a 5 constant float a 5 问题 1
  • 无法在内存位置找到异常源:cudaError_enum

    我正在尝试确定 Microsoft C 异常的来源 test fft exe 中 0x770ab9bc 处的第一次机会异常 Microsoft C 异常 内存位置 0x016cf234 处的 cudaError enum 我的构建环境是 I

随机推荐

  • 如何处理 React Native 应用程序在 tvOS 和 Android TV 之间的扩展问题?

    Apple TV 的原生分辨率似乎为 1920x1080 如预期 但 Android TV Fire TV 的原生分辨率似乎为 961 5022957581195x540 8450413639423 根据Dimensions get win
  • 如何在不修改java.security文件的情况下在Java 8中启用SSLv3?

    在 JDK 8 中 默认情况下禁用 SSLv3 并启用 TLSv1 2 当我谷歌时 我发现很多帖子都通过注释掉以下行来启用 SSLv3java securitylib 文件夹中的文件 我想通过设置系统属性来启用 SSLv3 而不需要修改 j
  • 如何获取枚举条目的名称?

    我想迭代 TypeScript 枚举对象并获取每个枚举符号名称 例如 枚举 myEnum 条目 1 条目 2 for var entry in myEnum use entry s name here e g entry1 尽管已经给出了答
  • 类型错误:无法读取未定义的属性“prepareStyles”

    My Component好像 import React PropTypes from react import TransactionListRow from TransactionListRow import Table TableBod
  • Laravel 用户有权访问某些页面吗?

    我创建了一个 slug 页面 如下所示 Create pages table for dynamic pages id slug title page template 0 about about us about blade 1 cont
  • 使用 jQuery 调整父元素的高度以匹配其可见子元素的高度

    我有一个在容器中运行的幻灯片 需要容器的高度与可见幻灯片的高度相匹配 不幸的是 这些图像是绝对定位的 我对此无能为力 为了解决这个问题 我使用了一些 jQuery 魔法来处理相同的功能 由于某种原因 我的代码无法正常工作 每当 contai
  • 有没有JavaScript静态分析工具? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我做了一些愚蠢的事情 例如变量名拼写错误 时 我习惯于让编译器抱怨 但 JavaScript 习惯于让
  • 为什么我不能直接将 document.getElementById 分配给不同的函数?

    所以我试图定义一个类似于 document getElementById 的函数 g 以下工作正常 var g function id return document getElementById id 但为什么这个更直接的代码不起作用呢
  • dplyr:mutate 内的整数采样

    我正在尝试在中生成一列tbl df这是一个 0 或 1 的随机整数 这是我正在使用的代码 library dplyr set seed 0 Dummy data frame to test df lt tbl df data frame x
  • 设置 Yii2 预览

    Yii2 预览版最近发布 可在github https github com yiisoft yii2 我想对其进行试驾 但到目前为止 文档 几乎立即就过时了 因为它仍在大量开发中 我曾尝试遵循本指南 http www yiiframewo
  • 无法刷新状态存储

    我正在尝试在 Kafka Streams 中创建一个 leftJoin 它对于大约 10 条记录工作正常 然后由于以下原因导致异常崩溃 NullPointerException用这样的代码 private static KafkaStrea
  • 如何在eclipse中同时调试两个项目?

    我有两个项目 consle 和 android 项目 我想比较变量的值 因为相同的代码 正如我认为的 给出了不同的结果 我必须找到错误 如果我按 F6 按钮 状态只会在一个项目中发生变化 是否可以即时切换调试项目 在两个项目中放置断点并以调
  • 尝试使用类型族来消除具有灵活上下文的重叠实例时出错

    我试图在我正在使用的类型的类型参数上使用一些相当复杂的条件来定义类型类的实例 并且认为一个有用的方法是声明一个封闭的类型系列 该系列在我定义的实例之间进行选择 不幸的是 我根本无法让这个想法发挥作用 因为 GHC 抱怨这些实例是重复的 这是
  • grails-app/utils 目录

    我刚刚注意到的存在grails app utils目录 我从未在任何文档中看到过它 或在项目中使用过 它是在运行时默认创建的create app 知道你应该在那里放什么吗 实用程序 代码是一个明显的猜测 但似乎应该放在src dir 谢谢
  • 扩展 JavaScript 字符串中的 ${var} 引用 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 学习一些超越普通 JavaScript 的东西 我正在读的书告诉我这样的说法 let someVar Happy console
  • 从R中的矩阵中删除对角线元素

    如何使用 R 从矩阵 L 中删除对角元素 diagL 我尝试使用以下内容 subset L select diag L or subset L select c diag L 但我得到了 0 个号码 R 编程语言 我更喜欢C 它更容易拼写
  • 带有事务的 SourcePollingChannelAdapter

    我想使用 SourcePollingChannelAdapter 来实现轮询时需要事务传播 以便在发生错误时回滚所有操作 setTransactionSynchronizationFactory 方法没有注释 非常感谢你的帮助 在 XML
  • Kendo UI 参考在 Razor 视图中不起作用

    我正在尝试创建 Telerik 网格视图 但是当我去参考剑道时它无法识别它 当我尝试引用剑道时 Visual Studio 给出错误 这是代码 Html Kendo Grid 下面是错误 System Web Mvc HtmlHelper
  • MongoDB 的插入安全模式有多安全?

    我正在开发一个项目 其中包含一些重要数据 这意味着如果灯或服务器出现故障 我们不会丢失任何数据 我们使用 MongoDB 作为数据库 我想确保插入后我的数据位于数据库中 如果未插入一个元素 则回滚整个批次 我知道 Mongo 背后的理念是我
  • 在 JCuda 中加载多个模块不起作用

    在jCuda中 可以将cuda文件加载为PTX或CUBIN格式并调用 启动 global 来自 Java 的函数 内核 考虑到这一点 我想使用 JCuda 开发一个框架来获取用户的 device 函数在一个 cu文件在运行时加载并运行它 我