【发布时间】:2014-09-28 19:14:27
【问题描述】:
我正在尝试改进代码的主要部分中的并行性。这个循环有主要的计算,每次输出需要做超过 100 万次(我需要 8000 万次输出)。因此,即使是轻微的改进,也会对执行时间产生严重影响。 我知道 IF 条件会降低并行计算速度。另外,我知道特殊位置的主要变量(U[i,j] 和 V[i,j])可能始终为零。因此,如果我可以为这些数组的特殊列分配常数零(不想改变计算),我可以从代码中消除 IF 条件。
Before calculation:
| 1 1 1 0 1|
| 1 1 1 0 1|
| 1 1 1 0 1|
| 1 1 1 0 1|
After calculation:
| 3 1 8 0 5|
| 1 4 4 0 1|
| 7 3 1 0 8|
| 1 1 5 0 7|
我想要一个其值始终为零的列。
如何为二维数组的空间列分配常数(零)?
作为示例,上述部分如下所示:
double[,] U= new double[nx,ny];
double[,] V= new double[nx,ny];
Parallel.For(0,nx,i =>
{
For (j=0; j<ny ; j++)
{
if (i!=a && i!=b &&i!=c &&i!=d &&)
{
U[i,j]= ...; // A big chunk of calculations
V[i,j]=... ;// A big chunk of calculations
}
}
}
有趣的是,当我运行代码时,我发现它使用了几乎 20% 的内核。是因为我的并行循环较弱还是我应该手动分配循环使用的核心数?
【问题讨论】:
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
参考地点?
-
你听说过有特殊列的数组吗?
-
@JohnSaunders:我们可以为列分配常量值吗?
-
好的,没有办法制作一个包含特殊列的数组。您必须更改算法以跳过您认为应该跳过的列。但是,我强烈建议您分析您的代码以找出时间花费在哪里。您很可能正在尝试解决错误的问题。特别是,您可能遇到线程争用问题,而不是花费过多 CPU 时间的问题。
标签: c# arrays optimization parallel.for