免责声明:以下示例只是一个快速理解问题的虚拟示例。如果您正在考虑现实世界的问题,请考虑任何动态编程。
问题:我们有一个 n*m 矩阵,我们想要复制前一行的元素,如以下代码所示:
for (i = 1; i < n; i++)
for (j = 0; j < m; j++)
x[i][j] = x[i-1][j];
方法:外循环迭代必须按顺序执行,它们将按顺序执行。
内循环可以并行化。我们希望最大限度地减少创建和终止线程的开销,因此我们希望只创建一次线程组,但是,这在 OpenMP 中似乎是一项不可能完成的任务。
#pragma omp parallel private(j)
{
for (i = 1; i < n; i++)
{
#pragma omp for scheduled(dynamic)
for (j = 0; j < m; j++)
x[i][j] = x[i-1][j];
}
}
当我们申请时ordered
外循环上的选项,代码将以顺序方式执行,因此不会有性能增益。
我正在寻找上述场景的解决方案,即使我不得不使用一些解决方法。
我正在添加我的实际代码。这实际上比 seq 慢。版本。请查阅:
/* load input */
for (i = 1; i <= n; i++)
scanf ("%d %d", &in[i][W], &in[i][V]);
/* init */
for (i = 0; i <= wc; i++)
a[0][i] = 0;
/* compute */
#pragma omp parallel private(i,w)
{
for(i = 1; i <= n; ++i) // 1 000 000
{
j=i%2;
jn = j == 1 ? 0 : 1;
#pragma omp for
for(w = 0; w <= in[i][W]; w++) // 1000
a[j][w] = a[jn][w];
#pragma omp for
for(w = in[i][W]+1; w <= wc; w++) // 350 000
a[j][w] = max(a[jn][w], in[i][V] + a[jn][w-in[i][W]]);
}
}
至于测量,我正在使用这样的东西:
double t;
t = omp_get_wtime();
// ...
t = omp_get_wtime() - t;