【发布时间】:2017-09-26 19:42:40
【问题描述】:
我正在尝试 openMP 并行性,使用 2 个线程将 2 个矩阵相乘。 我了解外循环并行性是如何工作的(即没有“collapse(2)”的工作原理)。
现在,使用折叠。
#pragma omp parallel for collapse(2) num_threads(2)
for( i = 0; i < m; i++)
for( j = 0; j < n; j++)
{
s = 0;
for( k = 0; k < p; k++)
s += A[i][k] * B[k][j];
C[i][j] = s;
}
根据我的收集,折叠将循环“折叠”成一个大循环,然后在大循环中使用线程。所以,对于前面的代码,我认为它相当于这样的:
#pragma omp parallel for num_threads(2)
for (ij = 0; ij <n*m; ij++)
{
i= ij/n;
j= mod(ij,n);
s = 0;
for( k = 0; k < p; k++)
s += A[i][k] * B[k][j];
C[i][j] = s;
}
我的问题是:
- 它是这样工作的吗?我还没有找到任何关于它的解释 “折叠”循环。
- 如果是,使用它有什么好处?不 它完全像并行性一样在 2 个线程之间划分作业,而没有 崩溃?。如果不是,那么它是如何工作的?
PS:现在我想得更多,如果 n 是奇数,比如 3,如果没有崩溃,一个线程将有 2 次迭代,而另一个只有一个。这会导致线程的工作不均匀,并且效率会降低。
如果我们使用我的崩溃等效项(如果崩溃确实是这样工作的)每个线程将有“1.5”次迭代。如果 n 非常大,那并不重要,不是吗?更不用说,每次都这样做i= ij/n; j= mod(ij,n);,它会降低性能,不是吗?
【问题讨论】:
标签: c loops openmp matrix-multiplication collapse