Запуск матричного алгоритма на сколько ядер?
Я запускаю программу под названием dnadist от PHYLIP ( http://evolution.genetics.washington.edu/phylip/doc/dnadist.html). Это создает матрицу расстояний ДНК из числа введенных вами последовательностей.
В настоящее время я хочу создать матрицу из 14 778 последовательностей. Я отправляю это на HPCC моего университета, и, согласно моей расчетной оценке, это займет 10 дней.
Я хочу запросить больше ядер, чтобы ускорить время, но я не понимаю, можно ли разделить работающий алгоритм? Или все должно работать на 1 ядре? Мое предположение состоит в том, что мне придется изменить сам алгоритм, чтобы разлить производимую матрицу, а затем объединить все вместе. Это правильно предположить?
2 ответа
Я не уверен в некоторых вещах здесь: как phylip выполняет парные сравнения (если это все сразу, это вычисление helluva!), Что вы секвенируете (бактериальные белки на несколько порядков легче вписываются в память, чем пшеница Геном будет) и как это настроить для запуска на HPCC (Филип, как я верю, так как он был развернут?).
Короче говоря, генетический анализ проводится все время, поэтому написание программ на заказ, чтобы сделать это самостоятельно, вероятно, не является началом. Существуют и другие инструменты, такие как MEGA, которые могут вычислять расстояния для вас, но стоит посмотреть, что используется в литературе для вашей проблемы и на каком оборудовании. Возможно также попробуйте функцию dist.dna() R? Вы можете это сделать, если вы хотите это сделать ( ссылка), но вам понадобятся некоторые покерные игры, чтобы убедиться, что вы прошли все расстояния, прежде чем их объединить.
Важна ли скорость расчета? Если у вас есть 15 000 целых бактериальных последовательностей (по 1300 кбит / с каждая), они поместятся в память на приличной машине. Опять же, я предполагаю, что у кого-то уже есть что-то, что будет делать это, несколько дней на рабочем столе, у которого вы лежите, в порядке, дает вам возможность написать свое вступление и методы!
Да, вы можете распараллелить, это основной смысл использования HPCC. Без чтения вашего кода сложно ответить. Я предполагаю, что ваш код будет что-то вроде:
EXPORT CalculateDistances :=FUNCTION(parameters)
// For each parameter do your DNA magic(matrix calculation)
RETURN something;
END;
result:= CalculateDistances(A,B,C,D...);
OUTPUT(result, named('result'));
Вы можете распараллелить кодирование своей функции с помощью базового матричного вычисления, используя команду PARALLEL ECL и запустив рабочий модуль в Thor (не в HThor).
EXPORT CalculateDistance :=FUNCTION(Matrix1, Matrix2)
// Your DNA magic(basic matrix calculation) for Matrix1&Matrix2
RETURN something;
END;
result01:= CalculateDistance(A,B);
result02:= CalculateDistance(A,C);
result03:= CalculateDistance(A,D);
result04:= CalculateDistance(B,A);
result05:= CalculateDistance(B,C);
result06:= CalculateDistance(B,D);
result07:= CalculateDistance(C,A);
result08:= CalculateDistance(C,B);
result09:= CalculateDistance(C,D);
result10:= CalculateDistance(D,A);
result11:= CalculateDistance(D,B);
result12:= CalculateDistance(D,C);
executeCalculates := PARALLEL(
result01,
result02,
result03,
result04,
result05,
result06,
result07,
result08,
result09,
result10,
result11,
result12
);
executeCalculates;