欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

学习MIPP

程序员文章站 2022-04-20 17:23:05
...

1、 VS中启用指令集;这里我用的VS2019启用AVX512时会编译失败。

学习MIPP

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>()];