それで、最近CUDAプログラミングを始めました。
そして、複数のスレッドを開始し、グローバルメモリの配列とそれが開始された順序に入るプログラムを作成しようとしました。
ただし、排他制御の一部がうまく機能していないようです。
複数のスレッドが同時に配列ログにアクセスするのを防ぎたい。
現在、配列のログは次のようになっています。
Log[0]=160
Log[1]=128
Log[2]=256
Log[3]=96
Log[4]=0
Log[5]=0
Log[6]=0
...etc
複数のスレッドが同時にメモリ配列 Log の排他制御にアクセスするのを防ぎたい。
の「__threadfence()」の使い方が間違っているのでしょうか?
私は CUDA5.5 を使用しており、計算能力は 2.1 です。
誰かアドバイスください。
以下はソースコードです。
#include <cuda_runtime.h>
#include <stdio.h>
#include <cuda.h>
#include <cstdio>
#include <thrust/device_ptr.h>
#define N 256
//Prototype declaration
__global__ void CudaThreadfenceTest(int *Log_d);
int main(){
int i,j;
int Log[N];
int *Log_d;
//
for(j=0;j<N;j++){
Log[j]=0;
}
// GPU memory hold
cudaMalloc((void**)&Log_d, N*sizeof(int));
// host→device
cudaMemcpy(Log_d,Log,N*sizeof(int),cudaMemcpyHostToDevice);
/*****************
*block & thread
******************/
dim3 blocks(1,1,1);
dim3 threads(256,1,1);
//run kernel
CudaThreadfenceTest<<<blocks,threads>>>(Log_d);
cudaDeviceSynchronize();
cudaMemcpy(Log,Log_d,N*sizeof(int),cudaMemcpyDeviceToHost);
for(j=0;j<N;j++){
printf("Log[ %d ]=%d \n",j,Log[j]);
}
getchar();
cudaFree(Log_d);
return 0;
}
/*************************
/* kernel
/*************************/
__global__ void CudaThreadfenceTest(int *Log_d){
printf("threadIdx.x = %d , \n",threadIdx.x);
__threadfence();
//for Log
for(int j=0;j<N;j++){
if(Log_d[j]==0){
Log_d[j]=threadIdx.x + 1;
break;
}
}
}