我正试图将代码解耦,但出现了问题。编译错误:
error: calling a __host__ function("DecoupledCallGpu") from a __global__ function("kernel") is not allowed
代码摘录:
main.c(调用了cuda主机函数):
#include "cuda_compuations.h"
...
ComputeSomething(&var1,&var2);
...
cuda_computations.cu(包含内核、主机主函数和包含设备函数的头文件):
#include "cuda_computations.h"
#include "decoupled_functions.cuh"
...
__global__ void kernel(){
...
DecoupledCallGpu(&var_kernel);
}
void ComputeSomething(int *var1, int *var2){
//allocate memory and etc..
...
kernel<<<20,512>>>();
//cleanup
...
}
decoupled_functions.cuh:
#ifndef _DECOUPLEDFUNCTIONS_H_
#define _DECOUPLEDFUNCTIONS_H_
void DecoupledCallGpu(int *var);
#endif
decoupled_functions.cu:
#include "decoupled_functions.cuh"
__device__ void DecoupledCallGpu(int *var){
*var=0;
}
#endif
编译:
nvcc -g --ptxas-options=-v -arch=sm_30 -c cuda_computations.cu -o cuda_computations.o -lcudart
问题: 为什么DecoupledCallGpu
是从主机函数调用而不是从内核调用呢?
P.S.: 如果需要,我可以分享实际代码。
decoupled_functions.cuh
中的DecoupledCallGpu
原型缺少了__device__
修饰符。将设备功能的编译与调用它的编译单元分离可能意味着您需要使用单独编译和链接。 - Robert Crovella