我的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
内禀函数可以实现复乘法。