【发布时间】:2014-08-19 00:23:52
【问题描述】:
我正在尝试将我的代码解耦,但有些失败。编译错误:
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.:如果您需要,我可以分享它背后的实际代码。
【问题讨论】:
-
好吧,在所有这些代码 sn-ps 中,您既没有显示“ComputeDensityGpu”也没有显示“DoColision”,它们是错误消息中列出的实际函数。所以你让我们猜测。但在我看来,
decoupled_functions.cuh中的DecoupledCallGpu原型缺少__device__装饰器。并且将设备函数的编译与调用它的编译单元分开可能意味着您必须使用separate compilation and linking。
标签: c++ cuda linker gpgpu nvidia