SIMD和打包和标量双精度之间的区别

时间:2013-04-25 15:20:22

标签: c++ x86 sse simd intrinsics

我正在阅读英特尔的内在指南,同时实施SIMD支持。我有一些困惑,我的问题如下。

  1. __m128 _mm_cmpeq_ps (__m128 a, __m128 b)文档说它用于比较打包的单精度浮点数。 “打包”是什么意思?在使用它之前,我是否需要以某种方式打包我的浮动值?

  2. 对于双精度,有像_mm_cmpeq_sd这样的内在函数,这意味着比较“较低”的双精度浮点元素。低和高双精度elemtns是什么意思?我可以使用它们来比较C ++ double类型元素的向量吗?或者在比较它们之前是否需要以某种方式处理它们?

2 个答案:

答案 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位)。