我正在阅读qazxsw poi标准并试图让我对qazxsw poi / qazxsw poi指令有所了解。具体来说,我不清楚允许的OpenMP 4.5值是多少。
如果我的处理器内核有一个浮点单元(FPU),可以使用256位向量运算,我会使用!$omp simd
作为64位浮点变量。
但是,如果核心有两个独立的矢量流水线和128位寄存器,我应该使用什么#pragma omp simd
值?
tl;博士:
该标准在特定硬件体系结构和simdlen
构造的simdlen(4)
子句之间没有任何关联,因此它的实现已定义。
我首先要补充一个问题:你是否需要使用simdlen
?
根据我对AVX2和AVX-512的不同实现的经验,我会说:不,为了在Xeon和Xeon Phi上使用每个核心的VPU,没有必要,但它对于生成的性能有点有益。代码使用两次本机寄存器大小作为参数。我认为预期的用途是不同的(见背景)。
从标准:
根据标准(p.74,l.22),simdlen
构造的simd
子句(与simdlen
构造相对)指定了首选行为,而实际行为,以及原始问题的答案,是实现定义:
如果使用,则simdlen子句指定要同时执行的首选迭代次数。 simdlen子句的参数必须是常量正整数。在任何给定时间同时执行的迭代次数是实现定义的。
标准中规定的允许值的唯一限制是:
safelen子句的参数必须是常量正整数表达式。
如果同时指定了simdlen和safelen子句,则simdlen参数的值必须小于或等于safelen参数的值。
背景:
simdlen子句被添加到simd构造中(参见第72页的第2.8.1节),以支持指定每个SIMD块所需的精确迭代次数。
这可用于调用使用simdlen
构造和相应的simd
子句生成的匹配SIMD函数,其中后者具有稍微不同的语义:
如果创建了SIMD版本,则函数的并发参数数由simdlen子句确定。
希望有所帮助。