4

如何使用 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
    }
});
4

1 回答 1

6

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

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 在此处提供了执行此操作的示例。

于 2013-10-11T11:32:56.973 回答