【问题标题】:openMP threads and iterationsopenMP 线程和迭代
【发布时间】:2018-05-12 13:51:00
【问题描述】:

所以我有这部分代码。

#pragma omp parallel for num_threads(4)
for (it = 0; it < itime; it++){
  for (i = 0; i < N; i++){
   do something1..
   for (j = 0; j < N; j++){
   do something2..
   }
  }
  do something3..
 }

带有it 计数器的 for 循环迭代 20 次 (0-19)。 N 的值在当时并不重要。 发生的情况是迭代“分布”在 4 个线程上。

thread #0 gets [0,1,2,3,4]
thread #1 gets [5,6,7,8,9]
thread #2 gets [10,11,12,13,14]
thread #3 gets [15,16,17,18,19]

我想要做的就是按照我自己的顺序传播迭代,例如: thread #0 [0,4,8,10,16]等等...

有什么方法可以使用 openmp 实现这一点吗?

【问题讨论】:

  • 定义“int numbers[] = {0,4,8,10,16 ...};”在 for 循环之前,然后使用“numbers[it]”在线程中访问它。只是一个建议。
  • 所以你建议使用 4 个数组(带有计数器)和 4 个 for 循环,这样我就可以使用每个线程访问 1 个循环?
  • 据我了解,4 个线程不需要 4 个 for 循环。主 for 循环内的内容将分为 4 个线程。所以 1 个数组(长度为 20)就足够了。
  • 我会尝试使用 schedule 子句。
  • 对于这种特定情况,您可以只使用schedule(static,1),它将以循环方式在线程之间按批次 1 分配迭代。顺便说一句,别忘了声明 ij private

标签: c multithreading loops parallel-processing openmp


【解决方案1】:

这是一个简单的解决方案。

int numbers[] = { 0,4,8,10,16,1,2,3,5,6,7,9,11,12,13,14,15,17,18,19 };//define as u wish
#pragma omp parallel for num_threads(4)
for (int it = 0; it < 20; it++) {
        //cout <<"Thread "<< omp_get_thread_num() << " gets :" << numbers[it] << endl;
        int num = numbers[it];//use this instead of "it"
}

这可能不是最好的解决方案。

【讨论】:

  • 我不需要打印上面提到的“线程”部分。我只需要主 for 循环(it 计数器)来遍历每个线程上 it 变量的某些值。
  • 所以不要打印。我评论了那条线。现在看看。
猜你喜欢
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 2013-01-25
  • 2011-06-17
相关资源
最近更新 更多