0

CGMAの計算で迷っています。CGMA = 操作数 / メモリ フェッチ数であることはわかっています。まず、いつx = g_A[idx]、書き込み操作をカウントするxか、レジスタに格納されているため無視する必要がありますか? 同様に、のとの読み取りを CGMA の計算でメモリ読み取りとしてz = (x*y) + (y/x) + (y-x);カウントする必要がありますか? 最後に、カーネル関数のすべての操作 (これらの 5 行) をカウントする必要がありますか?xy

__global__ void PerformSomeOperations(int* g_A,int* g_B,int* g_C, int Size)
{
    const int idx = threadIdx.x + (blockIdx.x*blockDim.x);
    if(idx < Size)
    {
        int x = g_A[idx];
        int y = g_B[idx];
        int z = 0;
        z = (x*y) + (y/x) + (y-x);
        g_C[idx] = z;
    }
}
4

2 に答える 2

1

CGMAはCompute to Global Memory Accessの略で、CUDA プログラムの領域内のグローバル メモリへのアクセスごとに実行される浮動小数点計算の数として定義されているようです

比率を計算する最良の方法は、プログラムを CUDA プロファイラーで実行し、メモリ アクセスと浮動小数点演算にパフォーマンス カウンターを使用することです。私が見つけた定義によると、カーネルは浮動小数点ではなく整数演算を実行するため、ゼロの CGMA を持っています。定義を変更するx = g_A[idx]と、読み取り操作は 1 回で、書き込み操作はありません。これは、レジスタ ファイルがグローバル メモリ (CGMA の "G") に格納されていないためです。にはグローバル メモリの読み取りがないz = (x*y) + (y/x) + (y-x);ため、5 回の操作としてカウントします。すべてのスレッドが実行される場合idx < Sizeの場合、3 つのグローバル メモリ アクセスと 8 つの操作があります。ただし、CUDA では、グローバル メモリ アクセスのパフォーマンスは、それらが結合されているかどうかに依存することに注意してください。多くの結合されたメモリ アクセスは、いくつかの結合されていないメモリ アクセスよりもはるかに高速に実行できます。したがって、CGMA は、カーネルのパフォーマンスの可能性を正確に示すとは限りません。

参考文献:

http://www.greatlakesconsortium.org/events/GPUMulticore/Chapter4-CudaMemoryModel.pdf

http://cs.nyu.edu/courses/spring12/CSCI-GA.3033-012/lecture6.pdf

于 2013-10-15T04:10:30.117 に答える