【问题标题】:Calling __device__ function using PyCUDA returns error使用 PyCUDA 调用 __device__ 函数返回错误
【发布时间】:2023-03-22 23:51:01
【问题描述】:

当我尝试运行以下代码时,我收到此错误:

Traceback (most recent call last):
  File "C:\temp\GPU Program Shell.py", line 28, in <module>
    dev=mod.get_function("lol")
  File "C:\Python33\lib\site-packages\pycuda\compiler.py", line 285, in get_function
    return self.module.get_function(name)
pycuda._driver.LogicError: cuModuleGetFunction failed: not found

代码如下:

mod = SourceModule("""

extern "C" {
__device__ void lol(double *a)
{
    a[0]=1;
}


__global__ void kernel(double *a)
{
    const int r = blockIdx.x*blockDim.x + threadIdx.x;
    a[r] = 1;
}
}
""")

max_length = 5
a = numpy.zeros(max_length)
a_gpu = cuda.mem_alloc(a.nbytes)
cuda.memcpy_htod(a_gpu, a)
func = mod.get_function("kernel")
dev=mod.get_function("lol")
dev(a_gpu)
newa = numpy.empty_like(a)
cuda.memcpy_dtoh(newa, a_gpu)

print(newa)
print(a)

您可能会看到,这是对 PyCUDA 教程代码的轻微修改。我的意图是调用这个设备函数,它将启动内核并集成事物,通常让我的生活更轻松。我做了一些谷歌搜索,我知道我必须将“extern“c””放入我的代码中,因为名称重整,并且在我刚刚使用 PyCUDA 启动内核而不是设备功能之前已经成功。同样,如果我更改代码以启动内核而不是设备功能,它会按照我的意愿执行。我在这里错过了什么?

卡斯滕

多看一下设备接口参考文档,似乎函数 get_function 只处理 global 函数?我的解释正确吗?如果是这样,我能做我想做的事吗?

【问题讨论】:

    标签: extern pycuda


    【解决方案1】:

    您不能从主机代码调用__device__ 函数。如果您指出 PyCUDA 教程代码显示了如何执行此操作,我希望看到该教程。

    我不清楚您通过从主机代码调用 __device__ 函数来完成什么,而这是普通内核 (__global__) 启动无法完成的。

    【讨论】:

    • 对,罗伯特,我问了这个问题没多久,我就意识到这是一个愚蠢的问题。我要做的是编写一个积分器,在我发送初始条件和参数后,它只在 gpu 上运行。我希望设备函数(我现在只使用单线程内核)来运行集成器并能够调用其他内核来执行集成。
    • 您可以仅使用单个线程的单个块启动__global__ 内核,其行为应与您想到的__device__ 函数相同。不试图评论整体想法,只是机制。
    • 是的,这就是我现在想要做的。你认为这是一个坏主意吗?
    • 通常启动一个块和一个线程的内核并不是从 GPU 获得性能的方式。但是您的描述(“我的意图是调用这个将启动内核并集成事物的设备函数”)使它听起来像是一个主线程,有点像,这可能没问题。这个问题中没有足够的信息来更具体地评论它。
    猜你喜欢
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2020-10-29
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多