【发布时间】:2012-09-10 13:16:04
【问题描述】:
我有这个 C++ 代码。
循环遍历矩阵,找到每一行中的最小元素,然后从对应行的每个元素中减去它。 变量 myr 是所有最小元素的总和
尝试并行:
int min = 0;
int myr = 0;
int temp[SIZE][SIZE];
int size = 0;
...//some initialization
omp_set_num_threads(1);
start_time = omp_get_wtime();
#ifdef _OPENMP
#pragma omp parallel for firstprivate(min, size) reduction(+:myr)
#endif
for(int i = 0; i < size; i++){
min = INFINITY;
for(int j = 0; j < size; j++){
if (temp[i][j] < min)
min = temp[i][j];
}
myr+=min;
for(int j = 0; j < size; j++)
temp[i][j]-=min;
}
end_time = omp_get_wtime();
如果我设置omp_set_num_threads(2);,这部分代码开始运行变慢。
我的 proc 有 2 个核心
为什么使用 2 个线程的代码运行速度较慢?
【问题讨论】:
-
首先,OMP 并不意味着您会自动提高速度。第二件事,可能条件分支充当了障碍,因此开销更大。
-
终极问题是:你的算法适合数据并行吗?线程 A 可以运行您的外部 for 循环的迭代,而线程 B 可以运行外部循环的另一个迭代,而不必相互等待吗?
-
乍一看,它不能。所以你添加一个线程是徒劳的。
-
@Tony The Lion:为什么你说它不能?它们唯一发生冲突的部分是归约变量,这是最后完成的一个加法。
-
我看到很多关于多线程标签的问题,人们只是假设更多的线程等于更好的性能。也许我们应该创建一个 wiki 或其他东西来解释为什么并非总是如此。
标签: c++ c multithreading performance openmp