我正在尝试将多维数组中的一堆整数映射到映射内存中。我知道计算有效,因为我打印了多维数组,并且打印了正确的值。然后,我比较了double for循环中的值,在分配了多维数组的值之后,将它们打印在了mmapped内存中的位置,它们都对应于相同的值。
当我离开for循环并打印出映射内存中的内容时,只有第一个和最后一个值才能正确打印。相反,当我直接打印多维数组时,它确实会打印正确的值。我写入映射内存错误吗?
这是我的代码的(一部分)-我的程序有点大,所以我无法复制所有内容,而不会使其变得过于压倒性,但是我会尽力复制相关内容:
这是存储所需指针的结构; pthread_create()
调用需要struct:
21 typedef struct {
22 int *shmem1; //matrix 1
23 int *shmem2; //matrix 2
24 int matrix_size;
25 char *file;
26 int *shmem3; //result mmapping
27 } args_mm;
此代码是pthread_create()
所调用的,并且是主要问题所在。
180 void *multiply_matrices(void *arg)
181 {
182 args_mm *args = (args_mm *) arg;
183 printf("%d %d %d\n", args->shmem1[0], args->shmem2[0], args->matrix_size);
184 printf("%s\n", args->file);
185 int i,r,c;
186 int ms = args->matrix_size;
187 int m[ms][ms];
188 int item;
189 //printf("Resulting Matrix: %d\n", args->shmem3[0]);
190
191 for(r=0; r<ms; r++) {
192 for(c=0; c<ms; c++) {
193 m[r][c] = 0;
194 for(i=0; i<ms; i++) {
195 m[r][c] += (args->shmem1[r+i])*(args->shmem2[i+c]);
196 //args->shmem3[r+c] += (args->shmem1[r+i])*(args->shmem2[i+c]);
197 }
198 printf("\nBefore: %d, %d\t", m[r][c], args->shmem3[r+c]);
199 args->shmem3[r+c] = m[r][c];
200 printf("After: %d\n", args->shmem3[r+c]);
201 }
202 }
203
204 for(r=0;r<ms; r++) {
205 for(c=0; c<ms; c++) {
206 args->shmem3[r+c] = m[r][c];
207 printf("%d/%d ", args->shmem3[r+c], m[r][c]);
208 }
209 printf("\n");
210 }
211
212 printf("%d\n", args->shmem3[11]);
213
214 return NULL;
215 }
主程序的一部分(代码的其余部分仅分析标志并计算多维数组的大小。
217 int main(int argc, char *argv[])
218 {
239 //create mmap memory for both matrices
240 int *sh1 = create_mmap_mem(file1, file1_size, 0); //matrix 1 in here
241 int *sh2 = create_mmap_mem(file2, file2_size, 0); //matrix 2 in here
242 int *sh3 = create_mmap_mem(product_file, file1_size, 1); //result matrix here
243 args_mm args = {sh1, sh2, file1_size, product_file, sh3};
244
245 //divide the work evenly
246 //no of tasks simultaneously avail=matrix size^3
247 //printf("Shared Mem 1: %d\n", sh1[0]);
248 //printf("Shared Mem 2: %d\n", sh2[0]);
249 //printf("Thread size: %d\n", threadsize);
250
251 //for(i=0; i<threadsize+1; i++) {
252 pthread_create(&p, NULL, multiply_matrices, &args);
253 pthread_join(p, NULL);
254 //}
这是我自己打印多维数组(m[r][c]
)时的输出:
1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 1
这是打印映射的内存(args->shmem3[r+c]
)时的输出:
1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1
希望我解释得足够好。如果需要,我可以澄清任何事情。我已经坚持了很长一段时间,我想知道我是否看不到这明显的东西?谢谢。
我不认为这
199 args->shmem3[r+c] = m[r][c];
是您想要的。而是:
199 args->shmem3[r*args->matrix_size+c] = m[r][c];