2016-06-29 1 views
0

Aucune idée sur la parallélisation multi-core. Mais pour les boucles simples, cela pourrait modifier peu. Pour l'exemple suivant, comment faire des boucles simples avec le calcul multi-core dans VC++?Comment faire une boucle avec le calcul multi-core dans 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

Je crois que votre première étape devrait être d'étudier les bases de la concurrence et du parallélisme, de sorte que vous ayez "une idée". – user2079303

Répondre

4

L'espace de noms concurrency dans la bibliothèque modèles parallèles (partie de VC++) contient parallel_for ce qui est exactement ce que vous voulez.

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]); 
    }); 
} 

Je vous recommande d'utiliser size_t pour 'n'. De cette façon, il devient un peu plus propre:

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]); 
    }); 
} 

Vous devriez aussi jeter un oeil à l'exemple à msdn

Vous pouvez utiliser « ampli » comme alternative. C'est plus puissant et plus complexe.

+0

Donnez-moi une minute pour un exemple ... fait –

3

Vous pouvez utiliser OpenMP, ajoutez simplement #pragma omp parallel for avant la boucle for.

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]); 
    } 
} 

Aussi, si vous utilisez Microsoft Visual Studio, vous devez activer OpenMP Support dans les milieux

  1. Ouvrir la boîte de dialogue Pages de propriétés du projet.
  2. Développez le nœud Propriétés de configuration.
  3. Développez le noeud C/C++.
  4. Sélectionnez la page de propriétés Language.
  5. Modifier la propriété Support OpenMP.