Skip to content

每组一个蛋白质P,原子数I,得到蛋白原子坐标矩阵P=[p1,p2,,pI],形状[I,3]

小分子M,原子数J,得到小分子原子坐标矩阵M=[m1,m2,,myJ],形状[J,3]

矩阵PM做逐元素运算得到距离矩阵D,形状[I,J]

Di,j=(Pi,xMi,x)2+(Pi,yMi,y)2+(Pi,zMi,z)2i[1,I],j[1,J]

给定距离阈值cutoff,当距离小于cutoff时,选中该残基。

预设条件

硬件资源:

5060Ti,CUDA core 4608个,SM单元36个,显存16GB,带宽448GB/s

CPU 12700F,12核心,20线程,内存32GB

每个坐标值为float32类型,则每组P矩阵占用3I×32=64IM矩阵占用3J×32=64JD矩阵占用32IJ

原始任务

总任务数T=1980,大小4.85GB,设蛋白质平均原子数为5000个,小分子平均原子数为50个。

计算距离矩阵,每组需要进行3次减法、3次平方、2次加法、1次求根号

优化

文件多核心加载

CUDA批次打包

根号等价代换

距离是坐标差的平方和再开根号,可以等价为阈值的平方cutoff2,用一次平方省去多次求根号操作,此时距离矩阵为:

Di,j=(Pi,xMi,x)2+(Pi,yMi,y)2+(Pi,zMi,z)2

每个核心需要进行3次减法、3次平方、2次加法

布尔比较

得到距离平方后,直接和阈值的平方cutoff2比较,得到布尔值,并行得到布尔矩阵

对布尔矩阵按蛋白质的原子数聚合,得到大小为J的一维布尔向量

布尔向量再按残基聚合选中残基