gpt4 book ai didi

c# - 如何使用 C# Parallel.For 实现 OpenMP 多级代码

转载 作者:行者123 更新时间:2023-11-30 14:31:53 26 4
gpt4 key购买 nike

如何使用 C# Parallel.For 在以下 OpenMP 代码中实现

OpenMP 代码

#pragma omp parallel
{
float[] data = new float[1000];

#pragma omp for
for(int i = 0; i < 500; i++)
{
for(int j = 0; j < 1000; j++)
{
data[j] =100;
// do some computation using data
}
}
}

我还尝试了以下方法,但它与 OpenMP 代码所做的并不完全相同。在 openMP 代码中,它为每个线程分配内存并执行嵌套循环计算。而下面的代码实际上是为每个 i 而不是每个线程分配内存并执行计算。

Parallel.For(0, 500, i =>
{
float[] data = new float[1000];

for(int j = 0; j < 1000; j++)
{
data[j] =100;
// do some computation using data
}
});

最佳答案

Parallel.For 提供了多个重载,允许存储每个线程的状态变量。其中之一是(完整描述 here ):

public static ParallelLoopResult For<TLocal>(
int fromInclusive,
int toExclusive,
Func<TLocal> localInit,
Func<int, ParallelLoopState, TLocal, TLocal> body,
Action<TLocal> localFinally
)

TLocal 可以是任何类型,例如float[] 在您的情况下,每个线程调用一次 localInit() 函数以在线程的本地存储中初始化该类型的实例,然后该实例传递给 body 。 body 函数应返回状态,并将其传递给下一次迭代,依此类推。

您的代码应如下所示:

Parallel.For<float[]>(0, 500,
() => new float[1000],
(i, loop, data) =>
{
for(int j = 0; j < 1000; j++)
{
data[j] = 100;
// do some computation using data
}
return data;
},
(data) => {}
);

Microsoft 提供了执行此操作的示例 here .

关于c# - 如何使用 C# Parallel.For 实现 OpenMP 多级代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19305674/

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