我的C代码中有一个for循环,如下所示:
for(i=0; i<100000; i++){
a[i] = simulate(); // simulate() function simulates some system
}
我们看到每次迭代的计算都独立于其他迭代(a[]
中元素的顺序对我来说并不重要)。我想使用多线程并行化这个for循环的计算。我不完全清楚如何在C中这样做?我有一台8处理器的机器,所以我可以并行运行8个线程。
答案 0 :(得分:14)
在C *中没有可移植的并行方法。但是,OpenMP standard受到广泛支持:
#pragma omp parallel for
for(i=0; i<100000; i++){
a[i] = simulate(); // simulate() function simulates some system
}
根据您的编译器,您必须设置一个标志以启用OpenMP支持:
/openmp
-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;
}