質問編集履歴

2

解決済み

2021/10/08 05:31

投稿

y_huto
y_huto

スコア3

test CHANGED
@@ -1 +1 @@
1
- c言語 MPI_Gatherを使用した二次元配列受け渡しに関する質問
1
+ 解決済みの質問です。
test CHANGED
@@ -1,245 +1,7 @@
1
- cにて、MPIを使用して並列計算を行い、二次元配列の受け渡すコードを実装したいと考えております。
2
-
3
-
4
-
5
- 以下のようなサンプルコードを作成したのですが、このままでは
6
-
7
- 確保していないメモリにアクセスしてしまいエラーを起こしてしまします。
8
-
9
- 恐らく/* localの行数決定 */の箇所のelse部分で、
10
-
11
- 一番最後のプロセスのtoの決定がうまく処理できていないことが原因なのではないかと考えております。
12
-
13
-
14
-
15
- 以下がソースコードになります。
16
-
17
- mpi_sample.c
18
-
19
- ```c
1
+ 解決済み
20
-
21
- #include <stdio.h>
22
-
23
- #include <stdlib.h>
24
-
25
-
26
-
27
- //mpi path
28
-
29
- #include "/usr/local/openmpi-4.1.1/include/mpi.h" /*if use local computer */
30
-
31
- //#include "mpi.h" /*if use super_computer*/
32
-
33
-
34
-
35
- void main(int argc, char **argv){
36
-
37
- int i, j, k;
38
-
39
- int l = 10;//global配列の長さ
40
-
41
- int row, from, to;
42
-
43
- double **ary_global, **ary_local;
44
-
45
-
46
-
47
- /* MPI Parameters */
48
-
49
- int myID, numProcs;
50
-
51
- MPI_Status mpi_status;
52
-
53
-
54
-
55
- /* MPI初期化 */
56
-
57
- MPI_Init(&argc, &argv);
58
-
59
- MPI_Comm_rank(MPI_COMM_WORLD, &myID);//プロセス番号
60
-
61
- MPI_Comm_size(MPI_COMM_WORLD, &numProcs);//プロセスのサイズ
62
-
63
-
64
-
65
- /* localの行数決定 */
66
-
67
- row = l / numProcs + 1;//from,toの幅
68
-
69
- from = row*myID;
70
-
71
- if(myID < numProcs - 1){
72
-
73
- to = row*(myID + 1) - 1;
74
-
75
- }else{//一番最後のPID
76
-
77
- to = l;
78
-
79
- }
80
-
81
-
82
-
83
- /* ary_local,grobal確保 */
84
-
85
- ary_local = (double **)malloc(sizeof(double *) * row);
86
-
87
- for(i = 0; i < row; i++) ary_local[i] = (double *)malloc(sizeof(double) * l);
88
-
89
- ary_global = (double **)malloc(sizeof(double *) * (row * numProcs));
90
-
91
- for(i = 0; i < row * numProcs; i++) ary_global[i] = (double *)malloc(sizeof(double) * l);
92
-
93
-
94
-
95
- /*globalに初期値-1を代入 */
96
-
97
- for(i = 0; i < row*numProcs; i++){
98
-
99
- for(j = 0; j < l; j++){
100
-
101
- ary_global[i][j] = -1;
102
-
103
- }
104
-
105
- }
106
-
107
-
108
-
109
- /* ary_localに値代入 */
110
-
111
- for(i = from; i < to; i++){
112
-
113
- for(j = 0; j < l; j ++){
114
-
115
- if(i == j){
116
-
117
- ary_local[i][j] = -1;
118
-
119
- }else{
120
-
121
- ary_local[i][j] = i*j;
122
-
123
- }
124
-
125
- }
126
-
127
- }
128
-
129
-
130
-
131
- /* localからglobalへ渡す */
132
-
133
- MPI_Gather(& ary_local[0][0], row * l, MPI_DOUBLE,
134
-
135
- & ary_global[0][0], row * l, MPI_DOUBLE, 0, MPI_COMM_WORLD);
136
-
137
-
138
-
139
- /* globalの内容表示 */
140
-
141
- if(myID == 0){
142
-
143
- for(i = 0; i < row * numProcs; i ++){
144
-
145
- for(j = 0; j < l; j ++){
146
-
147
- printf("%lf, ",ary_global[i][j]);
148
-
149
- }
150
-
151
- printf("\n");
152
-
153
- }
154
-
155
- }
156
-
157
-
158
-
159
- /* ary_local,grobal free() */
160
-
161
- for(i = 0; i < row; i++) free(ary_local[i]);
162
-
163
- free(ary_local);
164
-
165
-
166
-
167
- for(i = 0; i < row * numProcs; i++) free(ary_global[i]);
168
-
169
- free(ary_global);
170
-
171
-
172
-
173
- MPI_Barrier(MPI_COMM_WORLD);
174
-
175
- MPI_Finalize();
176
-
177
- }
178
-
179
-
180
-
181
- ```
182
-
183
-
184
-
185
- 以下がプロセス数2で実行した際の結果です。
186
-
187
- ```terminal
188
-
189
- $ mpicc -I/usr/local/openmpi-4.1.1/include -c mpi_sample.c
190
-
191
- $ mpicc -I/usr/local/openmpi-4.1.1/include -g mpi_sample.o -o mpi_sample
192
-
193
- $ mpirun -np 2 ./mpi_sample
194
-
195
- *** Process received signal ***
196
-
197
- Signal: Segmentation fault (11)
198
-
199
- Signal code: Address not mapped (1)
200
-
201
- Failing at address: (nil)
202
-
203
- [ 0] /lib/x86_64-linux-gnu/libc.so.6(+0x41100)[0x7f0ff7618100]
204
-
205
- [ 1] ./mpi(+0x1401)[0x560c4a75d401]
206
-
207
- [ 2] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xeb)[0x7f0ff75fb09b]
208
-
209
- [ 3] ./mpi(+0x111a)[0x560c4a75d11a]
210
-
211
- *** End of error message ***
212
-
213
- --------------------------------------------------------------------------
214
-
215
- Primary job terminated normally, but 1 process returned
216
-
217
- a non-zero exit code. Per user-direction, the job has been aborted.
218
-
219
- --------------------------------------------------------------------------
220
-
221
- --------------------------------------------------------------------------
222
-
223
- mpirun noticed that process rank 1 with PID 0 on node zenbook14 exited on signal 11 (Segmentation fault).
224
-
225
- --------------------------------------------------------------------------
226
-
227
- ```
228
2
 
