【发布时间】:2015-05-27 20:03:17
【问题描述】:
我有一个由 32 个字节组成的数组。我需要从这个数组中构建 8 个 4 字节整数。例如 0x00,0x11,0x22,0x33 8bit int 需要是一个 0x00112233 32bit int。 我决定使用 AVX 指令,因为我可以使用一个命令将整个数组加载到寄存器中。
我写的代码:
#include <stdio.h>
#include "immintrin.h"
typedef unsigned int uint32_t;
typedef unsigned char uint8_t;
main() {
const uint8_t block[32] __attribute((aligned(32))) = {
0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff
,0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff
};
uint32_t m[8] __attribute((aligned(32)));
__m256i ymm9 = _mm256_set_epi8(
block[ 0],block[ 1],block[ 2],block[ 3],block[ 4],block[ 5],block[ 6],block[ 7],
block[ 8],block[ 9],block[10],block[11],block[12],block[13],block[14],block[15],
block[16],block[17],block[18],block[19],block[20],block[21],block[22],block[23],
block[24],block[25],block[26],block[27],block[28],block[29],block[30],block[31]);
_mm256_store_si256(&(m[0]),ymm9);
int i;
for(i=0;i<32;++i) printf("i=%d, 0x%02x\n",i,block[i]);
for(i=0;i<8;++i) printf("i=%d, 0x%08x\n",i,m[i]);
}
您认为它在性能方面是最佳的吗?能不能做得更好,跑得更快?我使用 Linux @x86_64 和 gcc 4.8.2。
我是英特尔内在函数领域的初学者。感谢您的帮助。
【问题讨论】:
-
pre meture 优化,只是 memcpy
-
为什么不使用简单的位移?
-
您确定要使用大端语义吗?
-
我希望你真的是想让数据反转,因为如果它应该是正确的方法,这实际上是微不足道的(无操作,只需投射指针)。
-
user3528438:memcpy 不起作用 - 这是我的第一个想法。 GRC:我不知道怎么做 :-( chqrlie&harold:是的,我确定。
标签: c intrinsics avx