gpt4 book ai didi

C# Parallel.For 意想不到的结果

转载 作者:行者123 更新时间:2023-11-30 20:48:54 24 4
gpt4 key购买 nike

我是 C# 的新手,在翻译我的旧 DSP、VB6 代码时,我想利用这种语言提供的可能性。具体来说,我正在尝试使用并行处理来加速耗时的计算。

这是我目前正在测试的(简化的)代码。

“1°并行代码OK”部分工作正常,没有问题;

在我看来,“2° 并行代码错误结果”部分应该等同于“顺序代码 OK”部分,它比顺序版本快很多,但没有返回预期结果。

为什么?我哪里错了?

     double[] Omega = new double[NFreq + 1];
double[,] SinOmT = new double[NFreq + 1, NVAL];
double[,] CosOmT = new double[NFreq + 1, NVAL];

double OmT;

// 1° Parallel code OK:
Parallel.For(0, NFreq + 1, JF =>
{
Omega[JF] = PI2 * Freq[JF] / Fs;
});

// Sequential code OK:
for (int JF = 1; JF <= NFreq; JF++)
{
for (int JD = 0; JD < NVAL; JD++)
{
OmT = Omega[JF] * (double)(JD);
SinOmT[JF, JD] = Math.Sin(OmT);
CosOmT[JF, JD] = Math.Cos(OmT);
}
}

// 2° Parallel code WRONG results:
for (int JF = 1; JF <= NFreq; JF++)
{
Parallel.For(0, NVAL, JD =>
{
OmT = Omega[JF] * (double)(JD);
SinOmT[JF, JD] = Math.Sin(OmT);
CosOmT[JF, JD] = Math.Cos(OmT);
});
}

再见,感谢关注。

佛朗哥

最佳答案

在循环外声明变量 OmT 是错误的,因为并行迭代会争夺它并不可预测地覆盖它的值。

在 C# 中,您应该始终在有意义的最严格范围内声明变量。这适用于所有场景,而不仅仅是并行代码。

        var OmT = Omega[JF] * (double)(JD);
SinOmT[JF, JD] = Math.Sin(OmT);
CosOmT[JF, JD] = Math.Cos(OmT);

关于C# Parallel.For 意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24101370/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com