Итак, я играл с pthreads, особенно пытаясь вычислить произведение двух матриц. Мой код очень грязный, потому что он должен был быть для меня небольшим забавным проектом, но теория потоков, которую я использовал, была очень похожа на:
#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.com/blog/2009/06/29/matrix-multiplication-in-c-using-pthreads-on-linux/
Для не поточной версии я использовал ту же настройку (3 2-мерные матрицы, динамически распределенные структуры для хранения r / c) и добавил таймер. Первые испытания показали, что версия без резьбы была быстрее. Моей первой мыслью было, что размеры слишком малы, чтобы заметить разницу, и создание потоков заняло больше времени. Поэтому я увеличил размеры примерно до 50x50, заполнил случайным образом и запустил его, и я до сих пор не вижу никакого повышения производительности с помощью многопоточной версии.
Что мне здесь не хватает?