Intel Intrinsic: Load interleaved float32



我的RAM包含以下交错数据:float32 Real1, float32 Imag1, float32 Real2, float32 Imag2,…, float32 Real4, float32 Imag4

我必须加载到__m128: Real1, Real2, Real3, Real4和另一个__m128: Imag1, Imag2, Imag3, Imag4

可能吗?

假设您将数据存储在数组中

struct complex_t {
float32_t re;
float32_t im;
};
complex_t complex_array[N];

要向量化它,您需要执行两个加载:

__m128 complex0 = _mm_loadu_ps(complex_array + i);
__m128 complex1 = _mm_loadu_ps(complex_array + i + 2);

每个向量寄存器包含两个复数[x0, y0, x1, y1]。

使用_mm_shuffle_ps

__m128 re = _mm_shuffle_ps(complex0, complex1, _MM_SHUFFLE(0, 2, 0, 2));
__m128 im = _mm_shuffle_ps(complex0, complex1, _MM_SHUFFLE(1, 3, 1, 3));

请记住,根据您的用例,您不需要在向量寄存器中去除交错数据。例如,复数加法不需要去交错。利用_mm_addsub_ps内禀函数可以实现复乘法。

最新更新