繁体   English   中英

如何在特定位置的__m128i中加载字节

[英]How to load bytes in a __m128i in a specific position

我需要在__m128i变量的特定位置加载连续存储在数组中的4个字节,即能够一次执行多次int32_t和,存储所有部分结果,每次4个。

例如:

const unsigned int SIZE = 2000000;
const unsigned int STEP = 100;

unsigned char* inBuffer = new char[SIZE];
//Fill inBuffer
const unsigned char* a = inBuffer;

int32_t* outBuffer = new int32_t[SIZE/STEP*4];
int32_t* result = outBuffer;

__m128i sum = _mm_setzero_si128 ()
for (int i = 0; i < SIZE; i+=STEP) {
    __m128i value = _mm_set_epi32 (a[3],a[2],a[1],a[0]);
    sum = __mm_add_epi32(sum,value);
    _mm_storeu_si128 ((__m128i*)result,sum);
    a+=STEP;
    result+=4;
    }

//Print outBuffer

delete[] inBuffer;
delete[] outBuffer;

我想知道是否有更有效的方法

当然,这里的主要问题是以下行:

__m128i value = _mm_set_epi32 (a[3],a[2],a[1],a[0]);

但是,一个不错的编译器应该为此生成相当有效的代码。 看一下输出( gcc -O3 -S ... )-如果不止几个指令,那么您可能要考虑自己进行装载/拆包操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM