当结合 BSP 库和 std::vector 时,我无法在核心之间发送数据

When combining the BSP library and std::vector, I cannot send data between cores

我正在使用 BSP 库制作一个并行程序。作为某种观点,我声明了一些

std::vector<size_t> segmentPrimes

在每个核心上,并在程序运行时填充它们。然后我想将所有这些向量聚合到核心 0(第一个核心)上的一个长向量中。但是,由于某种原因,这不起作用。

bsp_put

由于某种原因,这里的命令无法正常运行,或者我搞砸了。这是我的问题的简单 MWE

#include <vector>
#include <iostream>
extern "C" {
#include <mcbsp.h>
}


using namespace std;
int main(){
  bsp_begin(4); // start parallel part with 4 cores
  vector<size_t> segmentPrimes; 
  unsigned long core = bsp_pid(); // gives id number of the current core

  for (int i = 0; i < 10; i++)
    segmentPrimes.push_back(i + 10*core); // each vector initialized to something illustrative 
  if (core == 0)
    segmentPrimes.resize(4*10,0); // make the vector in core 0 larger 

  bsp_push_reg(&segmentPrimes,segmentPrimes.size()*sizeof(size_t)); // register the vectors
  bsp_sync();

  for (int i = 1; i < 4; i++){
    if (core == i) // each core sends their vector to part of the vector in core 0
      bsp_put(0,&segmentPrimes,&segmentPrimes,(i*10)*sizeof(size_t),10*sizeof(size_t));
    bsp_sync();
  }

  if (core == 0) // print the resulting vector on core 0
    for (int i = 0; i < segmentPrimes.size(); i++)
      cout << segmentPrimes[i]; 

  bsp_end(); // finish parallel part

  return 0;
}

谁能确定是什么问题?我没有收到任何错误消息,但输出如下

0123456789000000000000000000000000000000

而这个数字应该会不断增加。提前致谢!

编辑:顺便说一句,我用命令编译

g++ FILENAME.cpp -L../bsp/lib -lmcbsp1.2.0 -lpthread 

编辑。对于那些感兴趣的人,工作核心

#include <vector>
#include <iostream>
extern "C" {
#include <mcbsp.h>
}


using namespace std;
int main(){
  bsp_begin(4); // start parallel part with 4 cores
  vector<size_t> segmentPrimes; 
  unsigned long core = bsp_pid(); // gives id number of the current core

  for (int i = 0; i < 10; i++)
    segmentPrimes.push_back(i + 10*core); // each vector initialized to something illustrative 
  if (core == 0)
    segmentPrimes.resize(4*10,0); // make the vector in core 0 larger 

  bsp_push_reg(&(segmentPrimes[0]),segmentPrimes.size()*sizeof(size_t)); // register the vectors
  bsp_sync();

  for (int i = 1; i < 4; i++){
    if (core == i) // each core sends their vector to part of the vector in core 0
      bsp_put(0,&(segmentPrimes[0]),&(segmentPrimes[0]),(i*10)*sizeof(size_t),10*sizeof(size_t));
    bsp_sync();
  }

  if (core == 0) // print the resulting vector on core 0
    for (int i = 0; i < segmentPrimes.size(); i++)
      cout << segmentPrimes[i] << "\t";

  bsp_end(); // finish parallel part

  return 0;
}

C++ 中的向量的行为不像数组。在内部,它们有一个指向数据所在位置的指针。所以,发送这个:

bsp_put(0,&segmentPrimes,&segmentPrimes,(i*10)*sizeof(size_t),10*sizeof(size_t));

永远不会发送数据。就像发送一个指针,但不是它的内容。

改用数组。

被迫使用向量

如果您因某种原因被迫使用 Vector,您可以:

  • 因为 C++11 使用 segmentPrimes.data() 而不是 &segmentPrimes。
  • 使用 &segmentPrimes[0] 而不是 &segmentPrimes。