многопотоковое матричное умножение

В настоящее время я пытаюсь написать программу на C ++ с pthreads.h для многопоточного умножения матриц.

Я пытаюсь создать темы следующим образом

int numthreads = (matrix[0].size() * rsize2);//Calculates # of threads needed
pthread_t *threads;
threads = (pthread_t*)malloc(numthreads * sizeof(pthread_t));//Allocates memory for threads
int rc;
for (int mult = 0; mult < numthreads; mult++)//rsize2
{
struct mult_args args;
args.row = mult;
args.col = mult;
cout << "Creating thread # " << mult;
cout << endl;
rc = pthread_create(&threads[mult], 0, multiply(&args), 0);
}

Затем создаются потоки, которые выполняют мою функцию умножения, которая кодируется следующим образом

void *multiply(int x, int y)
{
int oldprod = 0, prod = 0, sum = 0;
cout << "multiply";

for(int i = 0; i < rsize2; i++)//For each row in #ofrows in matrix 2
{
prod = matrix[x][i] * matrix2[i][y];//calculates the product
sum = oldprod + prod; //Running sum starting at 0 + first product
oldprod = prod; //Updates old product
}

Моя ошибка заключается в моей функции умножения. Я пытаюсь найти совместимый способ передачи координат x и y для каждого потока, чтобы он точно знал, какое суммирование рассчитать, но я не уверен, как это сделать способом, приемлемым для функции pthreads_create () ,

Обновить:
Я знаю, что мне нужно использовать структуру для достижения этой цели

struct mult_args {
int row;
int col;
};

но я не могу заставить функцию умножения принять структуру

0

Решение

Вам придется изменить ваш multiply функционировать так, чтобы он занял один void* параметр. Для этого вам нужно будет создать структуру для хранения x а также y и передать указатель на него в pthread_create,

struct multiply_params
{
int x;
int y;

multiply_params(int x_arg, int y_arg) noexcept :
x(x_arg), y(y_arg)
{}
};

// ...

for (int mult = 0; mult < numthreads; mult++)
{
cout << "Creating thread # " << mult;
cout << endl;

multiply_params* params = new multiply_params(1, 0);
rc = pthread_create(&threads[mult], 0, multiply, (void*) params);
}

Затем в вашей функции умножения, переписать это так, принимая один void* параметр, который будет указателем multiply_params который мы перешли в pthread_create, Вы должны привести этот аргумент из void* так что мы можем получить доступ к его полям.

void* multiply(void* arg)
{
multiply_params* params = (multiply_params*) arg;

int x = params->x;
int y = params->y;

delete params; // avoid memory leak
// ...
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]