Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenMP-区段指令;Linux比Windows慢_Linux_Windows_Openmp_Sections - Fatal编程技术网

OpenMP-区段指令;Linux比Windows慢

OpenMP-区段指令;Linux比Windows慢,linux,windows,openmp,sections,Linux,Windows,Openmp,Sections,我有一个简单的代码准备测试。这是代码中最重要的部分: #pragma omp parallel sections { #pragma omp section { for (int j=0;j<100000;j++) for (int i=0;i<1000;i++) a1[i]=1; } #pragma omp section { for (int j=0;j<100000;j++) for (int i=0;i<1000;i++) a2[i]=1

我有一个简单的代码准备测试。这是代码中最重要的部分:

#pragma omp parallel sections
{
 #pragma omp section 
 {
 for (int j=0;j<100000;j++)
  for (int i=0;i<1000;i++) a1[i]=1;
 }
 #pragma omp section 
 {
 for (int j=0;j<100000;j++)
  for (int i=0;i<1000;i++) a2[i]=1;
 }
}
#pragma omp平行段
{
#pragma-omp段
{

对于(int j=0;j我不完全理解您的代码要实现什么,但效率上的差异可能是由于您使用的编译器不知道如何处理节中包含节的代码

首先,请尝试不同的编译器。根据我的经验,gcc-4.8.0在OpenMP中工作得更好,所以也许您可以尝试一下

第二,使用优化标志!如果您正在测量性能,那么使用-O1-O2或-O3都是公平的。后者将为您提供最佳性能,但需要一些数学函数的捷径,这会使浮点运算的精度稍低

g++ -fopenmp name.cpp -O3
如果您感兴趣,可以在上阅读有关编译器标志的更多信息

作为结束语,我不知道您对OpenMP的经验有多丰富,但在处理OpenMP中的循环时,您通常会使用以下方法:

#pragma omp parallel for
for(int i=0; i<N; ++i)
   doSomething();

在使用collapse时,您应该注意一些事情,您可以阅读这些内容。我个人更喜欢手动将它们转换为单循环,因为根据我的经验,这证明更有效。

奇怪的代码,应该用于评估,就是这样吗?您的windows和Linux硬件配置是什么?您确定使用-f吗gcc命令行上的openmp?谢谢你的回复。我用命令编译代码:g++-fopenmp name.cpp。我将检查硬件配置。我将检查硬件配置。这段代码很奇怪,这是真的。它只是用于评估。但是,它应该能正常工作。我说得对吗?让我猜猜-你正在使用
clock()测量时间
,不是吗?
clock()
随着Windows上的实时性以及Linux上所有进程线程的CPU总时间的变化而变化,因此OpenMP程序的运行速度看起来比Linux上的串行程序慢。使用
omp\u get\u wtime()
代替可移植计时。
#pragma omp parallel for collapse(2) private(i, j)
for(int i=0; i<N; ++i)
   for(int j=0; j<N; ++j)
       doSomething();