2015-01-09 5 views
0

행렬을 곱하기 위해 쓰레드를 사용하여 코드를 작성하는 데 문제가 있습니다. 나는 경고를하지 않는다 (나는 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; 
} 
+4

가 코어 덤프를 분석하기 위해 디버거를 사용합니다. –

+0

이 코드를 작성하는 것은 번거롭지 않으며, 많은 시간 전에 작성되었습니다. 예 : https://code.google.com/p/scalalab/wiki/FastCMatrixMultiplicationUsingPThreads 및 http://heshans.blogspot.sg/2009/05/matrix-multiplication-using-pthread.html –

답변

0

1 차원 배열을 할당하고 2 차원 배열로 액세스하려고합니다.

특히 multiplyMatrix에서 표현식 ap[i][j]은 정수 배열에 대한 포인터 배열을 사용한다고 가정합니다.

Klocwork 또는 이와 유사한 도구로 코드를 실행하면 i=[0..xA*yB]j=0 값에 대해서만 ap[i][j]이 유효하다는 것을 알 수 있습니다.

int **allocate(int x, int y) 
{ 
    int **result = malloc(x * sizeof(int*)); 
    for (int i = 0; i < y; i++) 
    { 
     result[i] = malloc(y * sizeof(int)); 
    } 
    return result; 
} 

또는 단일 차원에 거는 :

두 차원 배열을 할당 할 수

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 * yB + j] = 0; 
    for (int k = 0; k < yA; k++) 
    { 
     ap[i * yB + j] += A[i * yA + k]*B[k * yB + j]; 
    } 
    } 
} 
+0

좋아, 그것은 여전히 ​​일을하지 않습니다. 예를 들어, 두 번째 옵션이있는 경우 : 오류 : 이진수에 대한 잘못된 피연산자 * ('int *'및 'int *'포함) – Mark

+0

알았어, 고마워. – Mark