0
因此,我最近開始CUDA編程。
CUDA多線程:__線程無法阻止多線程訪問資源
我試着做一個程序,啓動多個線程,進入一個全局內存數組以及它的開始順序。
但是,排他控制的一部分看起來並不好。
我想阻止多個線程同時訪問數組日誌。
現在,數組日誌是這樣的。
Log[0]=160
Log[1]=128
Log[2]=256
Log[3]=96
Log[4]=0
Log[5]=0
Log[6]=0
...etc
欲防止多個線程同時訪問到所述存儲器陣列日誌的獨佔控制。
這是做錯了如何使用「__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;
}
}
}
謝謝羅伯特Crovella! ,但我推遲了, 得到了類似的結果,如你說的羅伯特跑。 我很感激你! – alu21