我正在写一个矩阵乘法程序,我需要检查不同大小的不同矩阵的运行时间。然后我需要将我的代码与 main 中的 pthread 并行化,因此我创建了一个头文件,其中包括初始化和乘法函数,然后我的 main 在一个单独的 .c 文件中,但是当我执行我的程序时,我得到以下错误:
错误:分段错误(核心转储)
请注意,我正在尝试对大小为 1000 的方阵进行矩阵乘法。
这是我的代码:
// mm.h
#ifndef MM_H
#define MM_H
#include <stdlib.h>
#include <time.h>
int SIZE, NTHREADS;
int **A, **B, **C;
void init(int **A, int **B, int **C)
{
int i, j;
A = (int**)malloc(SIZE * sizeof(int *));
for(i = 0; i < SIZE; i++)
A[i] = malloc(SIZE * sizeof(int));
B = (int**)malloc(SIZE * sizeof(int *));
for(i = 0; i < SIZE; i++)
B[i] = malloc(SIZE * sizeof(int));
C = (int**)malloc(SIZE * sizeof(int *));
for(i = 0; i < SIZE; i++)
C[i] = malloc(SIZE * sizeof(int));
srand(time(NULL));
for(i = 0; i < SIZE; i++) {
for(j = 0; j < SIZE; j++) {
A[i][j] = rand()%100;
B[i][j] = rand()%100;
}
}
}
void mm(int **A, int **B, int **C)
{
int i, j, k;
for(i = 0; i < SIZE; i++) {
for(j = 0; j < SIZE; j++) {
C[i][j] = 0;
for(k = 0; k < SIZE; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
}
#endif
任何我的主要功能:
// mmserial.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "mm.h"
int main(int argc, char* argv[])
{
int i;
if(argc != 2)
{
printf("Usage: %s <size_of_square_matrix>\n", argv[0]);
exit(1);
}
SIZE = atoi(argv[1]);
init(A, B, C);
clock_t begin, end;
double time_spent;
begin = clock();
mm(A, B, C);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Elapsed time: %.2lf seconds.\n", time_spent);
for(i = 0; i < SIZE; i++)
free((void *)A[i]);
free((void *)A);
for(i = 0; i < SIZE; i++)
free((void *)B[i]);
free((void *)B);
return 0;
}
如果有人可以帮助我克服这个问题,我会很高兴。还有更多的问题,我是否也应该动态分配我的最终矩阵,它将保存乘法的结果值?