我有个代码,用avx2的接口,很简单,就是用一个向量index从一个数组里取值
但debug版本返回是对的,-O3返回就不对,-O2也不对
不知道什么原因?
补充一下,如果把ss改成unit32_t,那就两个版本都是正常的
我看intel的文档上的伪代码,感觉应该是可以支持取单字节或者双字节整形的,不知道是哪里不对
#include <vector>
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <immintrin.h>
#include <ctime>
#include <cmath>
template<typename T>
void Dump(const T* data, int len)
{
for(int i=0; i<len; ++i)
{
if(i && i%30 == 0)
printf("\n");
printf("%03d ", data[i]);
}
printf("\n");
}
int main(int argc, char* argv[])
{
int COUNT = 256;
//uint32_t* ss = (uint32_t*)aligned_alloc(64, COUNT*sizeof(uint32_t));
uint8_t* ss = (uint8_t*)aligned_alloc(64, COUNT*sizeof(uint8_t));
for(int i=0; i<COUNT; ++i)
ss[i] = i+1;
Dump(ss, COUNT);
printf("\n");
__m256i f00Index = _mm256_set_epi32(9,1,2,3,5,6,7,8);
__m256i f00 = _mm256_and_si256(_mm256_set1_epi32(0x000000FF), _mm256_i32
gather_epi32((int*)ss, f00Index, sizeof(*ss)));
Dump((int*)&f00, 8);
return 0;
}
按说正常应该返回009 008 007 006 004 003 002 010
但-O3版本返回的一堆乱七八糟的数,还每次运行都不一样,真是服了
makefile
all:
g++ -mavx2 -std=c++11 -o avx a.cpp -O3
debug:
g++ -mavx2 -std=c++11 -o avx a.cpp -g
--
修改:libgcc FROM 171.83.9.*
FROM 171.83.9.*