学习MIPP
程序员文章站
2022-04-20 17:23:05
...
1、 VS中启用指令集;这里我用的VS2019启用AVX512时会编译失败。
2、这里采用的指令集是AVX2,一个寄存器有256位,每个寄存器的元素数量根据保存的数据类型决定,比如mipp::N<float>等于8,float为32位,则寄存器mipp::Reg<float>可以存8个float数据;mipp::N<double>等于4,double为64位,寄存器mipp::Reg<double>只能存4个double数据。
因为调试时只能看到m256_f32类型为32位的float,采用double类型输出结果时实则两个元素float合为一个真正的double元素。
int f = mipp::N<float>() * 2;
std::vector<float> myVectorF(f);
myVectorF[0] = 555.44;
myVectorF[7] = 555.55;
myVectorF[8] = 555.66;
myVectorF[12] = 555.77;
mipp::Reg<float> r1 = &myVectorF[0 * mipp::N<float>()];
mipp::Reg<float> r2 = &myVectorF[1 * mipp::N<float>()];
mipp::Reg<float> r0;
r0 = r1 + r2;//8个float类型的数据正常需要8个时钟周期,这里向量相加只需要1个时钟周期,
r0.store(&myVectorF[(1) * mipp::N<float>()]);//将值保存到myVectorF的8-16位置上
int db = mipp::N<double>() * 2;
std::vector<double> myVectorD(db);
myVectorD[0] = 555.33;
myVectorD[3] = 555.44;
myVectorD[7] = 555.55;
mipp::Reg<double> r3 = &myVectorD[0 * mipp::N<double>()];
mipp::Reg<double> r4 = &myVectorD[1 * mipp::N<double>()];
上一篇: X86汇编指令详解
下一篇: Unity for易接sdk接入文档