Makefile

 run:
        g++ avx512.cpp -o avx512.exe -mavx512f && ./avx512.exe

avx512.cpp

Demo näyttää että on olemassa turvallinen ja vaarallinen tapa täyttää numerovektori. Sitten käsky _mm256_sqrt_ps käsky laskee 8 luvun neliöjuuren samalla kellojaksolla. Doublena voi laskea 4 kpl.

#include<iostream>
#include<iomanip>
#include<immintrin.h>

using namespace std;


int main()
{
    cout << "Avx256 tests, double ja single\n";


    __m256d A = { 1.0, 2.0, 3.0, 4.0};
    __m256 Afloat = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0}; // vaarallinen jos yksi puuttuu
    __m256 Xfloat = _mm256_set_ps(8,7,6,5,4,3,2,1); // turvallisempi


    // __m512d B = { 10.1, 10.0, 30.0, 40.0, 5.0, 60.0, 70.0, 80.0 };
    __m256d B = _mm256_set1_pd(2.0); // All elements = 2.0
    __m256d Cdbl{};   // tulos
    __m256 Cfloat{}; // tulos float

    double* ptr2C = (double*) &Cdbl;
    float* ptr2Cf = (float*) &Cfloat;

    cout << "double (13 desimaalia oikein) sqrt\n" << setprecision(13);
    Cdbl = _mm256_sqrt_pd(A);
    for (int i = 0; i < 4; i++) cout << ptr2C[i] << endl;
    cout << endl;


    cout << "float (6 desimaalia oikein) sqrt\n";
    Cfloat = _mm256_sqrt_ps(Afloat);
    for (int i = 0; i < 8; i++) cout << ptr2Cf[i] << endl;
    cout << endl;

    cout << "Xfloat sqrt\n";
    Cfloat = _mm256_sqrt_ps(Xfloat);
    for (int i = 0; i < 8; i++) cout << ptr2Cf[i] << endl;
    cout << endl;

    return 0;
}

Output

Avx256 tests, double ja single
double (13 desimaalia oikein) sqrt
1
1.414213562373
1.732050807569
2

float (6 desimaalia oikein) sqrt
1
1.41421353817
1.732050776482
2
2.23606801033
2.449489831924
2.645751237869
0

Xfloat sqrt
1
1.41421353817
1.732050776482
2
2.23606801033
2.449489831924
2.645751237869
2.82842707634