跳转到主要内容

在CPU上执行闪电般的关联函数

项目描述

Corrfunc logo

Latest Release PyPI Release MIT License GitHub Actions Status Documentation Status Open Issues

Core Infrastructure Best Practices Status Fair Software (EU) Compliance

Corrfunc Paper I Corrfunc Paper II

描述

此存储库包含一系列代码,用于计算在宇宙盒子(共动XYZ)中的模拟星系的关联函数和其他聚类统计以及具有天顶位置的观测星系(赤经,赤纬,CZ)。请阅读corrfunc.rtfd.io上的文档。

为什么你应该使用它

  1. 快速 理论配对计数比SciPy cKDTree快7倍,并且至少比所有现有公开代码快2倍。

  2. OpenMP并行 所有配对计数代码都可以并行执行(具有强扩展效率>~ 95%,最多10个核心)

  3. Python扩展 Python扩展允许您使用C进行计算密集型部分,同时保留Python的所有用户友好性。

  4. 权重 所有相关函数现在都支持为单个点指定任意、用户自定义的权重。

  5. 模块化 代码采用模块化编写方式,易于扩展以计算任意聚类统计量。

  6. 面向未来 随着我们获得对新的指令集的访问权限,代码将得到更新,以使用最新和最强大的CPU特性。

如果您使用这些代码进行分析,请为该仓库加星标——这有助于我们跟踪用户数量。

与现有代码进行基准测试

请参阅此gist以了解一些当前代码的基准测试。如果您有一对计数器想要比较,请添加相应的函数并更新时间。

安装

先决条件

  1. make >= 3.80

  2. 具有OpenMP功能的编译器,如iccgcc>=4.6clang >= 3.7。如果没有可用,请在theory.optionsmocks.options中禁用USE_OMP选项。在HPC集群上,请参考集群文档了解如何加载编译器(通常是module load gcc或类似)。如果您使用Anaconda Python的Corrfunc,则conda install gcc(MAC/linux)应该可以工作。在MAC上,(sudo)port install gcc5也是一个选项。

  3. gsl >= 2.4。在HPC集群上,请参考集群文档(通常是module load gsl将有效)。使用Anaconda Python时,使用conda install -c conda-forge gsl(MAC/linux)。在MAC上,如果需要,您可以使用(sudo)port install gsl(MAC)。

  4. python >= 2.7python>=3.4用于编译CPython扩展。

  5. numpy>=1.7用于编译CPython扩展。

方法2:pip安装

Python软件包可以通过python -m pip install Corrfunc直接安装。然而,在这种情况下,您将失去重新编译代码的能力。如果您仅使用Python接口且在一台机器(如笔记本电脑)上工作,这通常是可以接受的。对于在集群或其他具有多个CPU架构的环境中的使用,您可能会发现使用上述源安装方法更有用,以防以后需要为不同的架构编译。

测试pip安装的Corrfunc

您可以使用以下方法检查pip安装的Corrfunc是否工作

$ python -m pytest --pyargs Corrfunc

pip安装不包括主仓库中包含的所有测试数据,因为它总共超过100 MB,并且类似地,生成即时数据的测试也相当详尽。pytest会将没有数据文件可用的测试标记为“跳过”。如果您想运行基于数据文件的测试,请使用源安装方法。

OSX上的OpenMP

自动从编译器和运行时检测OpenMP支持有点复杂。如果您在编译(或运行)OpenMP时遇到任何问题,请参阅常见问题解答以获取可能的解决方案。

模拟星系上的聚类度量

输入数据

输入星系(或任何离散的点分布)来自模拟。例如,星系可以是Halo Occupation Distribution(HOD)模型、Subhalo Abundance matching(SHAM)模型、Semi-Empirical model(SEM)或Semi-Analytic model(SAM)等的结果。输入的点集也可以是宇宙模拟中的暗物质晕或暗物质粒子。预期的输入点集应具有在笛卡尔XYZ中的位置。

可用的聚类统计类型

位于theory目录中的所有针对具有共动位置的宇宙盒工作的代码。各种聚类度量包括:

  1. DD – 测量两个盒子之间的自相关/互相关。盒子不必是立方体。

  2. xi – 测量立方宇宙盒子中的3D自相关。假设周期性边界条件。

  3. wp – 在立方宇宙盒子中测量自动二维点投影相关函数。假设周期性边界条件。

  4. DDrppi – 测量两个盒子之间的自相关/互相关函数。盒子不需要是立方体。

  5. DDsmu – 测量两个盒子之间的自相关/互相关函数。盒子不需要是立方体。

  6. vpf – 测量空域概率函数 + 单元中的计数。

对观测到的星系进行聚类度量

输入数据

输入星系通常是来自大规模星系调查的观测星系。此外,已经投影到天空中(即,观测系统误差已被纳入,并生成了天顶位置)的模拟星系也可以使用。我们通常将这两种星系统称为“模拟”。

