Opencl 浮动VS浮动

Opencl 浮动VS浮动,opencl,Opencl,在OpenCL中使用floatN代替float有什么优势吗 比如说 float3 position; 及 谢谢我对OpenCL不太熟悉,但在GLSL中,使用向量进行数学运算更有效,因为GPU可以同时对所有N个组件应用相同的操作。此外,在GLSL中,向量还支持像点积这样的操作,作为内置语言功能。这取决于硬件 NVidia GPU有一个标量架构,所以向量在它们上比编写纯标量代码没有什么优势。引用(PDF链接): CUDA体系结构是一种标量体系结构。因此,没有性能 使用向量类型和指令的好处。这些应仅

在OpenCL中使用floatN代替float有什么优势吗

比如说

float3 position;


谢谢

我对OpenCL不太熟悉,但在GLSL中,使用向量进行数学运算更有效,因为GPU可以同时对所有N个组件应用相同的操作。此外,在GLSL中,向量还支持像点积这样的操作,作为内置语言功能。

这取决于硬件

NVidia GPU有一个标量架构,所以向量在它们上比编写纯标量代码没有什么优势。引用(PDF链接):

CUDA体系结构是一种标量体系结构。因此,没有性能 使用向量类型和指令的好处。这些应仅用于 方便。通常,拥有更多的工作项比使用更少的工作项更好 大向量

有了CPU和ATI GPU,您将从使用矢量中获得更多好处,因为这些体系结构都有矢量指令(尽管我听说最新的Radeons上可能会有不同的指令-希望我有一个链接到我阅读这篇文章的地方)

引用CPU的(PDF链接):

CPU(SSE)中的SIMD浮点资源需要使用 矢量化类型(float4),用于生成和提取压缩SSE代码 SIMD硬件具有良好的性能


在ATI GPU上提供用矢量写入的内核与纯标量类型的性能比较。

在Nvidia和AMD体系结构中,内存被划分为128位的内存组。通常,对于内存控制器而言,读取单个float3或float4值要比读取3个单独的float更快

当您从连续的内存地址读取浮点值时,您在很大程度上依赖于编译器来组合读取。不能保证posX、posY和posZ在同一银行。将其声明为float3通常会强制组件浮动的位置位于同一组中


GPU处理矢量计算的方式因供应商而异,但这两种平台上的内存访问都将受益于矢量化。

AMD最新的“Graphics Core Next”(又名GCN)体系结构为Radeon HD 7900系列提供动力,该体系结构使用16宽SIMD作为基本计算单元,所以仍然有很好的理由使用向量类型。感谢你们所有人的回答:)@user57368:事实上,据我所知,GCN与NVidia的做法相同,只向程序公开了标量架构,因此没有任何理由在那里使用向量类型。毕竟NVidia在费米上也使用了16个宽SIMD单元,但它们作为16个标量单元公开。因此,这将大大降低GPU上矢量类型的可用性(并使nvidia和amd的编程更加紧密,这是一件好事)。GCN计算单元的唯一标量部分是处理分支和超越函数的特殊函数单元。基本ALU以16块为单位,所有ALU同时运行同一条指令。如果您不使用向量类型,那么您就依赖于编译器能够适当地调度指令和展开循环以获得充分利用。显式使用向量类型不会有什么坏处,只会使编译器的工作更容易。@user57368:从我所读到的gcn中,它与nvidia的做法相同,并公开了标量架构(其中16个线程(或更多线程)遵循相同的执行路径)。我从来没有说过底层架构是标量的(同样,费米被编程为标量,但使用16宽simd)。编译器不会为此执行任何调度/展开,因为每个线程基本上都在计算simd块的一个数据元素。因此,使用vectortypes(特别是16宽)不太可能使编译器的工作变得更容易,而且实际上会增加寄存器压力,从而损害性能。我认为这可能是真的,尽管nvidia在声明使用矢量指令没有任何好处时的意思有所不同。但是,当您说使用float3/float4时,组件的位置属于同一组时,您有备份吗?这不也取决于编译器吗?当然取决于编译器。尽管我想不出编译器/驱动程序会使向量类型变慢的原因。很多像素类型的大小都是3或浮动,GPU至少需要为此进行优化。我同意,如果你有具体的证据,比如一些实验,我想知道。
float posX, posY, posZ;