【发布时间】: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 分配迭代。顺便说一句,别忘了声明i和jprivate
标签: c multithreading loops parallel-processing openmp