这与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。
答案 0 :(得分:3)
在您链接的文档中,第8页,第2.2节parallel
构造。 if
是可用条款(第一个)。它是标准的一部分,因此可以在所有符合标准的编译器中使用。
在您的MSDN链接中:
如果适用于以下指令:
<强>平行强>
for(OpenMP)
部分(OpenMP)