【发布时间】:2016-06-21 13:00:38
【问题描述】:
__global__ void kern (int* gpuArr) {
int a;
a = gpuArr[threadIdx.x+1];
}
int main(char** argv, int argc) {
int* gpuArr;
cudaMalloc((void**)&gpuArr,628*sizeof(int));
kern<<<1,32>>>(gpuArr);
cudaDeviceSynchronize();
}
在 Nvidia 视觉分析器中分析上述代码时,我得到以下内存带宽分析。
据我所知,发生的事情是:
来自全局的内存负载 - L2 未命中
从全局复制5*32B到L2(我认为L2的缓存行大小总是32B)
从 L2 复制 2*128B 到 L1(包括 L2 的附加数据,因为 L1 缓存行是 128B?)
对每个线程执行相当于 a = L1_position[threadIdx.x] 的操作
那么每个线程中的局部变量“a”存储在哪里?根据调试器,它不在寄存器中(通常在变量选项卡中显示为@register int,但它显示为@local int)。 “Local Stores 1”这一行到底是什么意思?我们已经做了 2*128B L2 到 L1 的复制(“Global Loads”),那么“Local Store”是什么意思。为什么有 2 个“全球商店”却只有 1 个“本地商店”?
另外,我使用的是 cc 3.0,因此根据规范,L1 中的全局内存缓存是不可能的
【问题讨论】:
-
您是否正在使用该代码进行测量?您的代码的问题是
a = gpuArr[threadIdx.x+1];将被完全优化掉,因为它不会改变全局状态。 -
我正在使用那个确切的代码,我可以调试它,所以我认为它没有被优化掉
-
@Obabopisamon:打开调试时,编译器优化被禁用。但否则该内核将被编译为 NULL 存根
标签: cuda