【发布时间】:2019-12-07 04:17:19
【问题描述】:
我想创建一个通用 cuda 内核,它接受一个可调用对象作为参数(如 lambda 或函数)并调用它。
我无法将设备函数作为参数传递给 cuda 内核。
我有计算能力 3.5 的 cuda 9.2。我在 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 的消息。
【问题讨论】:
-
第二个例子是将主机函数传递给内核,这显然是错误的,还有其他问题
-
我认为
say_hello是一个设备函数,因此它可以传递给内核。 nvcc 在这里没有发出任何警告是正常的吗? -
您已明确将其定义为主机和设备功能。内核启动在主机代码中运行。传递的结果函数引用是一个宿主函数