行列乗算プログラムを作成していますが、さまざまなサイズのさまざまな行列の実行時間を確認する必要があります。次に、メインの pthreads を使用してコードを並列化する必要があるため、初期化関数と乗算関数を含む 1 つのヘッダー ファイルを作成し、メインを別の .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;
}
誰かがこの問題を克服するのを手伝ってくれたら、うれしいです。さらに質問があります。乗算の結果の値を保持する最終行列も動的に割り当てる必要がありますか?