Nvidia GPU 100原子交易

时间:2019-03-21 00:19:24

标签: cuda gpu nvidia

我正在使用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个读事务吗?

预先感谢

0 个答案:

没有答案