2

我正在尝试在内核中使用几个长度相同的双精度数组。我知道我可以在 .cl 文件中定义一个包含多个双精度数的结构,而不是将每个 double* 作为单独的参数传递,然后将一个指针传递给内核,以代替结构数组。

两种方式的性能会有所不同吗?如果我错了,请纠正我,但我认为传递单个双指针意味着可以合并访问。访问结构也会被合并吗?

4

3 回答 3

0

只要您的结构不包含任何指针,您所说的就是绝对可能的。正如您已经考虑过的,主要影响通常是对内存操作合并的影响。影响有多大取决于您的内存访问模式、结构的大小和正在运行的设备。需要更多细节来更全面地描述这一点。

话虽如此,我以这种方式非常成功地使用结构的一个实例是,正在读取的元素对于工作组中的所有工作项都是相同的。在这种情况下,我的硬件(nvidia GTX 570)不会受到任何影响。另外值得记住的是,在某些情况下,由被序列化的内存操作引入的额外延迟可以被隐藏。在 CUDA 世界中,这将通过对具有高算术强度的问题具有高占用率来实现。

最后值得指出的是,使用结构的语义清晰性本身就有好处。您必须根据您的特定问题的任何性能成本来考虑这一点。我的建议是试试看;很难提前预测这些问题的影响。

于 2013-08-02T09:00:03.950 回答
0

理论上是一样的表现。但是,如果您更频繁地访问某些成员,由于 cpu 缓存局部性,使用多个 segregatedvarray 将具有更高的性能。但是,当您有多个数组时,大多数操作会更加困难。

于 2015-09-05T16:49:09.290 回答
-1

结构和单个元件将具有完全相同的性能。假设你有一个大数组,第一个工作项使用 0、100、200、300,...,下一个使用 1、101、201、301,...

如果你有 100 个双精度的结构,在内存中第一个结构将是第一个(0-99),然后是第二个(100-199),依此类推。内核将在相同的地方访问完全相同的内存,唯一的区别是您如何定义内存抽象。

在具有不同元素类型(char、int、double、bool,...)的结构的更一般的情况下,对齐可能不像是单个数据数组。但它仍将是“半合并”的。我什至敢打赌性能还是一样的。

于 2013-08-02T12:08:23.503 回答