当结合 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。
我正在使用 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。