openMP没有充分理由粉碎(?)

时间:2017-12-11 21:47:47

标签: c multithreading openmp

我是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);
}

0 个答案:

没有答案