在OpenCL中使用floatN代替float是否有任何优势?
例如
float3 position;
和
float posX, posY, posZ;
谢谢
答案 0 :(得分:8)
这取决于硬件。
NVidia GPU具有标量架构,因此与仅编写纯标量代码相比,向量几乎没有优势。引用NVidia OpenCL best practices guide(PDF链接):
CUDA架构是一种标量架构。因此,没有表现 受益于使用矢量类型和指令。这些应该只用于 方便。一般来说,拥有更多的工作项目比使用更少的工作项目更好 大型载体。
使用CPU和ATI GPU,您将从使用向量中获得更多好处,因为这些架构具有向量指令(虽然我听说在最新的Radeons上可能有所不同 - 希望我有一个链接到我读过这篇文章的文章)。
为CPU指定ATI Stream OpenCL programming guide(PDF链接):
CPU(SSE)中的SIMD浮点资源需要使用 向量化类型(float4)以启用打包的SSE代码生成和提取 SIMD硬件的良好性能。
This article提供了使用向量与纯标量类型编写的内核的ATI GPU的性能比较。
答案 1 :(得分:2)
在Nvidia和AMD架构中,内存分为128位的存储区。通常,读取单个float3或float4值对于内存控制器来说要比读取3个单独的浮点数更快。
当您从连续的内存地址中读取浮点值时,您在很大程度上依赖于编译器来为您组合读取。无法保证posX,posY和posZ属于同一个银行。将其声明为float3通常会强制组件浮点的位置落在同一个库中。
GPU如何处理向量计算因供应商而异,但两个平台上的内存访问都将受益于向量化。
答案 2 :(得分:1)
我对OpenCL并不十分熟悉,但在GLSL中使用向量进行数学运算更有效率,因为GPU可以同时对所有N个组件应用相同的操作。此外,在GLSL矢量中,还支持点积等操作作为内置语言功能。