如何使用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
}
});
答案 0 :(得分:6)
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
函数应返回状态,并将传递给下一次迭代,依此类推。
您的代码应如下所示:
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。