- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要有关如何在 CUDA 中优化 Smith-Waterman 算法实现的建议。
我要优化的部分是填充矩阵。由于矩阵元素之间的数据依赖性(每个下一个元素都依赖于其他元素 - 左到它,到它,再到它),我正在并行填充反对角矩阵元素,如中所示下图:
我的程序在一个循环中运行
int diag = 1;
for(int x = 0; x < size_b; x++)
{
block_size = 1024;
if(block_size > diag)
{
block_size = diag;
}
SAFE_KERNEL_CALL((dev_init_diag<<<(diag - 1)/block_size + 1, block_size>>>(H, size_a, size_b, x,
sequence_a, sequence_b, false, x_offset, y_offset, null_ind)));
diag++;
}
如您所见,每条对角线都有一个内核调用。
因为我有相当大的矩阵(旁边有 21000
元素),所以有很多内核调用。结果,我对 CUDA 内核调用的开销很大,浪费了大约一半的处理时间,这可以通过 Visual Profiler 的屏幕截图看到(查看 Profiler 开销字符串):
因此,问题是如何摆脱多个内核调用并消除这种开销。
有一件重要的事情需要注意:我为每个对角线调用一个新内核的原因是我需要在下一次调用之前同步线程和 block ,据我所知,同步 CUDA block 的唯一方法是完成内核并重新启动它。尽管如此,对于这个算法可能有更好的解决方案。
感谢您阅读本文!
///////////////////////////////////////////////////////////
好的,谢谢您的回复!还有一个问题,更多关于 CUDA:所以,我必须实现一个新内核,大概是这样的:
__global__ void kernel(...)
{
for(int diag_num = 0; diag_num < size; diag_num++)
{
init_one_diag(...);
syncronize_threads();
}
}
但这意味着我必须只在一个 cuda block 上启动这个内核?(因为据我所知,不同 block 之间没有同步)
在我以这种方式启动内核之前:
dev_init_diag<<<(diag - 1)/block_size + 1, block_size>>>(...)
新方法是否有效?
最佳答案
我建议您阅读现有文献,为 Smith-Waterman 算法实现矩阵填充问题的有效方法。
根据您的代码描述,您选择并行填充反对角线,并且为每个反对角线启动一个内核。正如您所提到的,由于启动了多个内核,这是非常低效的。
一个简单的替代方法是构造一个负责计算所有反对角线的核函数。这个内核应该以至少等于最长反对角线的线程数启动。内核执行的迭代次数等于要计算的反对角线的数量。对于比最长对角线短的反对角线,只有一部分线程保持事件状态。这种方法在
Parallelizing the Smith-Waterman Local Alignment Algorithm using CUDA
但由于两个原因无效:
中的方法提供了反对角矩阵填充的替代方法
Acceleration of the Smith–Waterman algorithm using single and multiple graphics processors
其中展示了如何重新制定 Smith–Waterman(反对角线)矩阵填充算法,以便可以一次并行执行一行(或一列)计算。强调了行(或列)计算如何使 GPU 内存访问连续(合并)并因此变得快速。尽管没有明确提及,但我相信这种方法也可以减轻(或完全消除)上述非事件线程问题。
编辑
GPU Computing Gems 书籍, Jade 版,专门用两章介绍 Smith-Waterman 算法,即
第11章,使用Smith-Waterman算法精确扫描序列数据库
和
第 13 章,模式匹配的 GPU- super 计算机加速
后者是第二种方法的同一作者的一章。前者包含优化 CUDA 代码的逐步推导,这可能对 future 的用户有用。
关于algorithm - CUDA 中 Smith-Waterman 算法的矩阵填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23064866/
我将 Smith-Waterman 算法用于一本书的家庭作业,制作了一个值表。一旦我了解了如何获取值,构建表格就很容易了,但现在我很难从表格中确定最佳比对序列。 表格示例是按照公式生成的 min(
我正在使用 Smith-Waterman 算法运行一些字符串匹配测试。我目前正在使用 SimMetrics(Java 开源项目)来运行测试。 谁能解释为什么我比较“Bloggs J”。到“Bloggs
我正在尝试使用 Smith–Waterman algorithm 在 Python 中实现局部序列比对. 这是我目前所拥有的。它就构建了 similarity matrix : import sys,
我正在尝试实现 Waterman-Eggert 算法来查找次优局部序列比对,但我正在努力了解如何“解聚”单独的比对组。我的基本 Smith-Waterman 算法运行良好。 将以下序列与自身对齐的简单
我正在尝试使用仿射间隙罚函数实现用于局部序列比对的 Smith-Waterman 算法。我想我了解如何启动和计算计算比对分数所需的矩阵,但对于如何回溯以找到比对一无所知。要生成所需的 3 个矩阵,我有
我需要 smith-waterman 在 php 中,你知道是否已经有一个实现吗? 我需要这个算法来进行邻近搜索 ( Function that returns affinity between te
我找到了这个 perl 脚本,但是我有太多的序列需要分析。我想知道是否可以优化它?我在上面启动了 NYTProf,发现“计算匹配分数”、“计算差距分数”和“选择最佳分数”部分花费了大量时间。我必须修改
我需要有关如何在 CUDA 中优化 Smith-Waterman 算法实现的建议。 我要优化的部分是填充矩阵。由于矩阵元素之间的数据依赖性(每个下一个元素都依赖于其他元素 - 左到它,到它,再到它),
我正在开发一个小型应用程序,并考虑将 BLAST 或其他本地比对搜索集成到我的应用程序中。我的搜索只调出程序,需要作为外部程序安装和调用。 从头开始实现它还有什么办法吗?可能有任何预制库吗? 最佳答案
如何修改 Smith-Waterman algorithm在 Perl 中使用替换矩阵比对蛋白质? [需要引用] 最佳答案 我实际上是一名生物信息学研究人员,并且正在等待他自己的生物信息学代码运行,所
我编写了一些实现 Smith-Waterman 算法的 Java 代码。我有一个日记条目 here是这样说的 sim (X, Y) = 2 . SLength (X, Y) / Length
我是一名优秀的程序员,十分优秀!