Речь идет о параллельном умножении векторов матриц с помощью нескольких потоков. Строки матрицы будут «разбиты» на блоки максимально близкого размера, так что каждый поток будет умножать примерно на одинаковое количество строк, чтобы программа работала как можно быстрее.
Итак, у меня есть матрица a, количество потоков t, блок строк для каждого потока s, отдельные потоки i и начало блока и конец блока, который поток должен go пройти.
У меня есть этот алгоритм:
01: int s = (int) Math.ceil((double) a.length / t);
02: for (int i = 0; i < t; i++) {
03: start = i * s;
04: end = Math.min((i + 1) * s, a.length);
05: // ... create worker and threads
06: }
a.length - это количество строк, из которых состоит матрица.
Теперь мой вопрос в том, в каких случаях этот алгоритм оказывается неэффективным ... потому что помимо очевидного one (очевидно, что ни один поток не вызывает ошибку из-за деления на 0), у меня есть только один поток с 1 строкой, а другие 7 потоков с 8 строками, если у меня 57 строк и 8 потоков ... но это не было бы больше эффективно, если бы у меня было 7 потоков с 7 строками и один поток с 8 строками, не так ли?