system
1
1.我用profiler测我程序的local memory store/load throughput发现不为0,我想知道到底是哪个变量引起local memory store/load throughput ,profiler是否提供这种功能?
2.1由于我不知道到profiler是否提供这种功能,我用如下方法来排除哪些变量已分配到寄存器,哪些变量分配到局部存储器。
2.2先测得并记录local memory store/load throughput
然后在声明(除了共享存储器变量)的所有变量前(程序中声明的变量只希望分配到共享和寄存器)加上关键字”register"(由于变量是双精度,且不到20个,应该寄存器能放下,所以应该不会因为不够放而放进local memory)。此时profiler测得程序的
local memory store/load throughput和先前几乎一样。这就应该证明我先前的变量已经放进寄存器了。
2.3因为
(1)1.x上将使用shared memory进行参数传递。
(2)2.0+上将使用constant memory进行参数传递。
(3)任何时候,当您的一个线程修改了某个参数的值,则一个本地副本被创建(寄存器或者local memory中)。
基于第三条,线程修改参数的值,则本地 副本被创建(寄存器或者local memory中),于是判断本地副本被创建到local memory
这种方法是否具有正确性,请版主解惑。
system
2
同问楼主,你的profiler是自己安装的,还是nsight集成的?如何打开如官网上面的图片 developer.nvidia.com/nvidia-visual-profiler
system
3
楼主您好,
首先说,profiler没有指出“那个变量引起local traffic"的功能。
实际上,它也应该永远不提供此功能。因为您的想法不正确。
因为您的想法实际上是不正确的,所以基于这个想法或者假设进行的试验,以及其结果,也是不正确和无意义的。
(但是依然鼓励您自己实现,实际上,能试验您总是有收获的。但不对的地方(或者我认为不对的地方),我还是要为您指正。这是为您好)
首先说,是否使用register毫无意义,因为这将不会影响到某个变量是否真的会在寄存器里(永远或者某个时间段内)。
您应当将寄存器和local memory, 看成是一体的。而将前者是看成无索引寻址功能的后者的高速版本。只要是有可能,编译器总是尝试放入寄存器的。
其次,您有一种某个变量只要在寄存器里,就永远在寄存器里的想法。这个想法是不对的。每个变量都有可能被交换出来,只根据当前的时机。例如你有32个float(记为变量a到z), 如果程序的前1/3段落,其中的变量c,d,e,f被频繁的使用,则他们具有很大的可能不被交换出来到local memory,而较少使用的变量(a,b以及g到z)则可能更容易被交换出来。而当您运行到您的kernel的后面的1/3段落的时候,可能频繁访问的那些变量变了,变成了x,y,z,那么此时xyz将不容易被交换出来, 而之前的那些老的曾经被频繁使用的变量却又容易被交换出来了。
所以您的永远一个变量总是在寄存器里的想法可能不当,是否交换要看当前的寄存器紧张情况,以及,大家的频繁使用程度,则是编译器为了性能而考虑的。而编译器不能为了迎合您的要求就改变了它的初衷。(当然,如果您的寄存器够用,且都能放进去,那么自然编译器也不会故意给您交换出来的)
某些竞争性的并行计算环境(例如OpenCL), 将CUDA的寄存器和local memory,并称为private memory, 而不做具体区分,您也可以多少看出一点。
请您思索。
system
4
我是安装cuda5.5,安好了就有profiler和nsight monitor
system
6
你网页打不开是不是浏览器的缘故,按理说安装了cuda 5.5就有,profiler是cuda toolkit的一部分
xingoo您好:
visual profiler中的timeline上可以直观看到用时。
祝您好运~