gpt4 book ai didi

c - 如何将 AVX vector 与 clang 原生 vector 语法(无内在函数)混合?

转载 作者:行者123 更新时间:2023-12-04 08:31:32 26 4
gpt4 key购买 nike

令我高兴的是,我发现 clang 可以让您使用 extended vectors 编写显式 vector 代码,而无需求助于内部函数。 .
例如,这段代码:

typedef float floatx16 __attribute__((ext_vector_type(16)));

floatx16 add( floatx16 a, floatx16 b )
{
return a+b;
}
...将使用 clang -march=skylake-avx512 直接转换为单个指令调用:
vaddps  zmm0, zmm0, zmm1
为了编写无分支代码,我想混合 avx512 vector 。
对于内在函数,您将使用 _mm512_mask_blend_ps固有的。 (顺便问一下,为什么 AVX512 使用 mask,a,b 顺序,而 AVX 使用 a,b,mask 顺序?)
尝试与三元运算符混合不起作用:
typedef float floatx16 __attribute__((ext_vector_type(16)));

floatx16 minimum( floatx16 a, floatx16 b )
{
return a < b ? a : b;
}
...结果是...
error: used type 'int __attribute__((ext_vector_type(16)))' (vector of 16 'int' values) where arithmetic or pointer type is required
有没有可能做 vector blending , vblendmps zmm {k}, zmm, zmm , 使用 ext_vector_type(16) C中的变量?

最佳答案

(这是@chtz 在回答形式中的评论:)
至少有两种不同的方法来做 vector 类型:
表格A:
__attribute__ ( ( ext_vector_type(numelements) ) );
表格B:
__attribute__((vector_size(numbytes)));
使用表格 A 时,表达式 c ? x : y将导致 clang 11 编译错误。
更糟糕的是,即使 N 是 8 或 16,gcc 10 也会默默地假装 ext_vector_type(N) 有 4 个元素。
使用表格 B 时,表达式 c ? x : yproperly translated由 clang 11 转换为 vector 混合。 Clang 10 和 gcc 10 将其转换为不同的东西,但它们都能够编译它。
我不清楚为什么 ext_vector_type 形式存在,特别是考虑到它的工作情况有多糟糕。
更新
呃...这仅适用于 C++ 而不适用于 C。为什么???

关于c - 如何将 AVX vector 与 clang 原生 vector 语法(无内在函数)混合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64996907/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com