【发布时间】:2015-10-02 06:27:25
【问题描述】:
我对这种并行编程非常陌生,我正在使用 OpenMP。 我对以下问题感到困惑。
假设我有这个程序:
void functionX(int x){
for(int i = 0; i < x; i++)
//do some process
}
void functionY(int x, int y){
for(int i = 0; i < x; i++)
for(int j = 0; j < y; j++) {
funtionX(j);
}
}
void functionZ(int x){
for(int i = 0; i < x; i++)
functionY(i, 5);
}
int main() {
functionZ(3)
}
现在我想在这段代码上实现并行编程。因为 functionZ 调用 functionY 而 functionX 调用,我认为与其让每个函数并行,我应该只让 functionZ 并行,因此 functionZ 中的每个线程都会单独调用 functionY
这就是我在 functionZ 中的代码的样子。
void functionZ(int x){
#pragma omp parallel for
for(int i = 0; i < x; i++)
functionY(i, 5);
}
但是,我不确定我上面所说的是否正确。我应该让每个函数分别并行吗?
【问题讨论】:
-
您的建议完全有道理,每个线程都可以对
functionY();执行不同的调用,但前提是functionY();的调用之间没有依赖关系,这似乎是您的情况。但是,您应该考虑线程并行之外的数据并行:在 functionX() 中读取的数据以这种方式有效读取?数据读取会不会成为瓶颈? -
对不起,我认为数据并行是线程并行。不一样吗?
-
线程并行是指并行执行任务的可能性。您还需要检查所需数据是否可以并行化:一次迭代是否需要前一次迭代产生的数据?线程是否需要使用锁定机制访问共享内存位置?它们都从文件中读取吗?每个线程复制一次数据以便每个线程都在其本地副本中工作会更有效吗?这些问题是关于数据并行性的。你应该问自己这些问题,或者至少要意识到它们。
标签: c++ multithreading parallel-processing openmp