首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:“_mm512_loadu_epi64”未在此范围内声明

错误:“_mm512_loadu_epi64”未在此范围内声明
EN

Stack Overflow用户
提问于 2018-12-04 02:47:01
回答 2查看 3.2K关注 0票数 0

我正在尝试为本期报告创建一个最小的复制器。AVX-512似乎有一些问题,它是在最新的带有Skylake处理器的苹果机器上发货的。

根据GCC6发行说明,AVX-512齿轮应该是可用的。根据英特尔Intrinsics指南vmovdqu64可以与AVX-512VLAVX-512F一起使用

代码语言:javascript
复制
$ cat test.cxx
#include <cstdint>
#include <immintrin.h>
int main(int argc, char* argv[])
{
    uint64_t x[8];
    __m512i y = _mm512_loadu_epi64(x);
    return 0;
}

然后:

代码语言:javascript
复制
$ /opt/local/bin/g++-mp-6 -mavx512f -Wa,-q test.cxx -o test.exe
test.cxx: In function 'int main(int, char**)':
test.cxx:6:37: error: '_mm512_loadu_epi64' was not declared in this scope
     __m512i y = _mm512_loadu_epi64(x);
                                     ^
$ /opt/local/bin/g++-mp-6 -mavx -mavx2 -mavx512f -Wa,-q test.cxx -o test.exe
test.cxx: In function 'int main(int, char**)':
test.cxx:6:37: error: '_mm512_loadu_epi64' was not declared in this scope
     __m512i y = _mm512_loadu_epi64(x);
                                     ^
$ /opt/local/bin/g++-mp-6 -msse4.1 -msse4.2 -mavx -mavx2 -mavx512f -Wa,-q test.cxx -o test.exe
test.cxx: In function 'int main(int, char**)':
test.cxx:6:37: error: '_mm512_loadu_epi64' was not declared in this scope
     __m512i y = _mm512_loadu_epi64(x);
                                     ^

我选择了回到-msse2,但没有成功。我好像漏掉了什么。

现代GCC接触AVX-512需要什么?

根据一个/opt/local/bin/g++-mp-6 -v,这些是标题搜索路径:

代码语言:javascript
复制
#include "..." search starts here:
#include <...> search starts here:
 /opt/local/include/gcc6/c++/
 /opt/local/include/gcc6/c++//x86_64-apple-darwin13
 /opt/local/include/gcc6/c++//backward
 /opt/local/lib/gcc6/gcc/x86_64-apple-darwin13/6.5.0/include
 /opt/local/include
 /opt/local/lib/gcc6/gcc/x86_64-apple-darwin13/6.5.0/include-fixed
 /usr/include
 /System/Library/Frameworks
 /Library/Frameworks

然后:

代码语言:javascript
复制
$ grep -R '_mm512_' /opt/local/lib/gcc6/ | grep avx512f | head -n 8
/opt/local/lib/gcc6//gcc/x86_64-apple-darwin13/6.5.0/include/avx512fintrin.h:_mm512_set_epi64 (long long __A, long long __B, long long __C,
/opt/local/lib/gcc6//gcc/x86_64-apple-darwin13/6.5.0/include/avx512fintrin.h:_mm512_set_epi32 (int __A, int __B, int __C, int __D,
/opt/local/lib/gcc6//gcc/x86_64-apple-darwin13/6.5.0/include/avx512fintrin.h:_mm512_set_pd (double __A, double __B, double __C, double __D,
/opt/local/lib/gcc6//gcc/x86_64-apple-darwin13/6.5.0/include/avx512fintrin.h:_mm512_set_ps (float __A, float __B, float __C, float __D,
/opt/local/lib/gcc6//gcc/x86_64-apple-darwin13/6.5.0/include/avx512fintrin.h:#define _mm512_setr_epi64(e0,e1,e2,e3,e4,e5,e6,e7)                       \
/opt/local/lib/gcc6//gcc/x86_64-apple-darwin13/6.5.0/include/avx512fintrin.h:  _mm512_set_epi64(e7,e6,e5,e4,e3,e2,e1,e0)
/opt/local/lib/gcc6//gcc/x86_64-apple-darwin13/6.5.0/include/avx512fintrin.h:#define _mm512_setr_epi32(e0,e1,e2,e3,e4,e5,e6,e7,                       \
/opt/local/lib/gcc6//gcc/x86_64-apple-darwin13/6.5.0/include/avx512fintrin.h:  _mm512_set_epi32(e15,e14,e13,e12,e11,e10,e9,e8,e7,e6,e5,e4,e3,e2,e1,e0)
...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-04 03:27:15

没有掩蔽的情况下,这个固有的_mm512_loadu_si512.没有存在的理由,也没有理由使用它来代替等价的它只是令人困惑,并可能欺骗人类读者认为它是一个vmovq零扩展的单一epi64负载。

英特尔的本质发现器确实指明了它的存在,但即使是现在的主干gcc (在“上帝”上)也不能定义它。

