对于在CUDA中使用原子操作,是否需要包含一些CUDA头文件?CUDA编程指南似乎对此非常紧张.
下面给出的代码glmax.cu给出了以下编译错误.
gaurish108 MyPractice: nvcc glmax.cu -o glmax glmax.cu(11): error: identifier "atomicMax" is undefined 1 error detected in the compilation of "/tmp/tmpxft_000010fa_00000000-4_glmax.cpp1.ii".
这是代码.它基本上是使用原子操作计算GPU上阵列的最大值atomicMax
.由于我是CUDA的新手,因此我确信这是一个非常简单的代码,但我写这篇文章是为了帮助自己理解原子操作.
#include#include #include __global__ void global_max(int* values, int* gl_max) { int i=threadIdx.x + blockDim.x * blockIdx.x; int val=values[i]; atomicMax(gl_max,val); } int main(void) { int array_size=5; int num_bytes=array_size*sizeof(int); int *device_array=0; int *host_array=0; int *device_max=0; int *host_max=0; //Allocate memory on the host host_array=(int*)malloc(num_bytes); //Allocate memory on the device cudaMalloc((void**)&device_array,num_bytes); cudaMalloc((void**)&device_max,sizeof(int)); //If either memory allocation failed, report an error message if(host_array == 0 || device_array == 0) { printf("couldn't allocate memory\n"); return 1; } //Assign a random integer in the interval [0,25] to host_array members for(int i=0;i >>(device_array,device_max); //Transfer the maximum value so calculated into the CPU and print it cudaMemcpy(host_max,device_max,sizeof(int),cudaMemcpyDeviceToHost); printf("\nMaximum value is %d\n",*host_max); // deallocate memory free(host_array); cudaFree(device_array); cudaFree(device_max); return 0; }
Jared Hobero.. 15
我不相信有#include
必要."Compute Capability"1.0(sm_10
)设备上没有原子操作,这是您要求nvcc
编译的(默认情况下).
要atomicMax
在代码中使用,请至少-arch=sm_11
在命令行中指定:
$nvcc -arch=sm_11 glmax.cu -o glmax
为了将来参考,您可以参考"CUDA C编程指南"的附录F,了解有关特定计算能力平台上可用的原子操作的信息.
当然,您需要一个sm_11
兼容的GPU才能执行代码.我的印象是,这些现在很常见.
我不相信有#include
必要."Compute Capability"1.0(sm_10
)设备上没有原子操作,这是您要求nvcc
编译的(默认情况下).
要atomicMax
在代码中使用,请至少-arch=sm_11
在命令行中指定:
$nvcc -arch=sm_11 glmax.cu -o glmax
为了将来参考,您可以参考"CUDA C编程指南"的附录F,了解有关特定计算能力平台上可用的原子操作的信息.
当然,您需要一个sm_11
兼容的GPU才能执行代码.我的印象是,这些现在很常见.