У меня есть проблема с реализацией нитей для следующего цикла в C#:Реализация потоков для построения матрицы Смит-Ватерманн быстрее
for (int i = 1; i < matrix.scoreMatrix.GetLength(0); i++)
{
for (int j = 1; j < matrix.scoreMatrix.GetLength(1); j++)
{
matrix.CalculateScore(i, j);
}
}
Этот цикл заполняет массив совпадений для алгоритма Smith Waterman. Это занимает много времени, потому что я хотел улучшить процесс заполнения матрицы.
Заполнение матрицы должно выполняться из верхнего левого угла, поскольку следующие ячейки вычисляются на основе ячеек, расположенных выше и слева.
Моя идея заключается в том, чтобы воспользоваться этим 2-3 дополнительных потоков, которые будут заполнять каждый массив строки, как показано на рисунке ниже:
Любые советы или аналогичное соглашение будет очень полезно.
I`v сделано STH, как это:
Основная функция:
int i = 0, t1_row=0, t2_row=0, t3_row=0, finished_lines=0;
Thread t1 = new Thread(() => getnext1(matrix, i, t1_row, t2_row, t3_row, finished_lines));
Thread t2 = new Thread(() => getnext2(matrix, i, t1_row, t2_row, t3_row, finished_lines));
Thread t3 = new Thread(() => getnext3(matrix, i, t1_row, t2_row, t3_row, finished_lines));
t1.Start();
t2.Start();
t3.Start();
t1.Join();
t2.Join();
t3.Join();
функции Тема:
public static void getnext1(SWMatrix matrix, int i, int t1_row, int t2_row, int t3_row, int finished_lines)
{
do
{
for (int j = 1; j < matrix.scoreMatrix.GetLength(1); j++)
{
if (t1_row <= t3_row - 1 || finished_lines >= i - 2)
{
matrix.CalculateScore(i, j);
t1_row++;
}
else
{
j--;
}
}
finished_lines++;
i++;
t1_row = 0;
}
while (i >= matrix.scoreMatrix.GetLength(0));
}
public static void getnext2(SWMatrix matrix, int i, int t1_row, int t2_row, int t3_row, int finished_lines)
{
do
{
for (int j = 1; j < matrix.scoreMatrix.GetLength(1); j++)
{
if (t2_row <= t1_row - 1 || finished_lines >= i - 2)
{
matrix.CalculateScore(i, j);
t2_row++;
}
else
{
j--;
}
}
finished_lines++;
i++;
t2_row = 0;
}
while (i >= matrix.scoreMatrix.GetLength(0));
}
public static void getnext3(SWMatrix matrix, int i, int t1_row, int t2_row, int t3_row, int finished_lines)
{
do
{
for (int j = 1; j < matrix.scoreMatrix.GetLength(1); j++)
{
if (t3_row <= t2_row - 1 || finished_lines >= i - 2)
{
matrix.CalculateScore(i, j);
t3_row++;
}
else
{
j--;
}
}
finished_lines++;
i++;
t3_row = 0;
}
while (i >= matrix.scoreMatrix.GetLength(0));
}
время выполнения запроса увеличивается почти в два раза. Но у меня также есть информация о том, что потоки работают. Как оптимизировать этот код? Любое предложение? Я тестирую его на машине с 4-мя процессорами.
В чем вопрос? Вы спрашиваете, является ли это действительным/безопасным подходом? Вы спрашиваете, улучшит ли производительность? Вы просите код? – Aaronaught
Благодарим вас за ответ. Меня интересуют ответы на все эти вопросы. – user2265880
Если вы не предоставляете ссылки при обращении за помощью к специализированным/неясным алгоритмам или структурам данных, вы по своей сути ограничиваете помощь, которую можете получить небольшому числу специалистов, которые могли бы это увидеть. – RBarryYoung