并行指令上的 if 子句的可移植性如何?
How portable is an if clause on a parallel directive?
这与 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.
在您 link 的文档中,第 8 页,第 2.2 节 parallel
构建。 if
是可用的子句之一(第一个)。它是标准的一部分,因此可以跨所有符合标准的编译器移植。
在您的 MSDN link:
if applies to the following directives:
parallel
for (OpenMP)
sections (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.
在您 link 的文档中,第 8 页,第 2.2 节 parallel
构建。 if
是可用的子句之一(第一个)。它是标准的一部分,因此可以跨所有符合标准的编译器移植。
在您的 MSDN link:
if applies to the following directives:
parallel
for (OpenMP)
sections (OpenMP)