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