run:
g++ avx512.cpp -o avx512.exe -mavx512f && ./avx512.exe
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;
}
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