2011-11-03 15 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が必要とは思わない。のコンパイルを(デフォルトで)求めている「Compute Capability」1.0(sm_10)デバイスでは、アトミック操作は使用できません。

コマンドラインで少なくとも-arch=sm_11を指定して、あなたのコードで​​3210を使用するには:

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

今後の参考のために、あなたは利用可能なアトミックな操作方法については、CUDA Cプログラミングガイドの付録Fを参照してくださいすることができます特定のコンピューティング能力のプラットフォーム上にある。

もちろん、コードを実行するにはsm_11互換のGPUが必要です。私の印象は、これが現在共通していることです。

+0

ありがとうございました。コードはエラーなしでコンパイルされています。しかし、私は 'printf(" \ n最大値は%d \ n "、* host_max)行のセグメンテーションフォールトを取得しています;しかし、それは私が推測する別のスレッドの主題です:D – smilingbuddha

関連する問題