cuFFT并非不可战胜!
背景介绍¶
密度泛函理论(Density Functional Theory,简称DFT)在材料计算,医药和分子化学等领域扮演着重要的角色,是微观世界建模的重要工具。在高性能计算技术与机器学习方法飞速发展的今天,理论计算有望更快速地突破科学边界,解决更多的实际问题。密度泛函理论兼具效率与精度,正在释放出巨大的潜力。
ABACUS作为积淀深厚的国产开源密度泛函计算软件,致力于结合高性能计算和机器学习方法,推动电子结构新算法的发展和普及,为更多科研人员、老师和学生们提供更方便易用的免费开源软件,为更多开发者提供一个框架清晰、方便上手的开发平台,努力将第一性原理方法打造成面向实际应用场景的解决方案。
在ABACUS等DFT软件计算中有一个很重要的倒易空间到实空间的转换,涉及到快速傅里叶算法也就是FFT。不过这个转化和通常的FFT不同,它带有一定的稀疏性。我们可以将在倒易空间需要变换的数据视为是一个球体,这个球体位于一个三维的正立方体中,球体直径小于等于立方体边长的一半,立方体其他部分置零,然后将整个立方体输入到FFT中进行变换得到实空间数据。但受限于接口问题目前只能应用cuFFT或者FFTW等成熟的库,没法有效利用数据的稀疏性。在实际计算中,FFT的计算占比达30%以上,是一个相当大的计算瓶颈。我们以ABACUS为基础,将相关问题抽象出来,提供了一个物理意义无关的优化问题模型。
赛题描述¶
考虑立方体D,定义其边长为c,球R为D中的一个球体,球的半径为r,r≤c/4。
为简化起见,考虑D和R的中心重合位于原点处。注意:这里边长都是整数,格点位于每个整点处,若长度为m,则格点数为m+1。若边长为奇数,则原点分布于正中间,若边长为偶数,则自动扩充边长为变长+1。

FFT输入数据示意图,仅有彩色球体为有效数据,其余部分置为零。
输入¶
- 立方体边长c
- 球体半径r
- 三维复数数据A,A的大小为c的3次方,以一维数组形式连续存储。A的初始化说明如下:
- 遍历A中的数据元素
P(x,y,z); - 如果P到球心距离小于半径r,则
P=random_complex; - 否则P置零。
- 遍历A中的数据元素
输出¶
- A经过逆傅里叶变化后的输出数组B。
其中,A是频域空间,B是时域空间。
评测说明¶
- 初始代码中提供了一份使用cuFFT作为实现的代码,以下简称为Baseline版本。要求选手实现的版本以下简称为Acclerate版本。
- Baseline提供了编译说明,可以在Github下载,Baseline相关问题可直接在仓库提交ISSUE讨论。
- Acclerate的输出应该和Baseline一致(允许误差:1*10^{-5})。
你可以在/data/software/tools/cufft找到评测用的输入数据
评分标准¶
- 将在规定的硬件平台上运行选手的程序,分别对于如下大小的
c和r进行10次运行,取平均耗时为最终耗时结果:
| c | r | 权重 | 次数 | |
|---|---|---|---|---|
| 1 | 33 | 8 | 0.15 | 10 |
| 2 | 33 | 6 | 0.15 | 10 |
| 3 | 65 | 16 | 0.15 | 10 |
| 4 | 65 | 12 | 0.15 | 10 |
| 5 | 129 | 32 | 0.1 | 10 |
| 6 | 129 | 24 | 0.1 | 10 |
| 9 | 257 | 64 | 0.05 | 10 |
| 10 | 257 | 48 | 0.05 | 10 |
| 11 | 513 | 96 | 0.05 | 10 |
| 12 | 513 | 128 | 0.05 | 10 |
- 一个complex
为16 byte,最大的输入数据集512^3次方为2GB数据大小。 - 每个样例分别取Accelerate和Baseline的耗时之比,计算所有样例比值的加权平均为最终评分标准。
- IO时间不算在你的评分时间中
- 注:本题采用并行评测的方式,评测过程中返回已完成的点数可能并非按照顺序,请知悉。
handout使用方式¶
compile.sh:编译你的程序run.sh c r num:在c,r的条件下,用你的程序中处理data中的num个数据。
提交方式¶
提交你的answer.cpp,我们会编译并运行。
参考文档¶
- ABACUS Documentation ‒ ABACUS documentation
- https://docs.nvidia.com/cuda/pdf/CUFFT_Library.pdf
- FFT and sparse FFT techniques and applications
附件¶
初始工作区