我正在用CUDA中的原子做一些實驗。我最大的問題是當兩個運行在同一個模塊中的線程原子地訪問相同的地址時,它們的行爲如何。我用atomicAdd嘗試了一些測試,它的工作原理上,但是當我使用atomicCAS嘗試下面的代碼時,結果不是我所期望的。有人有解釋嗎?atomicCAS:塊內的行爲
#include <cuda_runtime.h>
#include <iostream>
#include <cuComplex.h>
using namespace std;
__global__ void kernel(int * pointer)
{
*pointer=0;
*(pointer+threadIdx.x+1)=0;
__syncthreads();
*(pointer+threadIdx.x+1)=atomicCAS(pointer,0,100);
}
int main(int argc,char ** argv)
{
int numThreads=40;
dim3 threadsPerBlock;
dim3 blocks;
int o[numThreads+1];
int * pointer;
cudaMalloc(&pointer,sizeof(int)*(numThreads+1));
cudaMemset(pointer,0,sizeof(int)*(numThreads+1));
threadsPerBlock.x=numThreads;
threadsPerBlock.y=1;
threadsPerBlock.z=1;
blocks.x=1;
blocks.y=1;
blocks.z=1;
kernel <<<threadsPerBlock,blocks>>> (pointer);
cudaMemcpy(o,pointer,sizeof(int)*(numThreads+1),cudaMemcpyDeviceToHost);
for (int i=0;i<numThreads+1;i++)
cout << o[i] << " ";
cout << endl;
}
在同塊訪問中運行相同的地址進行比較上面的代碼atomicCAS和交流......我的期望是,只有一個atomicCAS會發現值進行比較,以0而所有其他人會發現它100,但奇怪的是我的程序的輸出是:
100 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
即所有線程找到的值進行比較,以設置爲0。
Ahh ....是我的愚蠢的錯誤....讓我問一些對我來說非常重要的東西......原子在任何情況下都是原子,或者存在一些他們不工作的特殊情況?我記得在某個地方看了一些東西,但不記得:( – Daniel