多线程 NVPL FFT#

本节介绍 NVPL FFT 的多线程支持和实现。

基于 OpenMP 的线程#

NVPL FFT 中的多线程支持基于 GNU OpenMP 运行时。

以下运行时与 GNU OpenMP 运行时 ABI 兼容

  • GNU OpenMP 运行时: libgomp.so.1

  • LLVM OpenMP 运行时: libomp.so, libomp.so.5, 等。

  • NVIDIA 的 OpenMP 运行时: libnvomp.so

此处的 ABI 兼容性意味着使用 GNU OpenMP 构建的应用程序或库(包括 NVPL FFT)可以与其他这些运行时透明地工作。

由于不同的 OpenMP 运行时使用不同的库名称,NVPL FFT 不显式依赖于任何一个。相反,该库实现了惰性动态符号解析。

  • 惰性意味着符号解析在首次使用时在运行时发生。

  • 动态意味着符号使用 dlopen()dlsym() API(或类似物)解析。

NVPL FFT 将首先尝试解析当前进程地址空间中的 OpenMP 符号;如果失败,它将尝试加载 (dlopen()) 默认运行时,即 GNU OpenMP。

警告

由于 NVPL FFT 不显式依赖于任何特定的 OpenMP 运行时(默认运行时为 GNU OpenMP 运行时),因此强烈建议始终将适当的 OpenMP 运行时链接到使用 NVPL FFT 的最终应用程序或库。这将确保在执行期间加载适当的 OpenMP 运行时。

线程安全#

NVPL FFT,如同 cuFFT 和 cuFFTW,是线程安全的,只要输出数据是不相交的,并且每个线程使用自己的计划执行 FFT。请注意,这不包括 fftw_plan_with_nthreads,它不是线程安全的。因此,如果用户希望使用不同线程数的计划,则需要按顺序创建计划。

除了上述情况,如同 FFTW,以输入和输出数据作为参数的执行 API 本身是线程安全的。这意味着线程可以共享一个计划并并行执行 FFT,再次假设输出数据是不相交的。请注意,并行调用 fftw_destroy_plan同一计划线程安全的。用户需要在并行区域之外销毁共享计划。

NVPLSamples 中提供了两个示例,c2c_single_withomp_exampler2c_c2r_single_withomp_example,用于演示如何在上述两种情况下将 OpenMP 与 NVPL FFT 一起使用。