1

我是并行编程的新手,我正在尝试使用 pThreads 并行化应用程序。我有一个函数可以浏览 3D 数组,计算一些东西并将结果存储到另一个 3D 数组中。该函数使用两个 for 循环遍历数组(第三维是 2)。

i我的想法是在不同线程之间共享周围的 for 循环(带有索引)。这是我要并行化的函数:

#define MAX_X 100
#define MAX_Y 100

void serialFunction(float v1[MAX_X][MAX_Y][2], float v2[MAX_X][MAX_Y][2]) {
     int i,j;
     for(i=0;i<MAX_X;i++) {
         for(j=0;j<MAX_Y;j++) {
            v2[i][j][0] = 2*v1[i][j][1];
            v2[i][j][1] = -3*v1[i][j][0];
         }
     }
}

我试图做出这些改变:

struct thread_data {
  int start;
  int end;
  float ***v1;
  float ***v2;
};


void serialFunction(float v1[MAX_X][MAX_Y][2], float v2[MAX_X][MAX_Y][2]) {
   int t;
   pthread_t threads[NB_CPUS];
   int startBoundaries[NB_CPUS], endBoundaries[NB_CPUS];
   struct thread_data data[NB_CPUS];
   computeBoundaries(startBoundaries, endBoundaries);
   for(t=0;t<NB_CPUS;t++) {
      data[t].start = startBoundaries[t];
      data[t].end = endBoundaries[t];
      data[t].v1 = (float***)v1;
      data[t].v2 = (float***)v2;
      pthread_create(&threads[t], NULL, threadedFunction, (void*)&data[t]);
   }
}



void *threadedFunction(void *threadArg) {
   struct thread_data *data = (struct thread_data*)threadArg;
   float ***v1 = data->v1;
   float ***v2 = data->v2;
   int i,j;

   for(i=data->start;i<data->end;i++) {
      for(j=0;j<PIC_Y;j++) {
         v2[i][j][0] = 2*v1[i][j][1];
         v2[i][j][1] = -3*v1[i][j][0];
   }
}

问题是,当我运行代码时,每次threadedFunction尝试访问v1. 它的行为好像v1不会被分配,我不明白为什么。这种情况即使serialFunction没有走到尽头也会发生。

限制是我不能更改serialFunction签名,我必须使用 pThreads。

谁能解释我做错了什么?

先感谢您!

4

1 回答 1

0

您传递给线程的数据是为函数创建的本地/自动数据serialFunction()。您将指向此数据的指针作为参数传递给线程函数。函数退出时数据不保证存在。请注意,在线程函数中访问数据之前serialFunction(),您的代码中没有任何内容会停止退出。如果在通过 in 指针访问数据之前退出,你得到的是未定义的行为和你现在遇到的情况。threadedFunction()serialFunction()threadedFunction()

解决方案是:

  • serialFunction()通过使用类似pthread_join或的东西来延迟函数的退出
  • 在静态/全局/动态存储上分配数据,以将其生命周期与函数范围分离。
于 2013-03-31T10:31:55.630 回答