0

pthreads を使用して行列乗算を実行し、各要素ではなく各行の計算ごとに 1 つのスレッドを作成しようとしています。2 つの行列 A[M][K],B[K][N] があるとします。どこが間違っていますか?

int A[M][K];
int B[K][N];
int C[][];

void *runner (void *param);


struct v
{
int i;
 int j;
};

pthread_t tid[M];

for (i = 0; i < M; i++) // It should create M threads 
{
    struct v *data = (struct v *) malloc (sizeof (struct v));
    data->i = i;
    data->j = j;
    pthread_create (&tid[count], &attr, runner, data);
    pthread_join (tid[count], NULL);
    count++;
}

runner (void *param) //
{
    struct v *test;
    int t = 0;
    test = (struct v *) param;

    for (t = 0; t < K; t++)  // I want to compute it for a row instead of an element 
    {
        C[test->i][test->j] = C[test->i][test->j] + A[test->i][t] * B[t][test->j];
    }
    pthread_exit (0);
}
4

1 に答える 1

1

まず、data->j を取り除きます。行全体を計算している場合、スレッドが必要とするのは行インデックスだけです。現在、runner(..) は単一の要素を計算します。それらを1つずつ計算するすべての行要素を反復処理する必要があります。次に、スレッドを作成した直後にスレッドに参加しないでください。この方法では、一度に 1 つのスレッドしか実行できません。すべてのスレッドが作成されたら、スレッドへの参加を開始します。

于 2013-02-14T19:04:55.577 に答える