为什么维度顺序会对性能产生很大影响?

时间:2014-11-13 02:54:51

标签: cuda parallel-processing

要启动CUDA内核,我们使用dim3来指定维度,我认为每个维度的含义是选择用户的,例如,它可能意味着(宽度,高度)或(行, cols),其含义相反。

所以我在SDK中对CUDA示例做了一个实验:3_Imaging / convolutionSeparable,只是在内核函数中交换.x和.y,并反转用于启动内核的块和线程的维度,因此含义发生了变化从昏暗(宽度,高度)/ idx(x,y)到暗淡(行,列)/ idx(行,col)。

结果是相同的,但是,性能下降,原来的一个需要大约26ms,而修改后的一个需要大约40ms在我的机器上(SM 3.0)。

我的问题是,有什么区别?是(行,列)对CUDA不可行吗?

P.S。我只修改了convolutionRows,没有修改了convolutionColumns

编辑:可以找到更改here

1 个答案:

答案 0 :(得分:2)

您的更改至少会产生两种可能的后果:

  1. 首先,您正在将内存访问模式更改为主内存,以便 访问权限与原始案例一样没有合并。

    您应该像以前一样考虑GPU主内存 “CPU”存储器,即预取,阻塞,顺序访问...... 应用技术以获得表现。

    如果您想了解有关此主题的更多信息,请务必阅读 这篇报告。 What every programmer should know about memory。 您将找到行和列专业之间的比较示例 访问那里的矩阵元素。

    为了了解这是多么重要,想想最多 - 如果没有 全GPU高性能代码执行矩阵转置 在进行任何计算之前,为了实现更加合并的内存 访问,仍然这个额外的步骤值得 性能。 (例如,稀疏矩阵运算)

  2. 二。这更加微妙,但在某些情况下,它会对内核的性能产生深远的影响;启动配置。发射20个10个线程的块与启动10个20个线程的块不同。线程需要的资源量(共享内存,寄存器数量......)有很大差异。线程需要的资源越多,可以在单个SM上映射较少的warp,从而减少占用...以及最少的时间性能。 这不适用于您的问题,因为块数等于线程数。

  3. 为GPU编程时,您必须了解体系结构,以便了解更改将如何修改性能。当然,我不熟悉这些代码,因此这两个代码中还有其他因素。