几乎所有的AVX512指令都支持合并掩蔽和零掩蔽.过去是纯按位/全寄存器的指令,没有任何有意义的元素边界,现在有32位和64位元素的味道,比如vpxordvpxorq。或vmovdqa64.但是,使用任何一个没有掩蔽的版本的仍然只是一个法线向量加载/存储/寄存器复制,并且在C++源代码中为它们指定任何元素大小的内容没有意义,只有总向量宽度。

另见si512?

SSE*和AVX 1/2选项与GCC头是否定义这个内在的gcc内置项无关;-mavx512f已经暗示了在AVX512之前的所有英特尔SSE/AVX扩展。

它存在于clang主干中(但不是7.0,所以它只是最近才添加的)。

  • 不对齐_mm512_loadu_si512支持的任何地方,使用以下
  • 未对齐的_mm512_loadu_epi64 - clang树干,不是gcc。
  • 在任何地方都支持对齐_mm512_load_si512,请使用以下内容
  • 对齐_mm512_load_epi64 -也支持各地,令人惊讶。
  • 任何地方都支持非对齐的_mm512_maskz_loadu_epi64,将其用于零掩蔽负载。
  • 在任何地方都支持非对齐的_mm512_mask_loadu_epi64,将其用于合并掩码加载。

这段代码最早在gcc上编译4.9.0,而mainline (Linux) clang最早编译到3.9,都是用-march=avx512f编写的。或者如果他们支持它,-march=skylake-avx512-march=knl。我还没有用苹果Clang做过测试。

代码语言:javascript
复制
#include <immintrin.h>

__m512i loadu_si512(void *x) { return _mm512_loadu_si512(x); }
__m512i load_epi64(void *x)  {  return _mm512_load_epi64(x); }
//__m512i loadu_epi64(void *x) {  return _mm512_loadu_epi64(x); }

__m512i loadu_maskz(void *x) { return _mm512_maskz_loadu_epi64(0xf0, x); }
__m512i loadu_mask(void *x)  { return _mm512_mask_loadu_epi64(_mm512_setzero_si512(), 0xf0, x); }

m512i+loadu_mask(void+*x%29++%7B+return+_mm512_mask_loadu_epi64(_mm512_setzero_si512(%29,+0xf0,+x%29%3B+%7D%0A'%29,l:'5',n:'0',o:‘C%2B%2B+源+%231’,t:'0'%29%29,k:51.80156657963446,l:'4',m:32.73092369477912,n:'0',o:'',s:0,t:'0'%29,(g:(h:编译器,‘4’)I:(编译器:clang390,过滤器:(B:‘0’,二进制:‘1’,只评注:‘0’),拆分:‘1’,指令:‘0’,执行:‘1’,英特尔:‘0’,trim:'1'%29,lang:c%2B%2B,libs:!(%29,options:'-O3+-march%3Dskylake+-mavx512f+-Wall',源:1%29,l:'5',n:'0',o:'x86-64+clang+3.9.0+(Editor+%231,+编译器+%232%29+C%2B%2B‘,t:'0'%29%29,标题:(%29,l:'4',m:46.354326123627544,n:'0',o:’,s:0,t:'0'%29,(g:(h:输出,i:(编译器:2,编辑:1,包装:‘1’%29,l:'5',n:'0',o:‘%232++x 86-64+clang+3.9.0’,t:'0'%29%29,t:‘0’%29%29,l:'4',m:20.914750181593334,n:'0',o:‘,s:0,t:'0'%29%29,k:51.80156657963446,l:'3',n:'0',o:’,t:'0'%29,(g:(G:(h:编译器,I:编译器:g 490,过滤器:(B:‘0’,二进制:‘1’),注释:‘0’,拆分:‘1’,指令:‘0’,执行:‘1’,执行:‘1’,英特尔:‘0’,trim:'1'%29,lang:c%2B%2B,libs:!(%29,选项:‘-O3+-mavx512f+-Wall’,来源:1%29,l:'5',n:'0',o:'x86-64+gcc+4.9.0+(Editor+%231,+Compiler+%231%29+C%2B‘,t:'0'%29%29,k:56.03983023179889,l:'4',m:58.266666666666666,n:'0',o:’s:0,t:'0'%29,(g:!)(h:输出,i:(编译器:1,编辑器:1)包装:‘1’%29,l:'5',n:'0',o:‘%231+x86-64+gcc+4.9.0’,t:'0'%29%29,标题:(%29,l:'4',m:41.733333333333334,n:'0',o:‘0’,s:0,t:‘0’29%29,k:48.19843342036554,l:'3',n:'0',o:'',t:'0'%29%29,l:'2',n:'0',o:'',t:'0'%29%29,版本:4)链接;您可以取消对_mm512_loadu_epi64的注释,并将编译器翻转到clang主干,以查看它在那里工作。

票数 2
EN

Stack Overflow用户

发布于 2019-06-17 13:55:11

_mm512_loadu_epi64在32位模式下不可用.您需要编译64位模式.一般来说,AVX512在64位模式下工作得最好.

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

https://stackoverflow.com/questions/53604986

复制
相关文章

相似问题

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