我对CGMA的计算感到困惑。我知道CGMA=操作的CGMA/内存获取的CGMA。首先,当x = g_A[idx]
时,我应该将写操作计数为x
还是忽略它,因为它存储在寄存器中?同样地,在计算CGMA时,我是否应该将读取的z = (x*y) + (y/x) + (y-x);
和x
计算为内存读取?最后,我是否应该计算内核函数中的所有操作(这五行)?
__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;
}
}
最佳答案
看起来CGMA代表计算到全局内存访问,定义为
为每个对全局内存的访问执行的浮点计算
CUDA程序的区域。
计算比率的最佳方法是在CUDA分析器中运行程序,并使用性能计数器进行内存访问和浮点操作。根据我找到的定义,内核的CGMA为零,因为它执行整数运算,而不是浮点运算。如果更改定义,则x = g_A[idx]
是一个读操作,而不是写操作。这是因为寄存器文件没有存储在全局内存中(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
关于c - CUDA中CGMA的计算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19372588/