Загрузить 64-битные целые числа в вектор AVX - PullRequest
0 голосов
/ 27 сентября 2018

Я хочу загрузить вектор __m256 с 64-битными целыми числами.Но я не могу сделать это на Ubuntu 18.04 LTS с gcc 7.3.0

Я скомпилировал его, используя следующую инструкцию

gcc -mavx -o test test1.c

Вот минимальный пример для воспроизведения моей проблемы.Я тоже попробовал с -mavx2 и у меня возникла та же проблема.

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

int main()
{
__m256 avx_sreg;
 uint64_t key;

 avx_sreg = _mm256_castsi256_pd(_mm256_set1_epi64x(key));
}

и я получаю эти ошибки -

error: incompatible types when assigning to type ‘__m256 {aka __vector(8) float}’ from type ‘__m256d {aka __vector(4) double}’
 avx_sreg = _mm256_castsi256_pd(_mm256_set1_epi64x(key));

Когда я использую 32-битные целые числа, я не получаю ошибок компиляции.Вот минимальный пример

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

int main()
{
 __m256 avx_sreg;
 uint32_t key;

 avx_sreg = _mm256_castsi256_ps(_mm256_set1_epi32(key));  
 }

Куда я иду не так?

1 Ответ

0 голосов
/ 27 сентября 2018

Встроенные функции Intel имеют 3 векторных типа (и соответствующие 128- и 512-разрядные версии):

  • __m256: вектор float, используется с _mm..._ps встроенными
  • __m256d: вектор double, используется с _mm..._pd intrinsics
  • __m256i: целочисленный вектор, неопределенная ширина элемента.(Программист может смешивать и сопоставлять различные операции ширины элемента полезными способами.) Используется с _mm..._epi8/16/32/64 (упакованное целое число с элементами) или _mm..._si256 (без значимых границ элементов, например, xor)

Таким образом, для целочисленных векторов есть только один тип, но для векторов FP есть 2 разных типа.В asm они используют одни и те же регистры, но, как и для скалярных типов, существуют разные типы для разных интерпретаций.

Как только вы это поймете, сообщение об ошибке самоочевидно:

error: incompatible types when assigning to type ‘__m256 {aka __vector(8) float}’ from type ‘__m256d {aka __vector(4) double}’

Правая часть задания дала вам вектор __m256d, но вы пытаетесь присвоить его переменной __m256.

Предположительно, вы хотите __m256d avx_sreg = blah blah_pd, поэтому у вас есть64-битные double элементы, соответствующие вашим 64-битным целым числам.

...