如何将函数作为CUDA内核参数传递
How to pass a function as a cuda kernel parameter?
我想创建一个通用的cuda内核,将可kerable对象作为参数(例如lambda或function(并调用。
我很难将设备函数传递给CUDA内核作为参数。
我的CUDA 9.2具有计算能力3.5。我在Debian 10上使用GCC 9.3。
我尝试了此操作,用nvcc -arch=sm_35 --expt-extended-lambda main.cu -o test
:
__host__ __device__ void say_hello()
{
printf("Hello World from function!n");
}
template<class Function>
__global__ void generic_kernel(Function f)
{
f();
}
int main()
{
// this is working
generic_kernel<<<1,1>>>([]__device__(){printf("Hello World from lambda!n");});
cudaDeviceSynchronize();
// this is not working!
generic_kernel<<<1,1>>>(say_hello);
cudaDeviceSynchronize();
return 0;
}
我希望同时看到Hello World from function!
和Hello World from lambda!
,但我只看到lambda的消息。
debian不是任何版本的CUDA的支持环境。GCC 9.3不是CUDA 9.2
的支持工具在cuda
标签上涵盖了这些主题有很多问题。此答案链接到其中许多。
简短的版本是从根本上不可能在主机代码中捕获__device__
功能地址。内核启动(如您在这里所示(是用主机代码编写的;它是主机代码。因此,在主机代码中使用say_hello
,它将参考__host__
功能指针/地址。该功能指针/地址在设备代码中无用。(卸下__host__
装饰器将无济于事。(
有许多可能的解决方案,您已经探索过其中之一。传递包裹在某种对象中的功能,并在直接按照您的身份直接使用__device__
lambda,适合该描述。
您所拥有的功能指针方法的另一个可能的修复程序是在设备代码中捕获功能指针。然后必须将其传递给主机,然后可以通过内核启动转换为设备代码,然后在此处派遣。上面的链接答案提供了多种可以实现的方法。
相关文章:
- CUDA内核和数学函数的显式命名空间
- 将 2D 推力::d evice_vector 复矩阵传递给 CUDA 内核函数
- 如何将矢量的数据传递给 CUDA 内核?
- 无法在 cuda 内核中使用我的模板类
- CUDA内核printf()在终端中不产生输出,在探查器中工作
- 编译为 cuda 内核调用提供了"expression must have integral or unscoped enum type"
- 使用模板模式优化 CUDA 内核
- 带有大结构变量的 CUDA 内核函数给出了错误的结果
- CUDA 内核在第二次运行时运行得更快 - 为什么?
- 在CUDA内核中传递一个常数整数
- 如何将函数作为CUDA内核参数传递
- 验证调用 cuda 内核的次数
- cuda 内核调用/传递参数中的编译错误
- 预期;在 CUDA 内核上
- CUDA 内核"Only a single pack parameter is allowed"解决方法?
- 降低CUDA内核运行时:内核中矩阵的动态内存分配
- 如何在多个 GPU 上同时执行 cufftXt 和 CUDA 内核
- 执行 CUDA 内核时黑屏C++输出正确的结果
- CUDA 内核中的竞争条件
- 优化三角矩阵计算的 CUDA 内核执行