用户
 找回密码
 立即注册
wch8802 该用户已被删除
发表于 2013-10-10 14:14:47
4520743
有时候我在分配数据到寄存器时,希望通过一些专业软件查看这些数据是否分配到我希望的寄存器或者事与愿违分配到局部存储器从而导致性能下降,请问visual profiler和nsight monitor哪个软件能提供这样的功能,并且如何操作?
使用道具 举报 回复
发表于 2013-10-10 14:18:58
你无需操心这个:

(1)如果有可能,编译器总是安排到寄存器的。
(2)如果真的无法安排到寄存器,你也不能强迫它安排到寄存器。
(3)请ICE补充。

感谢来访。
使用道具 举报 回复 支持 反对
发表于 2013-10-10 14:24:06
LZ您好:

我来补充一下2#玫瑰斑竹。

如果您没有在kernel里面使用非常多的变量,以至于必须同时使用的变量超过了一个线程所能使用的寄存器数量,以及您没有在kernel里面定义下标访问规律在编译时无法得知的数组,那么一般都会将变量放置在寄存器中的,以及如玫瑰斑竹所说,真的放不进去,你也没其他办法,只能修改您的实现。

您在nvvp的profile结果中可以看到local memory传输的统计,如果该项统计不为零,说明您的代码用到了local memory。

大致如此,祝您好运~
使用道具 举报 回复 支持 反对
发表于 2013-10-10 15:02:07
本帖最后由 wch8802 于 2013-10-10 15:03 编辑
ice 发表于 2013-10-10 14:24
LZ您好:

我来补充一下2#玫瑰斑竹。

“如果您没有在kernel里面使用非常多的变量,以至于必须同时使用的变量超过了一个线程所能使用的寄存器数量,以及您没有在kernel里面定义下标访问规律在编译时无法得知的数组”还是不太懂你的意思。

1.您第一句是不是应该这样写道““如果您(没有)在kernel里面使用非常多的变量,以至于必须同时使用的变量超过了一个线程所能使用的寄存器数量”,多写了两个字“没有”。
2.其次如何定义下标访问规律才能使得数组分配到寄存器。
3.local memory传输统计在visual profiler哪里能看到?我只看到了timeline。
使用道具 举报 回复 支持 反对
发表于 2013-10-10 15:12:54
wch8802 发表于 2013-10-10 15:02
“如果您没有在kernel里面使用非常多的变量,以至于必须同时使用的变量超过了一个线程所能使用的寄存器数 ...

LZ您好:

我来把第一句改成短句重新说一下:

1:如果您的kernel里面使用了非常多的变量,经过编译器尽可能安排以后,同时需要使用的变量依然超过一个线程所能使用的最大寄存器的数量,那么会有部分变量被放置到local memory。
2:如果您在kernel里面定义了数组,并且这个数组里面的元素的下标访问规律在编译的时候无法得知(即在运行的时候才能知道),那么该数组将被放置到local memory(反之会根据已知的下标访问规律安排使用编译器)。

如果不是上述的1:,2:两种情况,那么一般编译器会安排使用寄存器。
使用道具 举报 回复 支持 反对
发表于 2013-10-10 15:17:26
wch8802 发表于 2013-10-10 15:02
“如果您没有在kernel里面使用非常多的变量,以至于必须同时使用的变量超过了一个线程所能使用的寄存器数 ...

关于您的问题2:

这个只需要在编译的时候就知道各个元素的具体行为。
比如
a[0]=.....;
a[1]=.....;
这种在编译的时候可以直接知道下标的访问规律,那么虽然逻辑上是一个数组,实际编译器会安排多个寄存器使用,和直接使用多个变量是一样的。

而如果a[x]=....;且x是运行时才知道的数(比如传入参数或者依赖于运行时得到的数据才能确定的数),那么在编译时编译器无法确定这究竟是哪个元素的行为,同时N卡的寄存器不支持寻址,所以只能放置在lobal memory中。

使用道具 举报 回复 支持 反对
发表于 2013-10-10 15:23:35
wch8802 发表于 2013-10-10 15:02
“如果您没有在kernel里面使用非常多的变量,以至于必须同时使用的变量超过了一个线程所能使用的寄存器数 ...

关于您的第三个问题:

您可以选择Analyze All(在界面的左下角),分析完成以后,看下面的Details选项卡即可看到local memory相关的项。

或者在timeline中选定一个kernel,然后在右侧的Properties中看。

如果不为0%,那说明使用了local memory。

祝您好运~
使用道具 举报 回复 支持 反对
发表于 2013-10-10 15:27:44
ice 发表于 2013-10-10 15:17
关于您的问题2:

这个只需要在编译的时候就知道各个元素的具体行为。

您好,您的意思是说对数组元素分别赋值,编译器就知道了数组元素的访问规律,那么为什么不能有for循环赋值呢,如果我申请了100个浮点型数组,分别赋值太麻烦了。
使用道具 举报 回复 支持 反对
发表于 2013-10-10 15:30:22
本帖最后由 wch8802 于 2013-10-10 15:33 编辑
ice 发表于 2013-10-10 15:23
关于您的第三个问题:

您可以选择Analyze All(在界面的左下角),分析完成以后,看下面的Details选项卡 ...

分别有两个关于local memory的选项,一个是local load(store) transactions,另一个是local load(store),分别指的是什么?
使用道具 举报 回复 支持 反对
发表于 2013-10-10 15:33:53
wch8802 发表于 2013-10-10 15:27
您好,您的意思是说对数组元素分别赋值,编译器就知道了数组元素的访问规律,那么为什么不能有for循环赋 ...

LZ您好:

我没说不能用for的,上面那个只是一个简单举例而已。
以及,在kernel内部包括初始化赋值在内的所有的对数组元素的访问,如果在编译的时候就知道具体是那个元素执行哪些确定的操作,那么会安排使用寄存器。

这都是编译器判断之后决定的。
使用道具 举报 回复 支持 反对
12345下一页
发新帖
您需要登录后才可以回帖 登录 | 立即注册