未知类型名称__M256-英特尔AVX内部功能无法识别?

Unknown type name __m256 - Intel intrinsics for AVX not recognized?(未知类型名称__M256-英特尔AVX内部功能无法识别?)
本文介绍了未知类型名称__M256-英特尔AVX内部功能无法识别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试测试一些Intel Intrinsic,看看它们是如何工作的。因此,我创建了一个函数来执行此操作,代码如下:

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!
");
else
    printf("Addition : FAILED!
");
}

但我收到以下错误:

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 我正在使用月食火星

所以我想知道的是,问题出在编译器、硬件还是其他方面? 我怎么才能解决这个问题呢? 谢谢!

推荐答案

mmx和sse2是x86-64的基准,但avx不是。您确实需要专门启用AVX,而您没有启用SSE2。

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

请注意,默认设置为tune=genericgcc -mavx会将256b的装入/存储内部划分为vmovups xmm/vinsertf128,如果您的数据在大部分时间内实际上是对齐的,这是不好的,尤其是在洗牌端口吞吐量有限的Haswell上。

不过,如果您的数据确实不一致,这对Sandybridge和Bulldozer家族是有好处的。参见https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80568:它甚至会影响AVX2向量整数代码,即使所有AVX2 CPU(可能除了挖掘机和瑞森)会受到这种调优的影响。tune=generic不考虑启用了哪些指令集扩展,并且没有tune=generic-avx2

您可以使用-mavx2 -mno-avx256-split-unaligned-load -mno-avx256-split-unaligned-store。这仍然不支持所有现代x86 CPU都具有的其他调优选项(如针对比较和分支的宏观融合进行优化)(低功耗CPU除外),但这不是通过GCC的Tune=Generic实现的。(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78855)。


同时:

我将包括这些库mmintrin.h、emmintrin.h、xmmintrin.h

不要那样做。Always just include immintrin.h in SIMD code。它吸引了所有英特尔SSE/AVX扩展。这就是您获得error: unknown type name ‘__m256’

的原因
请记住,下标向量类型是非标准的和不可移植的。它们不是数组,应该期望[]像数组一样工作。从寄存器中的SIMD向量提取第三个元素或其他元素需要无序指令,而不是加载。


如果您想要方便的向量类型包装器,使您可以使用operator[]从向量变量的元素中提取标量,请看一下Agner Fog的Vector Class Library。它是GPLed的,所以如果有问题,您必须查看其他包装库。

它允许您执行以下操作

// example from the manual for operator[]
Vec4i a(10,11,12,13);
int b = a[2];   // b = 12

您可以对VCL类型使用普通内部函数Vec8f__m256上的透明包装,因此您可以将其与_mm256_mul_ps一起使用。

这篇关于未知类型名称__M256-英特尔AVX内部功能无法识别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

How can an declare an array in a function that returns an array in c++(如何在用C++返回数组的函数中声明数组)
Is it possible to define a class in 2 or more file in C++?(在C++中可以在两个或多个文件中定义一个类吗?)
Why can#39;t I create an array of automatic variables?(为什么我不能创建一个自动变量数组?)
zeromq: reset REQ/REP socket state(Zeromq:重置REQ/REP套接字状态)
Can I resize a vector that was moved from?(我可以调整从中移出的矢量的大小吗?)
rvalue reference and return value of a function(函数的右值引用和返回值)