21 个版本
新版本 0.9.4 | 2024年8月20日 |
---|---|
0.9.3 | 2024年7月30日 |
0.9.2 | 2024年6月21日 |
0.7.1 | 2024年1月29日 |
0.3.3 | 2021年3月10日 |
48 在 科学
342 每月下载量
在 mwa_hyperdrive 中使用
380KB
7.5K SLoC
mwa_hyperbeam
Murchison Widefield Array (MWA)射电望远镜的主波束代码。
此代码存在是为了提供一个正确、便捷的Murchison Widefield Array (MWA)全嵌入式元件(FEE)主波束模型实现,即“2016波束”。应优先使用此代码。如果存在问题,请在此提出,以便大家都能受益。
请参阅变更日志以获取代码的最新更改。
极化顺序
请参阅此文档以获取关于波束响应琼斯矩阵极化顺序的详细信息。如果应用了平行角校正,则代码可能会重新排序琼斯矩阵。
用法
hyperbeam
需要MWA FEE HDF5文件。可以使用以下方法获取:
wget http://ws.mwatelescope.org/static/mwa_full_embedded_element_pattern.h5
在创建新的波束对象时,hyperbeam
需要知道此HDF5文件的位置。最简单的方法是设置环境变量MWA_BEAM_FILE
export MWA_BEAM_FILE=/path/to/mwa_full_embedded_element_pattern.h5
(在 Pawsey 系统上,这应该是export MWA_BEAM_FILE=/pawsey/mwa/mwa_full_embedded_element_pattern.h5
)
hyperbeam
可以通过C的FFI(Foreign Function Interface)由任何编程语言使用。换句话说,大多数语言。请参阅examples
目录中的Rust、C和Python使用示例。一个简单的Python示例是
>>> import mwa_hyperbeam
>>> beam = mwa_hyperbeam.FEEBeam()
>>> help(beam.calc_jones)
Help on built-in function calc_jones:
calc_jones(az_rad, za_rad, freq_hz, delays, amps, norm_to_zenith, latitude_rad, iau_order) method of builtins.FEEBeam instance
Calculate the beam-response Jones matrix for a given direction and
pointing. If `latitude_rad` is *not* supplied, the result will match
the original specification of the FEE beam code (possibly more useful
for engineers).
Astronomers are more likely to want to specify `latitude_rad` (which
will apply the parallactic-angle correction using the Earth latitude
provided for the telescope) and `iau_order`. If `latitude_rad` is not
given, then `iau_reorder` does nothing. See this document for more
information:
<https://github.com/MWATelescope/mwa_hyperbeam/blob/main/fee_pols.pdf>
`delays` and `amps` apply to each dipole in an MWA tile in the M&C
order; see
<https://wiki.mwatelescope.org/pages/viewpage.action?pageId=48005139>.
`delays` *must* have 16 elements, whereas `amps` can have 16 or 32
elements; if 16 are given, then these map 1:1 with dipoles, otherwise
the first 16 are for X dipole elements, and the next 16 are for Y.
>>> print(beam.calc_jones(0, 0.7, 167e6, [0]*16, [1]*16, True, -0.4660608448386394, True))
[-1.51506097e-01-4.35034884e-02j -9.76099405e-06-1.21699926e-05j
1.73003520e-05-1.53580286e-05j -2.23184781e-01-4.51051073e-02j]
CUDA / HIP
hyperbeam
也可以在 NVIDIA GPU 或 AMD GPU 上运行。要查看使用示例,请查看任何名称中包含 "cuda" 或 "hip" 的示例。GPU 功能是通过 Cargo 功能提供的;有关从源安装的说明,请参阅下文。
安装
Python PyPI
如果您正在使用 Python 版本 >=3.6
pip install mwa_hyperbeam
预编译
请查看 GitHub 发布 页面。对于 Python 3.6+ 的所有版本,都有一个 Python 轮子,以及用于 C 风格链接的共享和静态对象。要了解如何链接 hyperbeam
,请参阅 示例目录 中的 fee.c
文件。
因为这些 hyperbeam
对象已经编译了 HDF5 和 ERFA 库,所以它们的相应许可证也被分发。
从源码
先决条件
-
Cargo 和 Rust 编译器。推荐使用
rustup
https://rust-lang.net.cn/tools/install
Rust 编译器版本必须至少为 1.64.0
$ rustc -V rustc 1.64.0 (a55dd71d5 2022-09-19)
-
- 可选;使用
hdf5-static
或all-static
功能。- 需要 CMake 版本 3.10 或更高。
- Ubuntu:
libhdf5-dev
- Arch:
hdf5
- 可以使用
HDF5_DIR
手动指定 C 库目录。- 如果没有指定,将使用
pkg-config
查找库。
- 如果没有指定,将使用
- 可选;使用
克隆存储库,并运行
export RUSTFLAGS="-C target-cpu=native" # (optional) Use native CPU features (not portable!)
cargo build --release
对于与其他语言的用法,include 文件将位于 include
目录中,以及与 C 兼容的共享和静态对象位于 target/release
目录中。
CUDA
您是否在桌面 GPU 上运行 hyperbeam
?那么您可能希望使用单精度浮点数进行编译
cargo build --release --features=cuda,gpu-single
cargo build --release --features=hip,gpu-single
否则,继续使用双精度浮点数
cargo build --release --features=cuda
cargo build --release --features=hip
桌面 GPU(例如,NVIDIA GeForce RTX 2070)的双精度计算能力比 "数据中心" GPU(例如,NVIDIA V100)显著低。允许 hyperbeam
在浮点类型之间切换,让用户在性能和精度之间做出权衡。
CUDA
也可以静态链接
cargo build --release --features=cuda,cuda-static
HIP
HIP
的情况与 CUDA
类似;使用 hip
功能,如果要让代码使用单精度浮点数,请使用 gpu-single
。似乎 HIP
不提供静态库,因此没有提供静态功能。
静态依赖项
要制作不依赖于系统 HDF5
库的 hyperbeam
,请给 build
命令一个功能标志
cargo build --release --features=hdf5-static
这将自动编译 HDF5 源代码并将其 "烘焙" 到 hyperbeam
产品中,这意味着不需要作为系统依赖项的 HDF5。需要 CMake 版本 3.10 或更高来构建 HDF5 源。
要编译所有 C 库静态
cargo build --release --features=all-static
Python
要将 hyperbeam
安装到您当前使用的虚拟环境或 conda 环境,您需要 Python 软件包 maturin
(可以使用 pip
获取),然后运行
maturin develop --release -b pyo3 --features=python --strip
如果您不想安装 HDF5 作为系统依赖项,请包含 hdf5-static
功能
maturin develop --release -b pyo3 --features=python,hdf5-static --strip
与其他 FEE 波束代码的比较
以下是与其他FEE光束代码实现的比较表。所有基准测试都在独特的方位角和仰角方向上进行,且都在同一系统上。CPU是Ryzen 9 3900X,具有12个核心和SMT(24个线程)。CUDA基准测试使用NVIDIA GeForce RTX 2070。除非特别说明“并行”,否则所有基准测试都是串行进行的。Python时间是通过在计算前后运行time.time()
来测量的。内存使用量是通过在命令上运行time -
(不是与您的shell相关的time
;这通常在/usr/bin/time
)来测量的。
代码 | 方向数量 | 持续时间 | 最大内存使用量 |
---|---|---|---|
mwa_pb | 500 | 98.8 毫秒 | 134.6 MiB |
100000 | 13.4 秒 | 5.29 GiB | |
1000000 | 139.8 秒 | 51.6 GiB | |
mwa-reduce (C++) | 500 | 115.2 毫秒 | 48.9 MiB |
10000 | 2.417 秒 | 6.02 GiB | |
mwa_hyperbeam | 500 | 10.0 毫秒 | 9.75 MiB |
100000 | 1.82 秒 | 11.3 MiB | |
1000000 | 18.1 秒 | 25.0 MiB | |
mwa_hyperbeam (并行) | 1000000 | 1.55 秒 | 88.8 MiB |
mwa_hyperbeam (通过Python) | 500 | 20.5 毫秒 | 44.2 MiB |
100000 | 3.70 秒 | 45.4 MiB | |
1000000 | 37.2 秒 | 59.0 MiB | |
mwa_hyperbeam (通过Python,并行) | 1000000 | 2.49 秒 | 246.6 MiB |
mwa_hyperbeam (CUDA,单精度) | 1000000 | 450 毫秒 | 253.8 MiB |
1e8 | 3.08 秒 | 14.26 GiB |
不确定C++代码出了什么问题。也许是我调用CalcJonesArray
的方式不正确,但它使用了大量的内存。无论如何,hyperbeam
似乎快了大约10倍。如果您知道如何与Everybeam
进行比较,请告诉我。
故障排除
再次使用hyperbeam
运行您的代码,但这次使用调试构建。这应该就像运行
cargo build
然后使用./target/debug
中的结果一样简单。
如果这不能帮助揭示问题,请在新的GitHub问题中报告所使用的软件版本、您的使用情况和程序输出。
hyperbeam?
AERODACTYL使用了超光束!
依赖关系
~10–25MB
~427K SLoC