2013-03-16 2 views
5

각 행이 하나의 곱셈을 수행하는 쓰레드를 사용하여 행렬 곱셈을 수행하고 나서 주 스레드가 모든 결과를 더하고 적절한 마지막 행렬에 자리 잡는다 (다른 스레드가 종료 된 후).행렬에 행렬 곱하기 (각각의 쓰레드는 단일 곱셈을합니다.)

나는 그것을하려고하는 방법은 각 스레드의 결과를 보유하는 단일 행 배열을 만드는 것입니다. 그런 다음 배열을 통해 최종 매트릭스에 결과를 추가합니다.

예 :

A = [{1,4}, {2,5}, {3,6}] B = {8,7,6}, {는 행렬이 있으면 5,8,3}]

[8, 20, 7, 16, 6, 12, 16 등]을 가진 배열을 원합니다. 배열을 통해 2 개의 숫자를 모두 더하고 배열하는 것이 좋습니다. 내 마지막 배열.

정확한 코드는 찾고 있지 않지만 결과를 배열에 올바르게 저장하는 방법에 대한 일부 논리는 하드웨어 지정입니다. 나는 각 행렬에있는 위치를 추적하여 어떤 숫자도 놓치지 않도록하는 방법에 어려움을 겪고 있습니다.

감사합니다.

EDIT2 : 수행 할 모든 단일 곱셈에 대해 단일 스레드가 있어야한다는 것을 잊어 버렸습니다. 위의 예에서 의미하는 바는 각각 18 개의 스레드가 자체 계산을 수행합니다.

편집 : 현재이 코드를 기반으로 사용하고 있습니다.

#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 

#define M 3 
#define K 2 
#define N 3 
#define NUM_THREADS 10 

int A [M][K] = { {1,4}, {2,5}, {3,6} }; 
int B [K][N] = { {8,7,6}, {5,4,3} }; 
int C [M][N]; 

struct v { 
    int i; /* row */ 
    int j; /* column */ 
}; 

void *runner(void *param); /* the thread */ 

int main(int argc, char *argv[]) { 

    int i,j, count = 0; 
    for(i = 0; i < M; i++) { 
     for(j = 0; j < N; j++) { 
     //Assign a row and column for each thread 
     struct v *data = (struct v *) malloc(sizeof(struct v)); 
     data->i = i; 
     data->j = j; 
     /* Now create the thread passing it data as a parameter */ 
     pthread_t tid;  //Thread ID 
     pthread_attr_t attr; //Set of thread attributes 
     //Get the default attributes 
     pthread_attr_init(&attr); 
     //Create the thread 
     pthread_create(&tid,&attr,runner,data); 
     //Make sure the parent waits for all thread to complete 
     pthread_join(tid, NULL); 
     count++; 
     } 
    } 

    //Print out the resulting matrix 
    for(i = 0; i < M; i++) { 
     for(j = 0; j < N; j++) { 
     printf("%d ", C[i][j]); 
     } 
     printf("\n"); 
    } 
} 

//The thread will begin control in this function 
void *runner(void *param) { 
    struct v *data = param; // the structure that holds our data 
    int n, sum = 0; //the counter and sum 

    //Row multiplied by column 
    for(n = 0; n< K; n++){ 
     sum += A[data->i][n] * B[n][data->j]; 
    } 
    //assign the sum to its coordinate 
    C[data->i][data->j] = sum; 

    //Exit the thread 
    pthread_exit(0); 
} 

출처 : 당신이 필요 http://macboypro.wordpress.com/2009/05/20/matrix-multiplication-in-c-using-pthreads-on-linux/

+1

이것은 대략 10 만회 전에 수행되었습니다.당신은 머신에서 CPU 코어 카운트'C'를 결정하고, 행 x 열 벡터 곱셈이 얼마나 필요한지 결정하고, 후자를 전자 (대략)로 나눈 값을' C' 스레드는 서로 독립적으로 처리됩니다. 임의의 모듈러스 ('C-1'까지의 추가 벡터)는 첫 x 째 스레드 계열에 대한 추가 승수로 전송됩니다. 좀 더 효율적이고 간단한 알고리즘을 얻으려면 특히 잠금이 전혀 필요 없다고 생각하면 어렵습니다. – WhozCraig