输入星系应指定在球坐标中,至少包括赤经(RA)和赤纬(DEC)。对于空间相关函数,还需要一个近似的“共动”距离(光速乘以红移,CZ)。

可用的聚类统计类型

所有针对模拟目录(RA、DEC、CZ)工作的代码都位于mocks目录中。各种聚类度量包括

  1. DDrppi_mocks – 两个数据集之间的标准自相关/互相关。输出DD、DR和RR可以通过wprp结合来产生wp(rp)的Landy-Szalay估计值。

  2. DDsmu_mocks – 两个数据集之间的标准自相关/互相关。输出DD、DR和RR可以通过Python实用程序convert_3d_counts_to_cf结合来产生xi(s, mu)的Landy-Szalay估计值。

  3. DDtheta_mocks – 计算两个数据集之间的角相关函数。从DDtheta_mocks输出的结果需要与wtheta结合以获得完整的ω(θ)。

  4. vpf_mocks – 在模拟上计算空域概率函数。

科学选项

如果您计划使用命令行,那么您必须在编译时指定代码运行时选项。对于理论例程,这些选项在文件theory.options中,而对于模拟,这些选项在文件mocks.options中。

注意 如果您使用Python接口或静态库,则可以在运行时指定所有选项。以下每个Makefile选项都有一个对应于运行时库的条目。

理论(在theory.options中)

  1. PERIODIC(在wp/xi的情况下忽略)– 开关周期性边界条件。默认启用。

  2. OUTPUT_RPAVG – 在每个rp分箱中输出<rp>。可能对性能有很大影响(wp的情况下约为2.2倍)。默认禁用。

模拟(在mocks.options中)

  1. OUTPUT_RPAVG – 在DDrppi_mocks的每个rp分箱中输出<rp>。默认启用。

  2. OUTPUT_THETAAVG – 在每个θ分箱中输出。根据编译器和CPU的能力,可能非常慢(约为5倍)。默认禁用。

  3. LINK_IN_DEC – 为DDtheta_mocks创建赤纬分箱。请检查对于您期望的\theta限制,这种分箱不会产生错误结果(由于数值精度)。一般来说,如果您的\thetamax(考虑对内配对的最大\theta)太小(可能小于1度),那么您应该检查启用和禁用此选项的情况。错误通常在亚百分比级别。

  4. LINK_IN_RA – 在为DDtheta_mocks启用分箱后创建赤经分箱。与LINK_IN_DEC相同的数值问题。

  5. FAST_ACOS – 仅当为DDtheta_mocks启用OUTPUT_THETAAVG时相关。默认禁用。计算<\theta>需要arccos。在没有向量化的arccos(英特尔编译器,icc通过英特尔短向量数学库提供)的情况下,此计算非常慢。然而,我们可以使用多项式(使用Remez算法)来近似arccos。近似来自Geometric Tools发布的实现。根据所需的精度水平,此fast acos实现可以在文件utils/fast_acos.h中进行调整。该文件中已经存在一个更不精确的实现。请确保精度损失对您的用例不重要。

  6. COMOVING_DIST – 目前Corrfunc中不支持不同的宇宙学。然而,对于模拟程序,如DDrppi_mocksvpf_mocks,需要宇宙学参数来在红移和宇宙距离之间进行转换。DDrppi_mocksvpf_mocks都期望接收一个红移数组作为输入;然而,启用此选项后,红移数组将被假定为包含已转换的宇宙距离。因此,如果您有红移并且想要使用任意宇宙学,那么将红移转换为宇宙距离,启用此选项,并将宇宙距离数组传递给程序。

模拟和理论共用的代码选项

  1. DOUBLE_PREC – 开启双精度计算。启用时以双精度执行计算。此选项在理论中默认禁用,在模拟程序中默认启用。

  2. USE_OMP – 使用OpenMP并行化。扩展性非常好,对于DD(在我们的测试中接近完美的扩展性,直到12个线程),对于DDrppiwp则相当好(在我们的测试中运行时间成为常数~6-8线程)。默认启用。Makefile将比较CC变量与已知的OpenMP启用编译器,并相应地设置编译选项。默认在common.mk中设置。

  3. ENABLE_MIN_SEP_OPT – 使用基于单元格对之间的最小距离的一些进一步优化。默认启用。

  4. COPY_PARTICLES – 是否创建粒子位置(以及如果提供则权重)的副本。默认启用(粒子数组的副本将被创建)

  5. FAST_DIVIDE – 默认禁用。除法速度较慢但需要DDrppi_mocks(r_p,\pi)DDsmu_mocks(s, \mu)DD(s, \mu)。启用此选项,将除法替换为倒数和牛顿-拉夫森。代码将运行约快20%,但会牺牲一些数值精度。请确保精度损失对您的用例不重要。

