我正在使用P100对单精度原子(还原)事务进行一些测试,并且得到了随机的意外结果。我希望有人对原因有所了解
以下是我正在分析的测试程序
__global__ void atomic_test(float * out)
{
int x=threadIdx.x+blockIdx.x*blockDim.x;
//Create a pattern
int myP=x/8;
int myU=x%8;
int myNewX=myP*myP*32+myU;
atomicAdd(out+myNewX,1.0f);
}
main()
{
int blocks=1;
float * out;
cudaMalloc(&out,sizeof(float)*16*32);
dim3 threadDim;
threadDim.x=32;
threadDim.y=1;
threadDim.z=1;
for (int x=0;x<5;x++)
atomic_test<<<blocks,threadDim>>>(out);
cudaDeviceSynchronize();
cudaFree(out);
exit(0);
}
atomic_test只需运行1次就可以运行,而它所做的只是原子加法。经线以某种方式分为4个,每组8个线程将在正确对齐的32Byte字上执行原子加法。
我对P100的理解是任何与内存相关的事务都可以处理32字节对齐的字,因此应由Warp生成4个原子事务。
奇怪的是,探查器多次进行如下所示的4个事务
atomic_transactions Atomic Transactions 4 4 4
atomic_transactions_per_request Atomic Transactions Per Request 4.000000 4.000000 4.000000
l2_atomic_throughput L2 Throughput (Atomic requests) 104.20MB/s 105.28MB/s 104.87MB/s
l2_atomic_transactions L2 Transactions (Atomic requests) 16 16 16
但有时它会报告6笔交易:
atomic_transactions Atomic Transactions 6 6 6
atomic_transactions_per_request Atomic Transactions Per Request 6.000000 6.000000 6.000000
l2_atomic_throughput L2 Throughput (Atomic requests) 104.47MB/s 105.28MB/s 105.00MB/s
l2_atomic_transactions L2 Transactions (Atomic requests) 16 16 16
有人知道为什么会这样吗?可能有一些对齐问题?另外,有人知道为什么4/6原子事务在L2上创建16个读事务吗?
预先感谢