我正在阅读英特尔的内在指南,同时实施SIMD支持。我有一些困惑,我的问题如下。
__m128 _mm_cmpeq_ps (__m128 a, __m128 b)
文档说它用于比较打包的单精度浮点数。 “打包”是什么意思?在使用它之前,我是否需要以某种方式打包我的浮动值?
对于双精度,有像_mm_cmpeq_sd
这样的内在函数,这意味着比较“较低”的双精度浮点元素。低和高双精度elemtns是什么意思?我可以使用它们来比较C ++ double
类型元素的向量吗?或者在比较它们之前是否需要以某种方式处理它们?
答案 0 :(得分:21)
在SSE中,128位寄存器可以表示为32位的4个元素。
SSE定义了两种类型的操作;标量和包装。标量操作仅对最不重要的数据元素(位0~31)进行操作,打包操作并行计算所有四个元素。
_mm_cmpeq_sd
只会比较两个操作数的最低有效数据元素(前32位),而_mm_cmpeq_ps
将比较每组32位并行。
如果您使用的是64位双精度数,则可以逐对打包以使用128位空格。这样,_mm_cmpeq_ps
就可以并行地对两个4进行比较。
如果您想一次只进行一次比较,可以使用_mm_cmpeq_pd
比较两个64位双。
请注意,_mm_cmpeq_pd
为SSE2,_mm_cmpeq_ps
为SSE。
答案 1 :(得分:10)
在此上下文中,“packed”表示“将几个相同类型放入一个块中” - 因此“打包单精度浮点”表示存储为128位值的4 * 32位浮点数。
您需要使用各种PACK*
指令将每个值“打包”到寄存器中,或者将数据“打包”在内存中,例如一个(多个)4个浮点值的数组[适当对齐]。
标量表示寄存器的低n
位中的“一个值”(例如,double
将是128位SSE寄存器的低64位)。