优化您的架构

  1. 在《countpairs\_\*.c》文件中,bin_refine_factor 和/或 zbin_refine_factor 的值控制缓存未命中,从而影响运行时间。在试错方法中,Manodeep 发现大于 3 的任何值通常会使理论程序变慢,但可以使模拟变快。但是,对于 (z)bin_refine_factor 的 1/2 的不同组合可能在您的平台上更快。

  2. 如果您使用角相关函数并且需要 thetaavg,您可能从使用 INTEL MKL 库中受益。MKL 提供的向量化三角函数可以显著提高速度。

运行代码

阅读关于 corrfunc.rtfd.io 的文档。

使用命令行界面

导航到正确的目录。确保在根目录中的 theory.optionsmocks.options 中设置选项是您想要的。如果不是,请编辑这两个文件(以及可能 common.mk),然后重新编译。然后,您可以使用对应于您感兴趣聚类度量的各个子目录中的命令行可执行文件。例如,如果您想计算完整的 3-D 相关函数 \xi(r),则运行可执行文件 theory/xi/xi。如果您在没有任何参数的情况下运行可执行文件,程序将输出包含所有必需参数的消息。

从 C 调用

查看 run_correlations.crun_correlations_mocks.c 下的示例,了解如何直接调用 C API。如果您运行 run_correlationsrun_correlations_mocks 可执行文件,输出也将显示如何调用各种聚类度量的命令行界面。

从 Python 调用

如果一切顺利,代码可以直接从 python 调用。请参阅 call_correlation_functions.pycall_correlation_functions_mocks.py 了解如何直接使用 CPython 扩展的示例。以下是一些示例

from __future__ import print_function
import os.path as path
import numpy as np
import Corrfunc
from Corrfunc.theory import wp

# Setup the problem for wp
boxsize = 500.0
pimax = 40.0
nthreads = 4

# Create a fake data-set.
Npts = 100000
x = np.float32(np.random.random(Npts))
y = np.float32(np.random.random(Npts))
z = np.float32(np.random.random(Npts))
x *= boxsize
y *= boxsize
z *= boxsize

# Setup the bins
rmin = 0.1
rmax = 20.0
nbins = 20

# Create the bins
rbins = np.logspace(np.log10(0.1), np.log10(rmax), nbins + 1)

# Call wp
wp_results = wp(boxsize, pimax, nthreads, rbins, x, y, z, verbose=True, output_rpavg=True)

# Print the results
print("#############################################################################")
print("##       rmin           rmax            rpavg             wp            npairs")
print("#############################################################################")
print(wp_results)

作者 & 维护者

Corrfunc 由 Manodeep Sinha 设计和实现,并由 Lehman GarrisonNick HandArnaud de Mattia 贡献。Corrfunc 目前由 Manodeep Sinha 和 Lehman Garrison 维护。

引用

如果您在研究中使用了 Corrfunc,请使用以下 bibtex 条目引用 MNRAS 代码论文

@ARTICLE{2020MNRAS.491.3022S,
    author = {{Sinha}, Manodeep and {Garrison}, Lehman H.},
    title = "{CORRFUNC - a suite of blazing fast correlation functions on
    the CPU}",
    journal = {\mnras},
    keywords = {methods: numerical, galaxies: general, galaxies:
    haloes, dark matter, large-scale structure of Universe, cosmology:
    theory},
    year = "2020",
    month = "Jan",
    volume = {491},
    number = {2},
    pages = {3022-3041},
    doi = {10.1093/mnras/stz3157},
    adsurl =
    {https://ui.adsabs.harvard.edu/abs/2020MNRAS.491.3022S},
    adsnote = {Provided by the SAO/NASA
    Astrophysics Data System}
}

如果您使用的是 Corrfunc v2.3.0 或更高版本,并且从增强的向量化内核中受益,那么请另外引用这篇论文

@InProceedings{10.1007/978-981-13-7729-7_1,
    author="Sinha, Manodeep and Garrison, Lehman",
    editor="Majumdar, Amit and Arora, Ritu",
    title="CORRFUNC: Blazing Fast Correlation Functions with AVX512F SIMD Intrinsics",
    booktitle="Software Challenges to Exascale Computing",
    year="2019",
    publisher="Springer Singapore",
    address="Singapore",
    pages="3--20",
    isbn="978-981-13-7729-7",
    url={https://doi.org/10.1007/978-981-13-7729-7_1}
}

邮件列表

如果您对包有任何问题或评论,请在邮件列表上提出:https://groups.google.com/forum/#!forum/corrfunc

许可

Corrfunc 在 MIT 许可下发布。基本上,您可以对代码做任何事情,包括在商业应用程序中使用它。

项目 URL

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪一个,请了解更多关于 安装包 的信息。

源代码分发

corrfunc-2.5.3.tar.gz (91.5 MB 查看哈希值)

源代码

支持