【问题标题】:Running a matrix algorithm on how many cores?在多少个内核上运行矩阵算法?
【发布时间】:2018-09-21 22:48:54
【问题描述】:

我正在运行来自 PHYLIP (http://evolution.genetics.washington.edu/phylip/doc/dnadist.html) 的名为 dnadist 的程序。这会根据您输入的序列数创建一个 dna 距离矩阵。

目前,我想从 14,778 个序列创建一个矩阵。我提交此文件以在我大学的 HPCC 上运行,根据我计算的估计,运行需要 10 天。

我想请求更多的内核来加快时间,但我对这是否可以拆分运行的算法感到困惑?还是必须全部在 1 个核心上运行?我的假设是我必须更改算法本身以溢出正在生成的矩阵,然后将它们全部连接在一起。这是正确的假设吗?

【问题讨论】:

  • 距离矩阵计算应该是相当简单的并行计算:例如对于三个元素 A、B、C,AB、BC 和 AC 可以各自独立计算。但是,不确定这是否在dnadist 中实现。您可能想查看其他距离矩阵计算工具,例如 Rstats::dist 函数)中的其他距离矩阵计算工具,或者它们可能也存在于 C 或 C 衍生物中。
  • 你有哪个 HPCC 版本?

标签: phylogeny cpu-cores distance-matrix hpcc hpcc-ecl


【解决方案1】:

我不确定这里有几件事:phylip 是如何进行成对比较的(如果它是一次计算,那就太麻烦了!),你正在测序什么(细菌蛋白质的数量级更容易适应记忆比小麦基因组)以及如何设置在 HPCC 上运行(phylip 是 C,我相信它是如何部署的?)。

简而言之,基因分析一直在进行,因此编写定制程序来自己进行分析可能是行不通的。还有其他工具,例如 MEGA 可以为您仔细计算距离,但值得看看文献中针对您的问题使用了什么以及在什么硬件上使用了什么。也许还可以尝试 R 的 dist.dna() 功能?如果你想把它平行化(link),你可以,但你需要一些诡计多端的方法来确保在组合它们之前完成所有距离。

计算速度重要吗?如果您有 15,000 个完整的细菌序列(假设每个序列为 1,300 kbp),那么它们将适合一台像样的机器上的内存。同样,我的猜测是有人已经有了可以做到这一点的东西,在桌面上躺几天就可以了,让你有机会写下你的介绍和方法!

【讨论】:

  • 正如 Oscar 的回答中所讨论的,您可以编写一个 ECL #LOOP 在 HPCC 上执行此操作。如果您使用 R、Python、C++ 或 Java 函数来执行此操作,那么您可以在代码中嵌入其中一种语言。
  • 感谢您的详细回复,不胜感激!首先回答你的问题 - (1) dnadist,根据我的理解,一次运行 1 个有机体与所有其他有机体 - 例如,A 将与 B-Z 进行比较,然后 B 将接下来运行(参见“输出格式” evolution.genetics.washington.edu/phylip/doc/dnadist.html) (2) 我正在使用 28 kb 长的细菌 16S RNA 基因序列 (3) 再说一次,我的理解是 PHYLIP 仍然通过 C 编译器通过 C 部署,但被上传到 linux (evolution.genetics.washington.edu/phylip/install.html)
  • 我的分析基于 Adam Martiny 的实验室,该实验室在使用他们的 consenTRAIT 算法之前使用 PHYLIP - 这需要邻居树和二元特征表。 PHYLIP 通过 Seqboot 在一组 16S 中创建 100 个随机序列引导程序。每个引导程序都通过 Dnadist 运行。这 100 个矩阵通过 Neighbor 程序运行。速度很重要,因为每次引导需要 10-15 天,如果我在 HPCC 上发送多个作业并且没有故障排除,则需要测试 8 条路径 = 约 4 个月。如果我能在 3-5 天内运行 1 个引导程序,我会很高兴。不过我也会检查其他程序!
【解决方案2】:

是的,可以并行化,这就是使用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 command 并在 Thor(而不是 HThor)中运行 workunit,将您的函数编码与基本矩阵计算并行化。

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;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 2019-10-04
  • 2019-02-20
  • 2020-12-31
相关资源
最近更新 更多