【问题标题】:parallel programming in CC中的并行编程
【发布时间】:2011-07-10 00:16:46
【问题描述】:

我正在尝试在 C 中并行化光线追踪器,但执行时间并没有随着线程数量的增加而下降。我到目前为止的代码是:

main2(thread function):

float **result=malloc(width * sizeof(float*));
int count=0;
for (int px=0;, px<width; ++px)
{
     ...
     for (int py=0; py<height; ++py)
     {
         ...
         float *scaled_color=malloc(3*sizeof(float));
         scaled_color[0]=...
         scaled_color[1]=...
         scaled_color[2]=...

         result[count]=scaled_color;
         count++;
         ...
      }
}
...
return (void *) result;

main:
pthread_t threads[nthreads];
 for (i=0;i<nthreads;i++)
 {
      pthread_create(&threads[i], NULL, main2, &i);
 }

 float** result_handler;

 for (i=0; i<nthreads; i++)
 {
      pthread_join(threads[i], (void *) &result_handler);
      int count=0;

      for(j=0; j<width;j++)
     {
          for(k=0;k<height;k++)
          {
               float* scaled_color=result_handler[count];
               count ++;
               printf...
           }
           printf("\n");
       }
  }

main2 返回一个float **,以便在main函数中按顺序打印图片。任何人都知道为什么执行时间没有下降(例如,当它应该是相反的方式时,它使用 8 个线程比使用 4 个线程运行的时间更长)?

【问题讨论】:

标签: c parallel-processing


【解决方案1】:

仅添加线程是不够的,您还需要实际拆分任务。看起来你在每个线程中都在做同样的工作,所以你会得到 n 个线程的 n 个结果副本。

【讨论】:

    【解决方案2】:

    这里有两件事对你不利。 (1) 除非您可以将线程分配给多个内核,否则您一开始就不能指望加速;使用单个内核,无论您是否并行化代码,该内核都有相同数量的工作要做。 (2) 即使有多个内核,并行性能对内核上完成的计算与内核之间所需通信量的比率非常敏感。在循环中使用 ptrhead_join() 时,您会招致很多这种“停下来等待其他人”的表现。

    【讨论】:

      【解决方案3】:

      程序和算法的并行性通常很难实现,而且需要一些投资才能实现。

      我不认为直接使用线程是适合您的工具。尝试查看OpenMp,它更高级。

      【讨论】:

      • OpenMP 学习起来很不自然(我不会在严肃的生产环境中使用它,因为它很难抽象)但它是 1)易于学习 2)标准 3)易于使用并行化巨大的循环。
      • @Alexandre,你能解释一下“unnatural”是什么意思吗?
      • 我总是发现 OpenMP 的语法很难做比并行化 for 循环更复杂的事情。它严重缺乏适当的 OO 抽象。
      • @Alexandre,好的,我明白你的意思了。但是在很多很多应用程序中,像这里的for-loops 是用于构建代码的 工具。它认为编写此类问题的原始语言称为 fortran :)
      • 是的,这个特定的应用程序可能会受益于一行 OpenMP(因此我赞成)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2010-09-20
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多