首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未知类型名称__m256 -英特尔本质为AVX未被识别?

未知类型名称__m256 -英特尔本质为AVX未被识别?
EN

Stack Overflow用户
提问于 2016-07-29 15:19:58
回答 2查看 9.3K关注 0票数 7

我试着测试一些英特尔Intrinsics,看看它们是如何工作的。因此,我为自己创建了一个函数,这是代码:

代码语言:javascript
复制
void test_intel_256()
{
__m256 res,vec1,vec2;

__M256_MM_SET_PS(vec1, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0);
__M256_MM_SET_PS(vec1, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0);

__M256_MM_ADD_PS(res,vec1,vec2);

if (res[0] ==9 && res[1] ==9 && res[2] ==9 && res[3] ==9 
  && res[4] ==9 && res[5] ==9 && res[6] ==9 && res[7] ==9 )
    printf("Addition : OK!\n");
else
    printf("Addition : FAILED!\n");
}

但我会发现这些错误:

代码语言:javascript
复制
error: unknown type name ‘__m256’
error: subscripted value is neither array nor pointer nor vector
error: subscripted value is neither array nor pointer nor vector 
error: subscripted value is neither array nor pointer nor vector
error: subscripted value is neither array nor pointer nor vector
error: subscripted value is neither array nor pointer nor vector
error: subscripted value is neither array nor pointer nor vector
error: subscripted value is neither array nor pointer nor vector
error: subscripted value is neither array nor pointer nor vector
error: subscripted value is neither array nor pointer nor vector

这意味着编译器没有识别__m256类型,因此不能将res看作是浮点数数组。我包括这些库mmintrin.hemmintrin.hxmmintrin.h,我使用的是月食火星

所以我想知道的是这个问题是来自编译器还是硬件,还是别的什么?我该怎么解决呢?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-29 15:56:45

MMX和SSE2是x86-64的基线,但AVX不是。您确实需要专门启用AVX,而不是针对SSE2的。

使用-march=haswell或任何您实际拥有的CPU进行构建。或者只使用-mavx

请注意,使用默认tune=generictune=generic将256 b加载/存储的本质拆分为vmovups xmm / vinsertf128,如果数据大部分时间实际上是对齐的,这是不好的,尤其是在哈斯韦尔,因为杂乱端口吞吐量有限。

不过,如果你的数据真的是不对齐的话,这对沙桥和推土机家族是有好处的。参见bug.cgi?id=80568:它甚至会影响AVX2向量-整数代码,即使所有AVX2 CPU(挖掘机和Ryzen除外)都受到此调优的伤害。tune=generic没有考虑启用了什么指令集扩展,也没有tune=generic-avx2.

你可以用-mavx2 -mno-avx256-split-unaligned-load -mno-avx256-split-unaligned-store。这仍然不能支持所有现代x86 CPU(低功耗CPU除外)的其他调优选项(比如优化比较和分支的宏融合),但gcc的tune=generic没有启用这种优化选项。(bug.cgi?id=78855)。

另外:

我包括这些库mmintrin.h,emmintrin.h,xmmintrin.h

别干那事。SIMD码。它吸引了所有的英特尔SSE/AVX扩展。这就是为什么你会得到error: unknown type name ‘__m256’

请记住,订阅向量类型lie __m256是非标准的和不可移植的。它们不是数组,您没有理由期望[]像数组一样工作。从寄存器中的SIMD向量中提取第三个元素或其他内容需要一个洗牌指令,而不是负载。

如果您希望使用方便的向量类型包装器,让您可以使用operator[]从向量变量的元素中提取标量,请查看Agner的向量类库。它是GPLed,所以如果这是一个问题,您必须查看其他包装器库。

它让你做类似的事情

代码语言:javascript
复制
// example from the manual for operator[]
Vec4i a(10,11,12,13);
int b = a[2];   // b = 12

您可以在类型的VCL上使用普通的本质。Vec8f__m256上的透明包装器,所以您可以将它与_mm256_mul_ps一起使用。

票数 12
EN

Stack Overflow用户

发布于 2017-07-10 13:36:35

试试这个

res=_MM_ADD_PS(vec1,vec2);因为__M256_MM_ADD_PS的原型是

__m256 _MM_ADD_PS(__m256,__m256);

它以两个__m256数据类型作为参数,并将它们的和作为__m256数据返回,如下所示

int添加(int,int);

用于初始化

vec=_MM_setr_PS(7.0,7.0,7.0,7.0,7.0,7.0,7.0,7.0)或

vec =_MM_LOAD_PS(&arr)或

vec =_MM_LOAD_PS(ptr)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38662287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档