从 Rust 调用 OpenACC 代码不会在 GPU 上 运行

Calling OpenACC code from Rust does not run on GPU

2020 年 9 月 7 日更新

我在 https://gitlab.com/lisanhu2016/rust-openacc-example.git

上为此添加了一个小示例

这是一个带有 README 的 public 存储库,您应该可以尝试那里的示例。

我一直link使用的库是:nvc、acchost、pgm,您可以在build.rs

中看到它们

===

我正在尝试从 rust 代码调用 openacc 代码,我遇到的问题可能与 linking 有关。 我正在使用以下步骤:

  1. 使用 openacc 标志 -acc -gpu=managed -Minfo=accel 编译 bindings.cc 并将其转换为静态库 libfoo.a
[ 87%] Building CXX object CMakeFiles/foo.dir/bindings.cc.o
/opt/nvidia/hpc/20.7/Linux_x86_64/20.7/compilers/bin/nvc++    -fast -O3 -DNDEBUG   -fPIC -acc -gpu=managed -Minfo=accel -o CMakeFiles/foo.dir/bindings.cc.o -c /usa/lisanhu/tmp/rust-c-ffi-example/bindings.cc
process_batch:
      6, Generating copyout(lengths[:array.l]) [if not already present]
         Generating implicit copyin(array.data[:]) [if not already present]
         Generating Tesla code
         10, #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */
      6, Generating implicit copyin(array) [if not already present]
[100%] Linking CXX static library libfoo.a
  1. 使用 libfoo.a 编译 Rust 代码,并动态 link 到库 nvc nvcpumath nvhost nvdevice.
  2. 运行 带有一些数据的代码,运行s.
  3. 运行带PGI_ACC_TIME=1的代码,没有时间信息
  4. 运行带ncu --set full的代码,没有显示内核信息

我想我们可能 link 访问了错误的库,但我不确定,请您帮我解决这个问题好吗?非常感谢!!

我通过 OpenACC Slack 频道与三虎合作完成了这个。有两个问题。

首先,因为他没有 link 使用 PGI/NV,他需要添加“-gpu=nordc”标志。 RDC 需要一个设备 link 在被 Rust link 编辑时未执行的步骤。

其次,由于“数据”数组是由 Rust 分配的,因此不会放入 CUDA 统一内存中。因此,他需要使用“process_array”例程将其添加到 OpenACC 数据区域。