并行指令的if子句是多么可移植?

时间:2015-06-26 21:25:48

标签: openmp

这与How to disable OMP in a translation unit at the source file?有关。由于基准测试结果,我正在处理的补丁具有以下内容。看来我们需要能够在翻译单元上关闭OMP:

static const bool CRYPTOPP_RW_USE_OMP = true;
...

ModularArithmetic modp(m_p), modq(m_q);

#pragma omp parallel sections if(CRYPTOPP_RW_USE_OMP)
{
    #pragma omp section
        m_pre_2_9p = modp.Exponentiate(2, (9 * m_p - 11)/8);
    #pragma omp section
        m_pre_2_3q = modq.Exponentiate(2, (3 * m_q - 5)/8);
    #pragma omp section
        m_pre_q_p = modp.Exponentiate(m_q, m_p - 2);
}

该补丁也适用于跨平台库(Linux,Unix,Solaris,BSD,OS X和Windows),它支持许多较旧的编译器。我需要确保不打破编译。

问题 #pragma omp parallel sections if(CRYPTOPP_RW_USE_OMP)的可移植性如何?使用它会破坏以前只使用#pragma omp parallel sections的编译吗?

我试着看past OpenMP specifications, like 2.0,但我看不出它在语法中的允许位置(见附录C)。我能找到的最接近的是 parallel-directive 生产(第22行),它通向 parallel-clause (第24行),然后是 unique-parallel-clause

在查看我无法测试的平台文档时,我不清楚它是否可用。例如,Microsoft的Visual Studio 2005文档仅显示allow it on a loop

1 个答案:

答案 0 :(得分:3)

在您链接的文档中,第8页,第2.2节parallel构造。 if是可用条款(第一个)。它是标准的一部分,因此可以在所有符合标准的编译器中使用。

在您的MSDN链接中:

  

如果适用于以下指令:

     

<强>平行

     

for(OpenMP)

     

部分(OpenMP)