2011-11-03 137 views
8

对于在CUDA中使用原子操作,是否需要包含一些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". 

这是代码。它基本上是使用原子操作​​3210来计算GPU上阵列的最大值。由于我是CUDA的新手,所以我确信这是一个非常幼稚的代码,但是我写这个是为了帮助我自己理解原子操作。

#include<stdio.h> 
#include<stdlib.h> 
#include<math.h> 

__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<array_size;++i) 
    { 
     *(host_array+i)=rand()%26; 
    } 

    //Print the host array members 
    printf("Host Array\n"); 
    for(int i=0;i<array_size;++i) 
    { 
     printf("%d ",*(host_array+i)); 
    } 
    printf("\n"); 

    //Copy array from host to device. 
    cudaMemcpy(device_array,host_array,num_bytes,cudaMemcpyHostToDevice); 

    //Configure and launch the kernel which calculates the maximum element in the device array. 
    int grid_size=1;//Only 1 block of threads is used 
    int block_size=5;//One block contains only 5 threads 

    //Device array passed to the kernel as data. 
    global_max<<<grid_size,block_size>>>(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; 
} 

回答

13

我不认为#include是必要的。 “计算能力”1.0(sm_10)设备上不提供原子操作,这是您要求nvcc进行编译的默认设置。

要在代码中使用​​3210,请在命令行上至少-arch=sm_11

$nvcc -arch=sm_11 glmax.cu -o glmax 

对于未来的参考,你可以什么原子操作可咨询CUDA C编程指南的附录F信息在特定计算能力的平台上。

当然,您需要一个sm_11兼容的GPU才能执行代码。我的印象是,这些现在很普遍。

+0

谢谢。代码编译时没有任何错误。但我在'printf(“\ n最大值是%d \ n”,* host_max)行得到分段错误;'但是这是另一个线程的主题,我猜:D – smilingbuddha