我试着测试一些英特尔Intrinsics,看看它们是如何工作的。因此,我为自己创建了一个函数,这是代码:
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");
}但我会发现这些错误:
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.h,emmintrin.h,xmmintrin.h,我使用的是月食火星
所以我想知道的是这个问题是来自编译器还是硬件,还是别的什么?我该怎么解决呢?谢谢!
发布于 2016-07-29 15:56:45
MMX和SSE2是x86-64的基线,但AVX不是。您确实需要专门启用AVX,而不是针对SSE2的。
使用-march=haswell或任何您实际拥有的CPU进行构建。或者只使用-mavx。
请注意,使用默认tune=generic的tune=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,所以如果这是一个问题,您必须查看其他包装器库。
它让你做类似的事情
// example from the manual for operator[]
Vec4i a(10,11,12,13);
int b = a[2]; // b = 12您可以在类型的VCL上使用普通的本质。Vec8f是__m256上的透明包装器,所以您可以将它与_mm256_mul_ps一起使用。
发布于 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)
https://stackoverflow.com/questions/38662287
复制相似问题