float VS floatN

时间:2012-01-19 21:33:11

标签: opencl

在OpenCL中使用floatN代替float是否有任何优势?

例如

float3 position;

float posX, posY, posZ;

谢谢

3 个答案:

答案 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矢量中,还支持点积等操作作为内置语言功能。