행렬을 곱하기 위해 쓰레드를 사용하여 코드를 작성하는 데 문제가 있습니다. 나는 경고를하지 않는다 (나는 std = c99 -Wall -pedantic -lpthread로 컴파일한다.) 그러나 내가 코드를 사용하려고 할 때 나는 항상 코어 덤프에 문제가있다. 나는 내 코드를 여기에두고 정말 미쳐 버리기 때문에 어떤 조언을 해주지. 나는 내가 무엇을 고칠 수 있는지 전혀 모른다. 나는 영감을 this link.C에서 스레드를 사용하여 곱셈 행렬
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include <stdlib.h>
#include "sys/types.h"
#include "unistd.h"
#include "pthread.h"
int xA;
int yA;
int xB;
int yB;
int xC;
int yC;
int* mA;
int* mB;
int* mC;
pthread_t* thread;
int numOfThread;
int **ap = &mC;
int **A = &mA;
int **B = &mB;
int* allocResultMatrix(int xA, int yB, int *xC, int *yC){
*xC = xA;
*yC = yB;
return (int *) malloc(sizeof(int) *(*xC * *yC));
}
void makeMatrix(int **ar, int x, int y){
*ar = (int *)malloc(sizeof(int) *(x * y));
int k = -1;
int range = 1000;
for(int i = 0; i < x; i++){
for(int j = 0; j < y; j++){
(*ar)[++k] = rand() % range;
}
}
}
void* multiply(void* slice){
int s = (int)slice;
int from = (s * xA)/numOfThread;
int to = ((s+1) * xA)/numOfThread;
for (int i = from; i < to; i++){
for (int j = 0; j < yB; j++){
ap[i][j] = 0;
for (int k = 0; k < yA; k++){
ap[i][j] += A[i][k]*B[k][j];
}
}
}
return 0;
}
void printMatrix(int *ar, int x, int y)
{
int k = -1;
for(int i = 0; i < x; i++){
printf(" ");
for(int j = 0; j < y; j++){
printf("%9d", ar[++k]);
}
printf("\n");
}
printf("\n");
}
int main(int argc, char* argv[]){
if(argc == 6){
printf("\n");
numOfThread = atoi(argv[1]);
if(atoi(argv[2]) > 0 && atoi(argv[2]) <= 10000 && atoi(argv[3]) > 0 && atoi(argv[3]) <= 10000 && atoi(argv[4]) > 0 && atoi(argv[4]) <= 10000 && atoi(argv[5]) > 0 && atoi(argv[5]) <= 10000){
xA = atoi(argv[2]);
yA = atoi(argv[3]);
xB = atoi(argv[4]);
yB = atoi(argv[5]);
}
else {
printf("bad dimensions");
return 0;
}
if(yA != xB){
printf("yA should be equal with xB\n");
return 0;
}
srand((unsigned)time(NULL));
makeMatrix(&mA, xA, yA);
printMatrix(mA, xA, yA);
makeMatrix(&mB, xB, yB);
printMatrix(mB, xB, yB);
thread = (pthread_t*) malloc(numOfThread * sizeof(pthread_t));
mC = allocResultMatrix(xA, yB, &xC, &yC);
for (int iterator = 1; iterator < numOfThread; iterator++){
if (pthread_create (&thread[iterator], NULL, multiply, (void*)iterator) != 0){
perror("er!\n");
free(thread);
return 1;
}
}
multiply(0);
for (int i = 1; i < numOfThread; i++)
pthread_join(thread[i], NULL);
printf("\nresult\n");
printMatrix(mC, xC, yC);
free(thread);
}
return 0;
}
가 코어 덤프를 분석하기 위해 디버거를 사용합니다. –
이 코드를 작성하는 것은 번거롭지 않으며, 많은 시간 전에 작성되었습니다. 예 : https://code.google.com/p/scalalab/wiki/FastCMatrixMultiplicationUsingPThreads 및 http://heshans.blogspot.sg/2009/05/matrix-multiplication-using-pthread.html –