Q:

Умножение матриц с разделением на потоки

Здравствуйте!
Есть функция, которая умножает матрицы, но с разделением на потоки. Вот код:
unsigned Mult()
{
    int id = (int)param;
    int start = n / NumberOfThreads * id;
    int end = n / NumberOfThreads * (id + 1); 
    cout << "id=" << id;
    cout << "start=" << start;
    cout << "end=" << end;

    for (int i = start; i < end; i++)
            {
                for (int j = 0; j < k; j++)
                {
                    matr_3[i][j] = 0;
                    for (int z = 0; z < m; z++)
                        matr_3[i][j] += matr_1[i][z] * matr_2[z][j];
                }
            }
    return 0;
}

Проблема есть в этом месте:
int start = n / NumberOfThreads * id;
int end = n / NumberOfThreads * (id + 1);

Т.е. где потокам объясняется, как делится. При одном потоке для всех размерностей матриц вроде все хорошо. Но когда количество потоков четное, а хотя бы одна размерность матриц нечетная и наоборот, возникает проблема (последние строки или столбцы считаются неправильно).
На примере можно понять о чем я: пусть кол-во потоков = 2, а n = 3. Тогда по алгоритму для первого потока start = 0, end = 1,5. А int только целое, и он округляет до 1. И в конце алгоритма end второга потока будет равно 2, а нужно 3. Т.е. нужно каким-то образом оптимизировать алгоритм деления на потоки, чтобы и для четных, и для нечетных всё было верно, т.е. универсальный. Каким образом это можно сделать?

A:

"Лишние операции" последнему потоку можно скинуть, добавив проверку при определении конца интервала строк, с которым работает функция:
int end = n / NumberOfThreads * (id + 1); // ваша строка
// дополнительная проверка и увеличение интервала для последнего потока
if( (n-1) - end < n/NumberOfThreads ) { end = n-1; }

