【发布时间】:2018-07-30 02:01:46
【问题描述】:
我正在尝试将 atomicAdd 函数作为模板参数传递给另一个函数。
这是我的 Kernel1:
template<typename T, typename TAtomic>
__global__ void myfunc1(T *address, TAtomic atomicFunc) {
atomicFunc(address, 1);
}
尝试 1:
myfunc1<<<1,1>>>(val.dev_ptr, atomicAdd);
由于编译器无法匹配预期的函数签名,它不起作用。
尝试 2: 首先,我将 atomicAdd 包装到一个名为 MyAtomicAdd 的自定义函数中。
template<typename T>
__device__ void MyAtomicAdd(T *address, T val) {
atomicAdd(address, val);
}
然后,我定义了一个名为“TAtomic”的函数指针,并将TAtomic声明为模板参数。
typedef void (*TAtomic)(float *,float);
template<typename T, TAtomic atomicFunc>
__global__ void myfunc2(T *address) {
atomicFunc(address, 1);
}
myfunc2<float, MyAtomicAdd><<<1,1>>>(dev_ptr);
CUDA_CHECK(cudaDeviceSynchronize());
实际上,尝试 2 个作品。但是,我不想使用 typedef。我需要更通用的东西。
尝试 3: 只需将 MyAtomicAdd 传递给 myfunc1。
myfunc1<<<1,1>>>(dev_ptr, MyAtomicAdd<float>);
CUDA_CHECK(cudaDeviceSynchronize());
编译器可以编译代码。但是我运行程序的时候,报错:
"ERROR in /home/liang/groute-dev/samples/framework/pagerank.cu:70: invalid program counter (76)"
我只是想知道,为什么尝试 3 不起作用?是否存在任何简单或温和的方法来实现此要求?谢谢。
【问题讨论】: