在编写一个类时,想在类中调用cuda的内核函数时出现的问题
1. 原来的类是这样写的
class.h
class Class {
__global__ void cuda_func() {};
void call_cuda_func(){
...
cuda_func<<< grid,block >>>();
...
};
};
main.cu
#include "class.h"
int main () {
...
}
- 在编译时就会报错:
illegal combination of memory qualifiers
原因: 想以OOP方式使用CUDA内核, cuda内核函数不能在类内。
**解决:**如果想以OOP方式使用CUDA内核,应该使用如下的类结构:
// myclass.h
class MyClass {
public:
void call_kernel( ... );
};
// myclass.cu
__global__
void my_kernel( ... ) {
// do some work
}
void MyClass::call_kernel() {
// prepare data for the kernel, e.g. allocating memory, copying from host to device, etc.
// run kernel
my_kernel <<< ... >>>( ... );
// copy results from device to host, clean up, etc.
}
其次注意: 在host侧只能调用全局函数,不能调用设备函数(device)。需要加全局修饰(global)。
使用设备函数会报错:a __device__function call must be configured
参考:https://www.itdaan.com/blog/2016/11/11/c72f76e2436fe68ff7a0afe6d71bfab4.html