如何使用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提供了一个在此处执行此操作的示例。