2011-12-24 12 views
7

のループのための並列化:次のように私は私のCコードのループを持っているC

for(i=0; i<100000; i++){ 

    a[i] = simulate(); // simulate() function simulates some system 

} 

我々はa[]の要素の順序がに重要ではありません(各反復の計算は他から独立していることを見ます私)。私はこのforループの計算をマルチスレッドを使って並列化したいと思っています。私はC言語でこれを行う方法を正確に認識していませんか?私は8プロセッサマシンを持っているので、私は並列に8スレッドを実行することができます。

答えて

11

C *で並列処理を行うための移植可能な方法はありません。しかし、OpenMP standardは広くサポートされています。

#pragma omp parallel for 
for(i=0; i<100000; i++){ 

    a[i] = simulate(); // simulate() function simulates some system 

} 

コンパイラによっては、OpenMPのサポートを有効に設定する必要がありフラグが存在します。

  • MSVC:/openmp
  • GCC :-fopenmp

だけでなく、ヘッダあなたが特定のOpenMPの機能にアクセスしたい場合:

#include <omp.h> 

EDIT:

*(非常に最近承認された)C11標準は<threads.h>を経由して、スレッドをサポートしています。

+1

'Cで並列処理を行う方法はありません '新しい標準C11は現在わずか数日前ですが、これは変更されています! – u0b34a0f6ae

+0

@ kaizer.seうわー、私はC11が承認されたことを認識していませんでした!私は私の答えでそれを言及します。ありがとう! – Mysticial

+0

ご返信ありがとうございます。私はこれを試した。いくつかのa [i]では、コードが正しく実行されているにもかかわらず、 "nan"または "-nan"を取得しています。私はある種の同期問題があるかもしれないと思う。 –

0

コンパイラがC11標準をサポートしている場合は、具体的にはstdatomic.hです。

以下は、その背後にある基本的な考え方を示す原型の例です。それほど難しいことではありません。これはposixスレッドを使いますが、スレッドライブラリを使うことができます。

#include <stdio.h> 
#include <stdatomic.h> 
#include <pthread.h> 

#define ELEMENTS_N 500000 

_Atomic unsigned int x; 
unsigned int N; 
unsigned int anyArray[ELEMENTS_N]; 

void * ThreadLoop (void * args) 
{ 
    unsigned int l; 
    while((l = atomic_load(&x)) < N) 
    { 
    if (atomic_compare_exchange_weak(&x, &l, l + 1)) 
    { 
     anyArray[l] = l; 
    } 
    } 
    return 0; 
} 


int main (int argc, char *argv[]) 
{ 

    pthread_t th1; 
    pthread_t th2; 
    int v; 

    atomic_store(&x, 0); 
    N = ELEMENTS_N; 

    v = pthread_create(&th1, NULL, &ThreadLoop, NULL); 
    v = pthread_create(&th2, NULL, &ThreadLoop, NULL); 

    pthread_join(th1, NULL); 
    pthread_join(th2, NULL); 

    for(v = 0; v < ELEMENTS_N; v++) 
    { 
    printf("%d ", anyArray[v]); 
    } 

    return 0; 
} 
関連する問題