我是openMP的新手并遇到了一些问题。 我试着阅读文档,但徒劳无功。 可能我错过了一些基本的东西。 任何帮助将不胜感激。
无论如何,这里是我程序的骨架(符合gcc -O3 -fopenmp。 我也试过没有-O3。) - 为任何错别字道歉。 我试图使用openMP锁,但它导致了分段错误。 所以我使用自己的锁。 另一个问题是我需要为每个线程提供一个辅助(相对较大)的缓冲区。 我尝试将它分配为局部变量(在堆栈上?)但程序再次崩溃。 所以我事先用malloc分配它,每个线程一个。 但是,无论我尝试这样做,程序要么粉碎(堆栈溢出?),要么进入无限循环(原因我无法理解)。 没有线程,程序运行没有问题。
是否有任何我忽略的记忆因素(或其他)?
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <omp.h>
#define MAXT 1000 /* maximal thread number */
#define LOCKNUM 1000
int *buffers[MAXT],*tab[LOCKNUM],num[LOCKNUM];
void mainloop();
int main(int argc, char*argv[])
{
int maxt,t;
double ticp,tocp;
maxt=omp_get_max_threads();
printf("maximal number of threads = %d\n",maxt);
assert(maxt<=MAXT);
for (t=0;t<maxt;t++) {
buffers[t]=malloc(1<<20);
assert(buffers[t]!=NULL);
}
for (t=0;t<LOCKNUM;t++) {
tab[t]=malloc(1<<15);
assert(tab[t]!=NULL);
}
ticp=omp_get_wtime();
mainloop();
tocp=omp_get_wtime();
printf("Elapsed: %f seconds\n"tocp-ticp);
}
int dosth(int *);
void mainloop()
{
int ht,mylock[LOCKNUM];
for (ht=0; ht<LOCKNUM; ht++)
mylock[ht]=0;
int w;
#pragma omp parallel for
for (w=0;w<1<<25;w++) {
/* local variables */
int i,j,a[10],b[20],tnum,h;
...
/* local variables of total size < 1KB. My working hypothesis is that they are private by default. */
if (!w) printf("%d threads currently working\n",omp_get_num_threads());
tnum=omp_get_thread_num();
...
/* do some work using array buffers[tnum] */
...
/* calculate some integer h */
assert(h<LOCKNUM);
while (mylock[h]) dosth(mylock);
mylock[h]=1;
...
tab[h][num[h]++]= ....
...
mylock[h]=0;
...
#pragma omp critical (update)
{
...
}
}
}
/* do some pointless work to kill time */
int dosth(int *dummy)
{
int i;
int s=0;
for (i=0;i<1000;i++)
s+=i*(i-17);
return(s);
}