CUDA全局内存访问速度

时间:2013-12-22 13:21:12

标签: memory cuda global

这里是简单的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微秒。 谢谢。

1 个答案:

答案 0 :(得分:1)

删除代码行时:

direct_map[index] = -1; 

你的内核没有做任何有用的。编译器可以识别这一点并消除与内核启动相关的大多数代码。对内核代码的修改意味着内核不再影响任何全局状态,从编译器的角度来看,代码实际上是无用的。

您可以通过转储编译器在每种情况下生成的汇编代码来验证这一点,例如使用cuobjdump -sass myexecutable

只要您对代码进行一些小改动并看到时间发生很大变化,您就应该怀疑所做的更改是否允许编译器做出不同的优化决策。