繁体   English   中英

为什么在我的openmp代码中增加执行时间?

[英]why increase the execution time in my openmp code?

我尝试计算并行简单代码的加速。 这是一个简单的循环。 首先,我在c ++中使用open-mp来并行化它。 然后我想找到每个线程的执行时间,我使用最大线程时间作为并行执行时间。 我用不同的线程号重复它,但时间更糟! 你可以帮帮我吗?

#include "stdafx.h"
#include "omp.h"
#include "conio.h"
double diftime[64];
int a,i,threadnum;
int main()
{
threadnum=2;
omp_set_nested(1);
omp_set_dynamic(0);
#pragma omp parallel num_threads(threadnum) 
{
    double start_time,end_time;
    int id = omp_get_thread_num();
    start_time=omp_get_wtime();
    #pragma omp for nowait schedule(static)
    for (i=0;i<2000000;i++){a++;}
    end_time=omp_get_wtime();
    diftime[id]=diftime[id]+(end_time-start_time);      
    printf("thread[%d] = %.32g\n",id,end_time-start_time);  
}
getch();
return 0;
}

其原因是,你的循环操作就是这么简单编译器替换的结果环路a循环之后。 看看这个例子:

#include <stdio.h>

int main()
{
   size_t i;
   unsigned a = 0;
   for (i = 0; i < (1UL << 20); i++) // the loop should run 1048576 times
      a++;
   printf("%ud\n", a);
   return 0;
}

但是当我们通过gcc -O2 -S test.c查看生成的指令时,我们发现

_main:
LFB20:
   subq   $8, %rsp
LCFI0:
   movl   $1048576, %esi  # the loop is replaced by a's value!
   xorl   %eax, %eax
   leaq   LC0(%rip), %rdi
   call   _printf
   xorl   %eax, %eax
   addq   $8, %rsp
LCFI1:
   ret

因此,您测量时间上升的原因是生成和处理更多线程需要更多时间(实际上并没有做任何事情)。


如果要强制编译器创建循环,则应该使循环中的变量volatile ,如下所示:

#include <stdio.h>

#include <omp.h>

double diftime[64];
int main()
{
   int i;
   unsigned a = 0;
#pragma omp parallel
   {
      double start_time, end_time;
      int id = omp_get_thread_num();
      start_time = omp_get_wtime();
      volatile int b = 0;  // #############################
#pragma omp for nowait schedule(static)
      for (i = 0; i < (1UL << 20); i++)
         b++;
      end_time = omp_get_wtime();
      diftime[id] = diftime[id] + (end_time - start_time);
      printf("thread[%d] = %.32g\n", id, end_time - start_time);
// ensure only one thread at a time executes the next line
#pragma omp critical  
      a += b;
   }
   printf("a = %d\n", a);
   return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM