並列計算ライブラリMPIを使う際に、多次元vector配列の送受信を行いたいと考えています。送受信を行う際に、多次元vector配列の先頭アドレスが必要になるのですが、例えば以下のサンプルのように(ここではわざわざvectorを使う必要はありませんが)MPI_Reduceを書いても上手くいきません。ちなみにvectorを使わないと成功します。
どなたか教えていただけるとありがたいです。
以下のサンプルは成功するとw
の全要素に3
が入ります。
使用ライブラリはOpen MPI 2.0.1です。
vect_test.cpp
1#include <mpi.h> 2#include <iostream> 3#include <vector> 4 5using namespace std; 6 7int main(int argc, char **argv){ 8 9 int i, j, k, my_rank, p; 10 int n_value = 2; 11 int n_visible = 3; 12 int n_hidden = 4; 13 14 std::vector<std::vector<std::vector<double>>> w; 15 std::vector<std::vector<std::vector<double>>> vect3d; 16 17 MPI_Init(&argc, &argv); 18 MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 19 MPI_Comm_size(MPI_COMM_WORLD, &p); 20 21 w.resize(n_value); 22 for(auto &ref :w) { 23 ref.resize(n_visible); 24 for(auto &ref2 :ref){ 25 ref2.resize(n_hidden); 26 for(auto &ref3 :ref2){ 27 ref3 = 0.0; 28 } 29 } 30 } 31 32 vect3d.resize(n_value); 33 for(auto &ref :vect3d) { 34 ref.resize(n_visible); 35 for(auto &ref2 :ref){ 36 ref2.resize(n_hidden); 37 for(auto &ref3 :ref2){ 38 ref3 = (double)my_rank; 39 } 40 } 41 } 42 43 if(my_rank==0){ 44 for(i=0; i<n_value; i++){ 45 for(j=0; j<n_visible; j++){ 46 for(k=0; k<n_hidden; k++){ 47 printf("w[%d][%d][%d]=%f \n", i, j, k, w[i][j][k]); 48 } 49 } 50 } 51 printf("\n"); 52 } 53 54 MPI_Reduce(&vect3d[0][0][0], &w[0][0][0], n_value * n_visible * n_hidden, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); 55 56 if(my_rank==0){ 57 for(i=0; i<n_value; i++){ 58 for(j=0; j<n_visible; j++){ 59 for(k=0; k<n_hidden; k++){ 60 printf("w[%d][%d][%d]=%f \n", i, j, k, w[i][j][k]); 61 } 62 } 63 } 64 printf("\n"); 65 } 66 67 MPI_Finalize(); 68 return 0; 69}
$ mpic++ -std=c++11 vect_test.cpp -o vect_test $ mpirun -np 3 ./vect_test w[0][0][0]=0.000000 w[0][0][1]=0.000000 w[0][0][2]=0.000000 w[0][0][3]=0.000000 w[0][1][0]=0.000000 w[0][1][1]=0.000000 w[0][1][2]=0.000000 w[0][1][3]=0.000000 w[0][2][0]=0.000000 w[0][2][1]=0.000000 w[0][2][2]=0.000000 w[0][2][3]=0.000000 w[1][0][0]=0.000000 w[1][0][1]=0.000000 w[1][0][2]=0.000000 w[1][0][3]=0.000000 w[1][1][0]=0.000000 w[1][1][1]=0.000000 w[1][1][2]=0.000000 w[1][1][3]=0.000000 w[1][2][0]=0.000000 w[1][2][1]=0.000000 w[1][2][2]=0.000000 w[1][2][3]=0.000000 w[0][0][0]=3.000000 w[0][0][1]=3.000000 w[0][0][2]=3.000000 w[0][0][3]=3.000000 w[0][1][0]=3.000000 w[0][1][1]=0.996108 w[0][1][2]=3.000000 w[0][1][3]=3.000000 w[0][2][0]=0.000000 w[0][2][1]=0.000000 w[0][2][2]=0.000000 w[0][2][3]=0.000000 w[1][0][0]=0.000000 w[1][0][1]=0.000000 w[1][0][2]=0.000000 w[1][0][3]=0.000000 w[1][1][0]=0.000000 w[1][1][1]=0.000000 w[1][1][2]=0.000000 w[1][1][3]=0.000000 w[1][2][0]=0.000000 w[1][2][1]=0.000000 w[1][2][2]=0.000000 w[1][2][3]=0.000000 vect_test(47908,0x7fff9b8e73c0) malloc: *** error for object 0xff7f8e9782d0: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug [] *** Process received signal *** [] Signal: Abort trap: 6 (6) [] Signal code: (0) [] [ 0] 0 libsystem_platform.dylib 0x00007fff92dd4bba _sigtramp + 26 [] [ 1] 0 ??? 0x000000011a78e968 0x0 + 4739098984 [] [ 2] 0 libsystem_c.dylib 0x00007fff92c5b420 abort + 129 [] [ 3] 0 libsystem_malloc.dylib 0x00007fff92d4b097 szone_size + 0 [] [ 4] 0 libopen-pal.20.dylib 0x000000010d60450f mca_base_var_enum_destructor + 52 [] [ 5] 0 libmpi.20.dylib 0x000000010d4917ab ompi_win_finalize + 354 [] [ 6] 0 libmpi.20.dylib 0x000000010d4901fb ompi_mpi_finalize + 870 [] [ 7] 0 vect_test 0x000000010d4655ea main + 4906 [] [ 8] 0 libdyld.dylib 0x00007fff92bc7255 start + 1 [] *** End of error message *** -------------------------------------------------------------------------- mpirun noticed that process rank 0 with PID 0 on node !my_name! exited on signal 6 (Abort trap: 6). --------------------------------------------------------------------------
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/10 12:01