+0

죄송합니다. 명확하지 않았습니다. 할당에 따라 수행해야하는 모든 단일 곱셈에 대해 하나의 스레드가 있어야합니다. 즉, 내가 준 예제 행렬에는 18 개의 곱셈을하는 18 개의 스레드가 있습니다. 효율적인 것은 아닙니다. 그것은 단지 HW 운동입니다. – Kinru

+0

그래, 나는 단지 운동이어야한다고 생각한다. 이 개념은'A [500] [800] x B [800] [1000]과 같은 것을 취할 때 꽤 빨리 저하됩니다. 더 커질수록 더 많은 시간을 할애 할 수 있습니다. 아 ~. 행운을 빕니다! – WhozCraig

답변

0

확실하지 산사 나무의 열매 많은 스레드를 파견하고, 나는 또한 당신이 그들을 데리러 나중에 조인을 사용하면 것인지 모르겠습니다. 내가 처리 할 행 추적하는 방법으로 스레드 ID를 사용하는 것이 그래서 난 당신이 여기에 C에 추측하고 .. 뭔가 같은 :

#define NUM_THREADS 64 
/* 
* struct to pass parameters to a dispatched thread 
*/ 
typedef struct { 
    int value;  /* thread number */ 
    char somechar[128]; /* char data passed to thread */ 
    unsigned long ret; 
    struct foo *row; 
} thread_parm_t; 

나는 각 스레드에서 해당 행의 데이터를 선택할 것이라고 추측하고 어디 정의 된 타입 foo를 가진 포인터 * 행. 정수 또는 수레 또는 복잡한 유형의 무리. 스레드에 전달할 필요가있는 모든 것.

/* 
* the thread to actually crunch the row data 
*/ 
void *thr_rowcrunch(void *parm); 

pthread_t tid[NUM_THREADS]; /* POSIX array of thread IDs */ 

는 다음과 같은 기본 코드 세그먼트 뭔가 : 나중에 그런

for (i = 0; i < NUM_THREADS; i++) { 
    parm = malloc(sizeof(thread_parm_t)); 
    parm->value = i; 
    strcpy(parm->somechar, char_data_to-pass); 
    fill_in_row (parm->row, my_row_data); 
    pthread_create(&tid[i], NULL, thr_insert, (void *)parm); 
} 

:

for (i = 0; i < NUM_THREADS; i++) 
    pthread_join(tid[i], NULL); 

그러나

thread_parm_t *parm=NULL; 

는 다음과 같은 뭔가 스레드를 파견 진짜 일은 필요하다. o 행 데이터를받는 thr_rowcrunch (void * parm)에서 수행 한 다음 각 스레드는 자체 스레드 번호를 알고 있습니다. 그 파견 된 실에서 당신이하는 일의 용기는 그러나 나는 단지 추측 할 수 있습니다.

여기에 도움을 주려하지만, 분명하지 않은지 확실하지 않습니다.

+0

행렬 곱셈에 대한 실제 입력 데이터를 공유 할 수 있습니까? 나는 내 자신의 이유로이 문제에 실제로 관심이있다. 나는 깔끔하게 스레드 된 솔루션을 개발하고 싶다. 솔루션을 만들기 위해 커피와 코드를 작성하는 것이 가치있는 방법이다. –

+0

실제 입력 데이터는 가변적입니다. 할당을 위해 우리는 행렬을 읽고 결과를 출력하기 위해 파일 I/O를 수행해야합니다. 내 질문과 관련이 없습니다. 코드는 행렬에 따라 달라서는 안되기 때문에이 원래의 게시물에서 예제를 사용하여이를 작동 시키려고했습니다. – Kinru