我是 AVX 编程的新手。我想加载一个__m256带有 16 个短整数或 16 位值的向量,但我无法这样做。
这是我的尝试。它给出了以下错误:
使用类型 'int' 初始化类型 '__m256' 时类型不兼容 __m256 result = _mm256_load_epi16((__m256*)&int_array);
#include <stdio.h>
#include <stdint.h>
#include <immintrin.h>
int main() {
int i;
short int int_array[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
__m256 result = _mm256_load_epi16((__m256*)&int_array);
short int* res = (short int*)&result;
printf("%d %d %d %d %d %d %d %d\n", res[0], res[1], res[2], res[3], res[4], res[5], res[6], res[7]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
__m256i integer_vector = _mm256_load_si256((__m256*)int_array);
Run Code Online (Sandbox Code Playgroud)
三个问题:
_mm256_load_epi16,该警告不存在。这就是为什么它抱怨__m256i从int.int_array已经是指向第一个元素的指针。 &int_array是一个指向指针的指针。你不想加载那个。__m256是 8 个浮点数的向量。你要__m256i。(内在函数区分整数、浮点数和双向量。这与 asm 指令匹配:使用整数向量运算的结果作为 FP 向量运算的输入(反之亦然)会导致额外的旁路延迟延迟。这会停止你从随意/不小心对整数数据使用 FP shuffle。有时它仍然值得,这就是为什么__m128 _mm_castsi128_ps(__m128i)存在这样的函数。)对于具有不同整数元素大小的加载/存储,没有单独的内在函数。这就是为什么您总是必须将那些烦人的强制转换写入(__m256i*). (AVX512 内在函数将采用void*args,这是一个更好的设计 IMO。)
英特尔的内在函数查找器 ( https://software.intel.com/sites/landingpage/IntrinsicsGuide/ ) 将帮助您找到所需的功能。另请参阅sse tag wiki 以获取指南,x86 tag wiki 有很多好东西。
第四个问题:你没有对齐你的数组,所以使用对齐加载的内在函数是不安全的。您可以改用loadu内在函数。
short int* res = (short int*)&result;是个坏主意。不要将指针别名到向量上。将向量指针别名到数组上是可以的,因为它__m256i是用“可能别名”属性定义的。但取消引用(short int*)&result是 C/C++ 未定义行为,不会做你想做的事(理论上或实践中)。
存储到临时数组,使用_mm_extract_epi16或使用联合进行类型双关。
| 归档时间: |
|
| 查看次数: |
3903 次 |
| 最近记录: |