并行化C中的for循环

时间:2011-12-24 19:08:25

标签: c parallel-processing

我的C代码中有一个for循环,如下所示:

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

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

}

我们看到每次迭代的计算都独立于其他迭代(a[]中元素的顺序对我来说并不重要)。我想使用多线程并行化这个for循环的计算。我不完全清楚如何在C中这样做?我有一台8处理器的机器,所以我可以并行运行8个线程。

2 个答案:

答案 0 :(得分:14)

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

编辑:

*(最近批准的)C11标准通过<threads.h>支持线程。

答案 1 :(得分:1)

如果您的编译器支持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;
}