我正在尝试在内核中使用几个长度相同的双精度数组。我不知道将每个double *作为一个单独的参数传递,我知道我可以在.cl文件中定义一个包含几个双精度的结构,然后只是将一个结构数组传入内核的指针。
两种方式的表现会有所不同吗?如果我错了,请纠正我,但我认为传递单个双指示意味着可以合并访问。访问结构也会合并吗?
答案 0 :(得分:0)
只要您的结构不包含任何指针,您所说的绝对可能。正如您已经考虑过的那样,主要影响通常是它对内存操作的合并产生的影响。对您的内存访问模式,结构的大小以及您正在运行的设备的影响有多大。需要更多细节来更全面地描述这一点。
说,我以这种方式非常成功地使用结构的一个实例是正在读取的元素对于工作组中的所有工作项是相同的。在这种情况下,我的硬件(nvidia GTX 570)没有任何损失。另外值得记住的是,在某些情况下,可以隐藏被序列化的内存操作引入的额外延迟。在CUDA世界中,这可以通过对高算术强度的问题具有高占用率来实现。
最后值得指出的是,使用结构的语义清晰度本身就具有优势。您必须针对特定问题的任何性能成本考虑这一点。我的建议是尝试看看;很难提前预测这些问题的影响。
答案 1 :(得分:0)
理论上它是相同的表现。但是,如果您更频繁地访问某些成员,由于cpu缓存局部性,使用多个segregatedvarrays会有更多的性能。但是,如果有多个阵列,大多数操作都会更加困难。
答案 2 :(得分:-1)
结构和单个元素将具有完全相同的性能。 你有一大堆双打,第一个工作项使用0,100,200,300 ......,下一个工作项使用1,101,201,301,......
如果你有100个双打的结构,在内存中第一个结构将是第一个(0-99),然后是第二个结构(100-199),依此类推。内核将完全相同的内存和相同的位置,唯一的区别是你如何定义内存抽象。
在具有不同元素类型(char,int,double,bool,...)结构的更通用的情况下,可能会发生对象不像是单个数据数组。但它仍将是半合并的#34;我甚至打赌表演仍然是一样的。