gcc 在何处找到所有可用的__attribute__选项

fcwjkofz  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(126)

我目前正在使用AVX/SSE库,并希望制定一个运行时决策过程来评估哪些指令在给定的体系结构和操作系统上可用,并使用适当的重载函数。在那个图书馆里,已经有了一个机制,但是有缺陷。
我在这里不详细介绍,但是提到的机制使用__attribute__(target())语法,它允许编译一个函数,它之前的标志与程序的其他部分不同。然而,试图找出如何正确地使用它来编译基于SIMD指令的函数被证明是相当困难的,主要是因为官方手册(https://gcc.gnu.org/onlinedocs/gcc/x86-Function-Attributes.html#x86-Function-Attributes)attributetarget())的选项列表不完整。至少,选项“avx”和“avx 2”丢失。
事实上,比较这里的内容https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gcc/x86-Function-Attributes.html#x86-Function-Attributes和https://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Function-Attributes.html似乎没有太大的不同。
所以我的问题是,在哪里可以找到gcc-v7.2.0 x86-64编译器可用的__attribute__(target())选项的完整列表和其他重要的相关信息?

ljo96ir5

ljo96ir51#

这里真实的的问题是文档已经落后于实现-不幸的是,这是发生的事情,当它真的发生时,唯一真正的解决方案是服从源来确定可用的,或者直接询问编译器。
首先,你问的是__attribute__(__target__())。这有效地改变了属性的编译选项,使其与指定的目标匹配,因此如果传入avx2,它将使用该扩展来构建。
任何版本的GCC的完整扩展列表都可以从GCC的帮助输出中提取;所以,例如使用docker容器gcc:7.2.0,我可以做以下事情:

$ docker run --rm  gcc:7.2.0 gcc -v --help 2>&1 | awk '/^[ ]+-march=C/ { P=1; } /^[ ]+-mtune=C/ { P=0; } P==1 { print; }'
  -march=CPU[,+EXTENSION...]
                      generate code for CPU and EXTENSION, CPU is one of:
                       generic32, generic64, i386, i486, i586, i686,
                       pentium, pentiumpro, pentiumii, pentiumiii, pentium4,
                       prescott, nocona, core, core2, corei7, l1om, k1om,
                       iamcu, k6, k6_2, athlon, opteron, k8, amdfam10,
                       bdver1, bdver2, bdver3, bdver4, znver1, btver1,
                       btver2
                      EXTENSION is combination of:
                       8087, 287, 387, 687, mmx, sse, sse2, sse3, ssse3,
                       sse4.1, sse4.2, sse4, avx, avx2, avx512f, avx512cd,
                       avx512er, avx512pf, avx512dq, avx512bw, avx512vl,
                       vmx, vmfunc, smx, xsave, xsaveopt, xsavec, xsaves,
                       aes, pclmul, fsgsbase, rdrnd, f16c, bmi2, fma, fma4,
                       xop, lwp, movbe, cx16, ept, lzcnt, hle, rtm, invpcid,
                       clflush, nop, syscall, rdtscp, 3dnow, 3dnowa,
                       padlock, svme, sse4a, abm, bmi, tbm, adx, rdseed,
                       prfchw, smap, mpx, sha, clflushopt, prefetchwt1, se1,
                       clwb, avx512ifma, avx512vbmi, avx512_4fmaps,
                       avx512_4vnniw, avx512_vpopcntdq, clzero, mwaitx,
                       ospke, rdpid, ptwrite, no87, no287, no387, no687,
                       nommx, nosse, nosse2, nosse3, nossse3, nosse4.1,
                       nosse4.2, nosse4, noavx, noavx2, noavx512f,
                       noavx512cd, noavx512er, noavx512pf, noavx512dq,
                       noavx512bw, noavx512vl, noavx512ifma, noavx512vbmi,
                       noavx512_4fmaps, noavx512_4vnniw, noavx512_vpopcntdq

因此,基于这些数据,您可以为7.2.0添加相当多的目标属性
对于GCC 13.1.0:

$ docker run --rm  gcc:13.1.0 gcc -v --help 2>&1 | awk '/^[ ]+-march=C/ { P=1; } /^[ ]+-mtune=C/ { P=0; } P==1 { print; }'
  -march=CPU[,+EXTENSION...]
                      generate code for CPU and EXTENSION, CPU is one of:
                       default, push, pop, generic32, generic64, i386, i486,
                       i586, i686, pentium, pentiumpro, pentiumii,
                       pentiumiii, pentium4, prescott, nocona, core, core2,
                       corei7, iamcu, k6, k6_2, athlon, opteron, k8,
                       amdfam10, bdver1, bdver2, bdver3, bdver4, znver1,
                       znver2, znver3, znver4, btver1, btver2
                      EXTENSION is combination of (possibly "no"-prefixed):
                       8087, 287, 387, 687, cmov, fxsr, mmx, sse, sse2,
                       sse3, sse4a, ssse3, sse4.1, sse4.2, sse4, avx, avx2,
                       avx512f, avx512cd, avx512er, avx512pf, avx512dq,
                       avx512bw, avx512vl, vmx, vmfunc, smx, xsave,
                       xsaveopt, xsavec, xsaves, aes, pclmul, fsgsbase,
                       rdrnd, f16c, bmi2, fma, fma4, xop, lwp, movbe, cx16,
                       ept, lzcnt, popcnt, hle, rtm, tsx, invpcid, clflush,
                       nop, syscall, rdtscp, 3dnow, 3dnowa, padlock, svme,
                       abm, bmi, tbm, adx, rdseed, prfchw, smap, mpx, sha,
                       clflushopt, prefetchwt1, se1, clwb, avx512ifma,
                       avx512vbmi, avx512_4fmaps, avx512_4vnniw,
                       avx512_vpopcntdq, avx512_vbmi2, avx512_vnni,
                       avx512_bitalg, avx_vnni, clzero, mwaitx, ospke,
                       rdpid, ptwrite, ibt, shstk, gfni, vaes, vpclmulqdq,
                       wbnoinvd, pconfig, waitpkg, cldemote, amx_int8,
                       amx_bf16, amx_fp16, amx_tile, movdiri, movdir64b,
                       avx512_bf16, avx512_vp2intersect, tdx, enqcmd,
                       serialize, rdpru, mcommit, sev_es, tsxldtrk, kl,
                       widekl, uintr, hreset, avx512_fp16, prefetchi,
                       avx_ifma, avx_vnni_int8, cmpccxadd, wrmsrns, msrlist,
                       avx_ne_convert, rao_int, rmpquery, no87

对于gcc 4.9.4:

$ docker run --rm  gcc:4.9.4 gcc -v --help 2>&1 | awk '/^[ ]+-march=C/ { P=1; } /^[ ]+-mtune=C/ { P=0; } P==1 { print; }'
  -march=CPU[,+EXTENSION...]
                      generate code for CPU and EXTENSION, CPU is one of:
                       generic32, generic64, i386, i486, i586, i686,
                       pentium, pentiumpro, pentiumii, pentiumiii, pentium4,
                       prescott, nocona, core, core2, corei7, l1om, k1om,
                       k6, k6_2, athlon, opteron, k8, amdfam10, bdver1,
                       bdver2, bdver3, bdver4, btver1, btver2
                      EXTENSION is combination of:
                       8087, 287, 387, no87, mmx, nommx, sse, sse2, sse3,
                       ssse3, sse4.1, sse4.2, sse4, nosse, avx, avx2,
                       avx512f, avx512cd, avx512er, avx512pf, avx512dq,
                       avx512bw, avx512vl, noavx, vmx, vmfunc, smx, xsave,
                       xsaveopt, xsavec, xsaves, aes, pclmul, fsgsbase,
                       rdrnd, f16c, bmi2, fma, fma4, xop, lwp, movbe, cx16,
                       ept, lzcnt, hle, rtm, invpcid, clflush, nop, syscall,
                       rdtscp, 3dnow, 3dnowa, padlock, svme, sse4a, abm,
                       bmi, tbm, adx, rdseed, prfchw, smap, mpx, sha,
                       clflushopt, prefetchwt1, se1, clwb, pcommit,
                       avx512ifma, avx512vbmi

因此,您可以使用它来确定可用编译选项的完整列表。
但是,请注意,存在错误-有时您所要求的不会发生,但对于大多数编译选项来说,这是罕见的。

相关问题