【问题标题】:Share 3D array between threads using pThreads使用 pThreads 在线程之间共享 3D 数组
【发布时间】:2013-03-31 10:25:46
【问题描述】:

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

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

#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。

谁能解释我做错了什么?

提前谢谢你!

【问题讨论】:

  • 首先,您假设float v1[MAX_X][MAX_Y][2]float *** 是兼容的;他们肯定不是。第一个是一个连续的 MAX_X*MAX_Y*2 个浮点数块。第二个是指向零个或多个指针的指针,指向零个或多个指向零个或多个浮点数的指针。在这个银河系或我们的邻居仙女座星系中,这两件事完全不同。
  • 谢谢,感谢您的评论,我刚刚解决了这个问题,方法是在函数签名和结构中将我的数组声明为 (*v1)[MAX_Y][2]。现在可以了,非常感谢!

标签: c++ c parallel-processing pthreads


【解决方案1】:

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

解决方案是:

  • 使用pthread_join
  • 之类的方法延迟函数serialFunction() 的退出
  • 在静态/全局/动态存储上分配数据,以将其生命周期与函数范围分离。

【讨论】:

  • 感谢您的快速答复!你是对的,我忘记加入线程了。关于指向数组的指针,我的语法还有一些其他问题,但它现在似乎适用于连接解决方​​案和全局变量。非常感谢!
猜你喜欢
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多