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

时间:2013-10-10 20:32:29

标签: c# 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
    }
});

1 个答案:

答案 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