【发布时间】:2013-10-15 20:56:06
【问题描述】:
我对 CGMA 的计算感到困惑。我知道 CGMA = # of operations / # of memory fetches。首先,当x = g_A[idx]时,我应该将写操作计入x还是因为它存储在寄存器中而忽略它?同样,在z = (x*y) + (y/x) + (y-x); 中,我是否应该将x 和y 的读取计算为计算CGMA 时的内存读取?最后,我是不是应该把Kernel函数中的所有操作(那五行)都数一数?
__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;
}
}
【问题讨论】:
-
对寄存器的读取和写入不计入 GMA。 2 从
g_A和g_B读取计数。写入g_C很重要。为了使算术计算正确,您需要查看 SASS 代码,或者您可以简单地从源代码或 PTX 代码进行估计。您应该计算所有算术运算,包括与idx相关的算术运算 -
<运算符算不算操作? -
是的。在内核中执行的任何算术都算数(例如,即使是非显而易见的地址计算算术)。
-
@RobertCrovella CGMA 似乎被定义为每次访问 CUDA 程序区域内的全局内存时执行的浮点计算数。
<操作符好像被反汇编成ISETP,也就是整数比较,所以我说应该不算吧?我看到的唯一浮点操作是那些与反汇编代码中的x/y相关的操作。 -
可能你是对的。我正在考虑分析驱动的优化,并试图发现内核是计算受限还是内存受限。在这种情况下,我们要考虑在内核中完成的所有计算操作。