【发布时间】:2018-12-20 23:19:03
【问题描述】:
我正在构建一个应该将两个矩阵相乘的程序。问题是,我应该使用 OpenMP 并行化,但每次只使用一个“for”循环(首先是外部循环,然后是它的子循环,然后是内部循环),并且对于每种并行化方法,我应该在使用时分析结果不同数量的线程(1,2,4,8,16,32,64,128)。
我的问题是,我应该将 OpenMP 并行/私有部分放在哪里,以及哪些变量应该是私有/共享的?
// code to be parallelized using n_threads
omp_set_dynamic(0); // Explicitly disable dynamic teams
omp_set_num_threads(n_threads);
#pragma omp parallel for shared(a, b, c) private(i,j)
for (i=0; i < TAM_MATRIZ; i++){
for (j=0; j < TAM_MATRIZ; j++) {
c[i][j] = 0; // initialize the result matrix with zeros
for (k=0; k < TAM_MATRIZ; k++){
#pragma omp atomic
c[i][j] += a[i][k]*b[k][j];
}
}
printf("Number of threads used: %d\n", omp_get_num_threads());
}
编辑
实际上,它是三个程序,第一个并行化外部循环,第二个并行化中间循环,最后一个并行化内部循环。 每个版本应该运行 8 次,使用指定的线程(1,2,4,8,16,32,64,128),然后我们应该比较不同程序版本和使用不同线程数的相同版本的性能。
我的疑问是在哪里共享或将其设为私有变量。并行化第一个循环时,应该共享哪些变量?当我处理第二个循环时,共享哪些变量?等等……
在我看来,我不能共享任何变量,因为我将有多个线程同时工作并且可以产生部分结果,但我知道我错了,我在这里问基本上是为了理解为什么。
【问题讨论】:
-
您实际上可以检查或重复使用viennacl.sourceforge.net。它可以通过 GPU 加速,即 OpenCL 或 CUDA 或 OpenMP。
-
感谢维克多·古宾的回复!事实上,这只是我大学科目的一个练习。这里的目的是学习如何使用 OpenMP 并将其应用到一个简单的代码示例中。
-
@AndréRocha(严重)并行化中间或内部循环并没有改变我回答中的数据共享建议。唯一的问题是,如果您并行化最内层循环(
ijk-loop),则必须添加回原子(或巧妙的缩减)。
标签: c linux multithreading openmp matrix-multiplication