这里是简单的cuda代码 我正在测试访问全局内存的时间。读和对。
下面是内核函数(test1())。
enter code here
__global__ void test1(int *direct_map)
{
int index = 10;
int index2;
for(int j=0; j<1024; j++)
{
index2 = direct_map[index];
direct_map[index] = -1;
index = index2;
}
}
direct_map是683 * 1024线性矩阵,每个像素都有一个偏移值来访问其他像素 index和index2不是继续地址。
这个内核函数需要 600 微秒。
但是,如果我删除代码,
direct_map [index] = -1;
只需 27 微秒。
我认为代码已经从
的全局内存中读取了direct_map [index]的值index2 = direct_map [index];
然后,它应该位于L2缓存 因此,当执行“direct_map [index] = -1;”时,速度应该很快。
而且,我测试了随机写入全局内存(test2())。
大约 120 微秒。
enter code here
__global__ void test2(int *direct_map)
{
int index = 10;
for(int j=0; j<1024; j++)
{
direct_map[index] = -1;
index = j*683 + j/3 - 1;
}
}
所以,我不知道为什么test1()接管超过600微秒。 谢谢。
答案 0 :(得分:1)
删除代码行时:
direct_map[index] = -1;
你的内核没有做任何有用的。编译器可以识别这一点并消除与内核启动相关的大多数代码。对内核代码的修改意味着内核不再影响任何全局状态,从编译器的角度来看,代码实际上是无用的。
您可以通过转储编译器在每种情况下生成的汇编代码来验证这一点,例如使用cuobjdump -sass myexecutable
只要您对代码进行一些小改动并看到时间发生很大变化,您就应该怀疑所做的更改是否允许编译器做出不同的优化决策。