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

如何使用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提供了几个重载,允许一个存储每个线程的状态变量。 其中之一是( 在此完全描述):

 public static ParallelLoopResult For( int fromInclusive, int toExclusive, Func localInit, Func body, Action localFinally ) 

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

您的代码应如下所示:

 Parallel.For(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提供了一个在此处执行此操作的示例。