CUDA,在共享内存中存储数据的性能低下

CUDA,在共享内存中存储数据的性能低下,cuda,shared-memory,Cuda,Shared Memory,这是我的问题,为了加快我的项目,我想将内核中生成的值保存到共享内存中,但是,我发现保存该值需要很长时间。如果我删除“此行”(请参阅下面的代码),即删除“此行”,则保存该值的速度非常快(加速100倍!) extern\uuuuuu共享\uuuuuuu int shu\u try[]; __全局无效xxxKernel(…) { 浮子v,e0,e1; 浮动t; 整数计数(0); 对于(…) { v=fetchTexture(); e0=fetchTexture(); e1=fetchTexture()

这是我的问题,为了加快我的项目,我想将内核中生成的值保存到共享内存中,但是,我发现保存该值需要很长时间。如果我删除“此行”(请参阅下面的代码),即删除“此行”,则保存该值的速度非常快(加速100倍!)

extern\uuuuuu共享\uuuuuuu int shu\u try[];
__全局无效xxxKernel(…)
{
浮子v,e0,e1;
浮动t;
整数计数(0);
对于(…)
{
v=fetchTexture();
e0=fetchTexture();
e1=fetchTexture();
t=某些设备功能(v,e0,e1);

如果(t>0.0&&t<1.0)频繁,则较大的性能更改被视为相对较小的代码更改的结果(例如在内核中添加或删除一行代码),性能变化不是由于该行代码的实际性能影响,而是由于编译器做出不同的优化决策,这可能导致内核中大量添加或删除机器代码

帮助确认这一点的一个相对简单的方法是查看生成的机器代码。例如,如果生成的机器代码的大小因添加或删除一行源代码而发生重大变化,则可能是编译器做出的优化决策严重影响了代码

虽然它不是机器代码,但出于这些目的,合理的代理是查看生成的PTX代码,这是编译器创建的中间代码

只需将
-ptx
开关添加到compile命令,即可生成ptx:

nvcc -ptx mycode.cu

这将生成一个名为
mycode.ptx
的文件,您可以对其进行检查。如果您的常规编译命令需要额外的开关(例如-I/path/to/include/files),则很自然然后,此命令可能需要这些相同的开关。
nvcc
提供了有关代码生成选项的更多信息,并且有一个PTX可以帮助您了解PTX,但是您可以根据生成的PTX的大小(例如
.PTX
文件中的行数)大致了解一下.

最有可能的情况是,当您在更改一行代码时看到如此大的速度差异时,这是因为编译器能够优化出一大块代码。因为您的内核只在共享内存中存储数据,所以它没有做任何有用的事。编译器可以检测到这一点,并基本上用空内核替换它。您可以通过使用
nvcc-ptx mycode.cu
查看这两种情况下的代码输出可以看出差异。使用“@name”通知注释者。ptx文件在某种程度上是可读的。要检查的主要内容是函数体。它应该以
.entry\u zxxxxkernelili2eevpj()开头{
。之后,类似汇编程序的代码如下。@stuhlo,谢谢你的回复。也许我应该先弄清楚如何使用nvcc-ptx进行编译。我遇到了一个错误“找不到cutil_inline.h”有什么想法吗?@Robert Crovella,谢谢你的回复。对不起,我是CUDA新手,我可以问一下如何使用nvcc-ptx mycode.cu检查代码输出吗?是的,即使使用global操作,即添加或删除这一行,允许编译器删除代码段。例如,如果没有这一行代码,则无需调用
someDeviceFunction
,因为计算值
t
对代码的行为没有影响。因此编译器可以优化该调用。要比较ptx,只需使用带行和不带行的代码生成ptx,并比较文件长度或指令总数的差异。
nvcc -ptx mycode.cu