Распараллеливание цикла for в C - PullRequest
8 голосов
/ 24 декабря 2011

У меня есть цикл for в моем коде C следующим образом:

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

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

}

Мы видим, что вычисление каждой итерации не зависит от других (порядок элементов в a[] для меня не важен). Я хочу распараллелить вычисление этого цикла for, используя многопоточность. Я не совсем в курсе, как это сделать в C? У меня 8-процессорная машина, поэтому я могу параллельно запускать 8 потоков.

Ответы [ 2 ]

14 голосов
/ 24 декабря 2011

В C * нет переносимого способа сделать параллелизм.Однако широко поддерживается стандарт OpenMP :

#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>

РЕДАКТИРОВАНИЕ:

* (Недавно утвержденный) стандарт C11 поддерживает потоки через <threads.h>.

1 голос
/ 14 декабря 2016

Если ваш компилятор поддерживает стандарт 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...