【发布时间】:2015-01-10 02:35:30
【问题描述】:
为了启动一个 CUDA 内核,我们使用dim3 来指定维度,我认为每个维度的含义是用户可以选择的,例如,它可以表示 (width, height) 或 (rows, cols) ,意思相反。
于是我对SDK中的CUDA示例做了一个实验:3_Imaging/convolutionSeparable,简单地在内核函数中交换.x和.y,并且反转用于启动内核的块和线程的维度,所以含义发生了变化从 dim(width, height)/idx(x, y) 到 dim(rows, cols)/idx(row, col)。
结果是一样的,但是性能下降了,在我的机器(SM 3.0)上,原来的大约需要26ms,而修改后的大约需要40ms。
我的问题是,有什么不同? (rows, cols) 对 CUDA 不可行吗?
附:我只修改convolutionRows,没有convolutionColumns
编辑:可以在here找到更改。
【问题讨论】:
-
你的内核启动配置是什么?
-
@kronos,它们被转置了,例如dim3(a, b) 变为 dim3(b, a)。
-
我对引用的代码不熟悉,但是一般来说这种线程块配置转置是和内存子系统交互的,因为多维线程块是通过特定的方式映射到全局线程索引的.通常,您希望 x 维度中的单位步长与数组元素中的单位步长相对应,以获得最佳性能。我建议使用分析器检查共享和全局内存事件,以深入了解您的特定案例的两种变体。
-
@Jamboree,是的,我从你的问题中得到了这个,但实际数字如何?例如:32x8 将(通常)产生比 8x32 更好的内存访问模式,因为 warp 中的所有线程都将访问合并的全局内存。
-
在更改前后提供您的代码会非常有用,因为就问题而言,我们只能猜测。