组合BSP库和std :: vector时,我无法在核心

时间:2015-10-11 18:56:13

标签: c++ parallel-processing

我正在使用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 

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

#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;
}

1 个答案:

答案 0 :(得分:1)

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

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

无法发送数据。就像发送指针一样,但不是它的内容。

改为使用数组。

强制使用矢量

如果你被某种方式强迫使用Vector,你可以:

  • 由于C ++ 11使用segmentPrimes.data()而不是&amp; segmentPrimes。
  • 使用&amp; segmentPrimes [0]代替&amp; segmentPrimes。