229
3
 
230
4
 
231
5
 
232
6
 
233
- 実装したいことは、
234
-
235
- ary_local[row][l]で計算した結果を,ary_global[row * numProcs][l]にまとめるということです。
236
-
237
-
238
-
239
- MPIに疎いため、原因と考えている事とは別の原因があるのかもしれませんが、
240
-
241
- はわからなかっため質問させてただきました。
7
+ 己解決したの削除しまし、ありがとうございました。
242
-
243
-
244
-
245
- 申し訳ございませんが、改善案や別の良い実装方法があればお伺いしたいです。よろしくおねがいします。

1

誤字

2021/10/08 05:30

投稿

y_huto
y_huto

スコア3

test CHANGED
@@ -1 +1 @@
1
- c MPI_Gatherを使用した二次元配列の受け渡しに関する質問
1
+ c言語 MPI_Gatherを使用した二次元配列の受け渡しに関する質問
test CHANGED
@@ -1,4 +1,4 @@
1
- cにて、MPIを使用して並列計算を行って二次元配列の受け渡すコードを実装したいと考えております。
1
+ cにて、MPIを使用して並列計算を行い、二次元配列の受け渡すコードを実装したいと考えております。
2
2
 
3
3
 
4
4
 
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
 
15
-
15
+ 以下がソースコードになります。
16
16
 
17
17
  mpi_sample.c
18
18
 
@@ -182,6 +182,8 @@
182
182
 
183
183
 
184
184
 
185
+ 以下がプロセス数2で実行した際の結果です。
186
+
185
187
  ```terminal
186
188
 
187
189
  $ mpicc -I/usr/local/openmpi-4.1.1/include -c mpi_sample.c