处理器核心具有多个矢量流水线时的simdlen值

时间:2017-12-10 11:51:56

标签: openmp vectorization simd fpu

我正在阅读OpenMP 4.5标准,并试图让我对!$omp simd / #pragma omp simd指令有所了解。具体来说,我不清楚允许的simdlen值是什么。

如果我的处理器内核有一个浮点单元(FPU),可以使用256位向量运算,我会使用simdlen(4)作为64位浮点变量。

但是如果核心有两个带128位寄存器的独立向量流水线,我应该使用simdlen值?

1 个答案:

答案 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子句确定。

希望有所帮助。