分享方式:


如何:轉換使用削減變數的 OpenMP 迴圈來使用並行執行階段

此範例示範如何轉換使用縮減 子句來使用 並行執行時間之迴圈的 OpenMP 平行 處理。

OpenMP reduction 子句可讓您指定一或多個執行緒私用變數,這些變數受限於平列區域結尾的縮減作業。 OpenMP 會預先定義一組縮減運算子。 每個縮減變數都必須是純量(例如 、 int longfloat )。 OpenMP 也會定義在平列區域中如何使用縮減變數的數個限制。

平行模式程式庫 (PPL) 提供並行::combinable 類別,其提供 可重複使用的執行緒本機儲存體,可讓您執行精細的計算,然後將這些計算合併至最終結果。 類別 combinable 是針對純量和複雜類型的範本。 若要使用 類別 combinable ,請在平行建構的主體中執行子計算,然後呼叫 concurrency::combinable::combine concurrency::combinable::combine_each 方法來產生最終結果。 combinecombine_each 方法各採用 combine 函 式,指定如何結合每一組元素。 因此,類別 combinable 不限於一組固定的縮減運算子。

範例

此範例同時使用 OpenMP 和並行執行時間來計算前 35 個 Fibonacci 數位的總和。

// concrt-omp-fibonacci-reduction.cpp
// compile with: /EHsc /openmp
#include <ppl.h>
#include <iostream>

using namespace concurrency;
using namespace std;

// Computes the nth Fibonacci number.
// This function illustrates a lengthy operation and is therefore
// not optimized for performance.
int fibonacci(int n)
{
   if (n < 2)
      return n;

   // Compute the components in parallel.
   int n1, n2;
   parallel_invoke(
      [n,&n1] { n1 = fibonacci(n-1); },
      [n,&n2] { n2 = fibonacci(n-2); }
   );

   return n1 + n2;
}

// Uses OpenMP to compute the sum of Fibonacci numbers in parallel.
void omp_parallel_fibonacci_sum(int count)
{
   int sum = 0;
   #pragma omp parallel for reduction(+ : sum)
      for (int i = 0; i < count; ++i)
      {
         sum += fibonacci(i);
      }

   wcout << L"The sum of the first " << count << L" Fibonacci numbers is " 
         << sum << L'.' << endl;
}

// Uses the Concurrency Runtime to compute the sum of Fibonacci numbers in parallel.
void concrt_parallel_fibonacci_sum(int count) 
{
   combinable<int> sums;
   parallel_for(0, count, [&sums](int i)
      {
         sums.local() += fibonacci(i);
      });

   wcout << L"The sum of the first " << count << L" Fibonacci numbers is " 
         << sums.combine(plus<int>()) << L'.' << endl;
}

int wmain()
{
   const int count = 35;

   wcout << L"Using OpenMP..." << endl;
   omp_parallel_fibonacci_sum(count);

   wcout << L"Using the Concurrency Runtime..." << endl;
   concrt_parallel_fibonacci_sum(count);
}

此範例會產生下列輸出。

Using OpenMP...
The sum of the first 35 Fibonacci numbers is 14930351.
Using the Concurrency Runtime...
The sum of the first 35 Fibonacci numbers is 14930351.

如需 類別 combinable 的詳細資訊,請參閱 平行容器和物件

編譯程式碼

複製範例程式碼,並將其貼到 Visual Studio 專案中,或貼到名為 concrt-omp-fibonacci-reduction.cpp 的檔案中,然後在 Visual Studio 命令提示字元視窗中執行下列命令。

cl.exe /EHsc /openmp concrt-omp-fibonacci-reduction.cpp

另請參閱

從 OpenMP 移轉至並行執行階段
平行容器和物件