각 행이 하나의 곱셈을 수행하는 쓰레드를 사용하여 행렬 곱셈을 수행하고 나서 주 스레드가 모든 결과를 더하고 적절한 마지막 행렬에 자리 잡는다 (다른 스레드가 종료 된 후).행렬에 행렬 곱하기 (각각의 쓰레드는 단일 곱셈을합니다.)
나는 그것을하려고하는 방법은 각 스레드의 결과를 보유하는 단일 행 배열을 만드는 것입니다. 그런 다음 배열을 통해 최종 매트릭스에 결과를 추가합니다.
예 :
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/
이것은 대략 10 만회 전에 수행되었습니다.당신은 머신에서 CPU 코어 카운트'C'를 결정하고, 행 x 열 벡터 곱셈이 얼마나 필요한지 결정하고, 후자를 전자 (대략)로 나눈 값을' C' 스레드는 서로 독립적으로 처리됩니다. 임의의 모듈러스 ('C-1'까지의 추가 벡터)는 첫 x 째 스레드 계열에 대한 추가 승수로 전송됩니다. 좀 더 효율적이고 간단한 알고리즘을 얻으려면 특히 잠금이 전혀 필요 없다고 생각하면 어렵습니다. – WhozCraig
죄송합니다. 명확하지 않았습니다. 할당에 따라 수행해야하는 모든 단일 곱셈에 대해 하나의 스레드가 있어야합니다. 즉, 내가 준 예제 행렬에는 18 개의 곱셈을하는 18 개의 스레드가 있습니다. 효율적인 것은 아닙니다. 그것은 단지 HW 운동입니다. – Kinru
그래, 나는 단지 운동이어야한다고 생각한다. 이 개념은'A [500] [800] x B [800] [1000]과 같은 것을 취할 때 꽤 빨리 저하됩니다. 더 커질수록 더 많은 시간을 할애 할 수 있습니다. 아 ~. 행운을 빕니다! – WhozCraig