2016-06-29 2 views
0

マルチコアの並列化については考えられません。しかし、単純なループでは、少し修正するかもしれません。次の例では、VC++でマルチコア計算を行う単純なループを作成する方法を教えてください。並列パターンでVC++でマルチコア計算を行うには?

#include <iostream> 
#include <vector> 
#include <ctime> 
using namespace std; 

void foo(int n, double* a, double* b, double *c, double*d, double* e, double* f, double* g) 
{ 
    for (int i = 0; i < n; ++i) 
    { 
     a[i] = b[i] * a[i] + c[i] * (d[i] + e[i] + f[i] + g[i]); 
    } 
} 

int main() 
{ 
    int m = 1001001; 
    vector<double> a(m), b(m), c(m), d(m), f(m); 

    std::clock_t startcputime = std::clock(); 
    for (int i = 0; i < 1000; ++i) 
     foo(1000000, &a[0], &b[0], &c[0], &d[0], &d[1], &f[0], &f[1000]); 
    double cpu_duration = (std::clock() - startcputime)/(double)CLOCKS_PER_SEC; 
    std::cout << "Finished in " << cpu_duration << " seconds [CPU Clock] " << std::endl; 
} 
+2

[OpenMP](http://openmp.org/wp/)、[OpenCL](https://www.khronos.org/opencl/)、[OpenACC](http://www.openacc .org /)。 – Holt

+0

私はあなたの最初のステップは、あなたは "いくつかのアイデア"を持っているように、並行性と並列性の基礎を学ぶことであると信じています。 – user2079303

答えて

4

concurrency名前空間には、ライブラリ(VC++の一部)が正確に何をしたいですparallel_forが含まれています。

void parallel_foo(int n, double* a, double* b, double *c, double*d, double* e, double* f, double* g) 
{ 
    concurrency::parallel_for(static_cast<size_t>(0), static_cast<size_t>(n), [&](size_t i) { 
     a[i] = b[i] * a[i] + c[i] * (d[i] + e[i] + f[i] + g[i]); 
    }); 
} 

「n」にはsize_tを使用することをおすすめします。それは少しクリーナーを取得します。この方法:

void parallel_foo(size_t n, double* a, double* b, double *c, double*d, double* e, double* f, double* g) 
{ 
    concurrency::parallel_for(0, n, [&](size_t i) { 
     a[i] = b[i] * a[i] + c[i] * (d[i] + e[i] + f[i] + g[i]); 
    }); 
} 

はまた、あなたが代替として「アンプ」を使用することができmsdn

で例を見てみなければなりません。より強力で複雑なものです。

+0

例を分...教えてください –

3

あなただけforループの前#pragma omp parallel forを追加し、OpenMPを使用することができます。

void foo(int n, double* a, double* b, double *c, double*d, double* e, double* f, double* g) 
{ 
    #pragma omp parallel for 
    for (int i = 0; i < n; ++i) 
    { 
     a[i] = b[i] * a[i] + c[i] * (d[i] + e[i] + f[i] + g[i]); 
    } 
} 

あなたは、Microsoft Visual Studioを使用している場合も、あなたが設定

  1. OpenMP Supportを有効にする必要がありますが、プロジェクトのプロパティページ]ダイアログボックスを開きます。
  2. [構成プロパティ]ノードを展開します。
  3. C/C++ノードを展開します。
  4. [言語]プロパティページを選択します。
  5. OpenMP Supportプロパティを変更します。
関連する問題