为什么我定义了全局变量,但是在__global__ void函数中,它说我未定义
时间: 2024-03-20 22:42:00 浏览: 14
在CUDA中,全局变量与主机(CPU)上的全局变量有所不同。CUDA中的全局变量只有在GPU上存在,并且必须使用`__device__`修饰符声明它们。如果你想从主机上访问它们,你需要使用`cudaMemcpyToSymbol`函数将它们复制到设备上。
如果你在`__global__`函数中访问未定义的全局变量,那么编译器会认为这个变量只存在于主机上,因此会报错说未定义。
以下是一个示例,展示如何在CUDA中定义和访问全局变量:
```c
__device__ int myGlobalVariable;
__global__ void myKernel() {
int result = myGlobalVariable * 2;
}
int main() {
// 定义和初始化主机上的变量
int hostVariable = 42;
// 将主机上的变量复制到设备上
cudaMemcpyToSymbol(myGlobalVariable, &hostVariable, sizeof(int));
// 调用内核
myKernel<<<1, 1>>>();
cudaDeviceSynchronize();
return 0;
}
```
在这个示例中,我们使用`__device__`修饰符声明了一个全局变量`myGlobalVariable`。在主函数中,我们定义了一个主机上的变量`hostVariable`,然后使用`cudaMemcpyToSymbol`函数将它复制到设备上的`myGlobalVariable`中。在`myKernel`函数中,我们访问了`myGlobalVariable`变量,这是合法的,因为它现在已经被定义并且存在于设备上。