GCC эквивалент для m256_f32

У меня есть такой код AVX C ++, который прекрасно компилируется в Visual Studio 2010:

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

int main() {
float data[] = {0, 1, 2, 3, 4, 5, 6, 7};
__m256 ymm0 = _mm256_loadu_ps(data);
// ..
float r0 = ymm0.m256_f32[0];
float r4 = ymm0.m256_f32[4];
std::cout << r0 << " " << r4 << std::endl;
}

GCC, однако, выдает следующую ошибку:

foo.cpp:8:18: error: request for member ‘m256_f32’ in ‘ymm0’, which is of non-class type ‘__m256 {aka __vector(8) float}’
foo.cpp:9:18: error: request for member ‘m256_f32’ in ‘ymm0’, which is of non-class type ‘__m256 {aka __vector(8) float}’

Я провел некоторое исследование, и кажется, что ymm0.m256_f32 это специальная инструкция Microsoft для извлечения отдельных чисел из длинного регистра AVX. Но что я могу использовать для gcc / linux, чтобы сделать то же самое?

3

Решение

GCC может индексировать векторы на языке C, но не на C ++. Вы можете переписать небольшие части кода как C.

Другой вариант — явно использовать встроенные функции shuffle, extract и translation — _mm256_shuffle_pd, _mm256_extractf128_pd, _mm_cvtsd_f64,

4

Другие решения

После @chill я нашел два следующих решения этой конкретной проблемы. Решение C ++:

#include <immintrin.h>
#include <iostream>
int main() {
float data[] = {0, 1, 2, 3, 4, 5, 6, 7};
__m256 ymm0 = _mm256_loadu_ps(data);
// ..
__m128 low = _mm256_extractf128_ps (ymm0, 0); // extracts lower half
__m128 high = _mm256_extractf128_ps (ymm0, 1);// extracts upper half
float r0 = _mm_cvtss_f32 (low);  // extracts lowest float
float r4 = _mm_cvtss_f32 (high);  // extracts lowest float
std::cout << r0 << " " << r4 << std::endl;
}

И решение в простой C:

#include <immintrin.h>
#include <stdio.h>

int main() {
float data[] = {0, 1, 2, 3, 4, 5, 6, 7};
__m256 ymm0 = _mm256_loadu_ps(data);
// ..
float r0 = ymm0[0];
float r4 = ymm0[4];
printf("%f, %f", r0, r4);
}
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector