# relion **Repository Path**: cui-rongpei/relion ## Basic Information - **Project Name**: relion - **Description**: 第三届中科院先导杯relion赛题移植与优化 - **Primary Language**: C - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-06-25 - **Last Updated**: 2025-08-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README * # Relion-hip ​ 此项目也正是今年第三届中科院先导杯的一道赛题。赛题要求移植出Relion冷冻电镜软件对应的Hip版本以便能在曙光智算平台的加速卡上运行。 ​ 目前Relion软件仅支持cuda加速,需要我们自己进行移植。谈起移植,就想起去年搞cp2k赛题移植时的痛苦。由于去年国内hip生态还不健全,相关的资料少之又少,对移植也是没有头脑,但今年开始,曙光也推出了光合开发者社区https://developer.hpccube.com/tool/ ,里面有着非常健全的资料和文档可供大家学习。 ​ 一般来说,CUDA到DCU代码移植过程一般包括四个步骤: ### 1、转码 ​ 转码方面有自动转码工具hipify-perl,可以实现将cuda代码转换成Hip代码,避免一些机械重复的代码修改工作。 ​ ​ 其中疑似CUDA或CUDA库函数但未转换的代码以warning形式给出,未转换的原因,可能是该API或库函数目前在HIP中没有对应的版本,也可能是该处实际非CUDA API或CUDA库函数。这些warning需要人工查看,对于确实为CUDA API或CUDA库函数但目前HIP不支持的情况,需要对程序进行修改。 ### 2、编译构建系统修改 ​ 需要理清编译流程,找到编译cuda代码部分并修改CMakeLists.txt Makefile里的相关编译参数与编译选项。对于小白来说一开始很难直接从复杂的项目中直接定位到全部编译cuda代码的部分。 ​ 最直接的办法就是找一台支持CUDA的机器,在其上编译安装CUDA版的Relion,在最后make编译安装时加上 make VERBOSE=1 2>&1 | tee log.txt,使其输出详细命令然后仔细查找比对编译cuda代码部分。 ​ ### 3、编译调试 ​ 这一阶段一般要根据具体的报错命令进行排查。这里贴出几个我遇到过的问题 ​ #### 1、hiprand没有声明的问题 在代码中加入 #define __HIP_PLATFORM_HCC__ #### 2、hip不支持纹理内存 vim src/acc/acc_projector_impl.h 加入如下(取消纹理内存) #define PROJECTOR_NO_TEXTURES #### 3、error: no matching function for call to 'min' 主要因为默认使用c++的头文件导致冲突 命令行输入 unset CPLUS_INCLUDE_PATH #### 4、关于sincos的报错 应该是sincos这个函数,hip没有重载单精度的sincos,我是改了,float的用sincosf,double的用sincos #### 5、关于cub的报错 此处主要是AMD和NVIDIA汇编底层寄存器的位数不一样,可以对着改成AMD的可能会提高速度。 此处为了方便,直接用hipcub。 因为relion代码用的是自己写的cub,将src/acc/cuda下的cub文件夹删除或者重命名然后将将代码中所有关于#include"cub"的删除。 #include,并在CMakeLists.txt中加入hipcub的路径(hipcub/hipcub.hpp的上一层目录路径) ### 4、运行测试 ## 编译安装步骤 以下操作基于曙光智算平台 切换到relion目录,加载所需的环境变量 ``` source module.sh ``` 执行relion-dcu-install.sh,预计装入build下完成后设置环境变量 ``` source relion-dcu-install.sh ``` 完成后设置环境变量 ``` export PATH=~/relion/build/bin:$PATH export LD_LIBRARY_PATH=~/relion/build/lib:$LD_LIBRARY_PATH ``` 申请计算节点 ``` source relion-test/salloc.sh ``` 运行算例 ``` 参见赛方提供的《relion算例运行与方法验证》 ``` ​