从 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 有关。
我正在使用以下步骤:
- 使用 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
- 使用
libfoo.a
编译 Rust 代码,并动态 link 到库 nvc
nvcpumath
nvhost
nvdevice
.
- 运行 带有一些数据的代码,运行s.
- 运行带
PGI_ACC_TIME=1
的代码,没有时间信息
- 运行带
ncu --set full
的代码,没有显示内核信息
我想我们可能 link 访问了错误的库,但我不确定,请您帮我解决这个问题好吗?非常感谢!!
我通过 OpenACC Slack 频道与三虎合作完成了这个。有两个问题。
首先,因为他没有 link 使用 PGI/NV,他需要添加“-gpu=nordc”标志。 RDC 需要一个设备 link 在被 Rust link 编辑时未执行的步骤。
其次,由于“数据”数组是由 Rust 分配的,因此不会放入 CUDA 统一内存中。因此,他需要使用“process_array”例程将其添加到 OpenACC 数据区域。
2020 年 9 月 7 日更新
我在 https://gitlab.com/lisanhu2016/rust-openacc-example.git
上为此添加了一个小示例这是一个带有 README 的 public 存储库,您应该可以尝试那里的示例。
我一直link使用的库是:nvc、acchost、pgm,您可以在build.rs
===
我正在尝试从 rust 代码调用 openacc 代码,我遇到的问题可能与 linking 有关。 我正在使用以下步骤:
- 使用 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
- 使用
libfoo.a
编译 Rust 代码,并动态 link 到库nvc
nvcpumath
nvhost
nvdevice
. - 运行 带有一些数据的代码,运行s.
- 运行带
PGI_ACC_TIME=1
的代码,没有时间信息 - 运行带
ncu --set full
的代码,没有显示内核信息
我想我们可能 link 访问了错误的库,但我不确定,请您帮我解决这个问题好吗?非常感谢!!
我通过 OpenACC Slack 频道与三虎合作完成了这个。有两个问题。
首先,因为他没有 link 使用 PGI/NV,他需要添加“-gpu=nordc”标志。 RDC 需要一个设备 link 在被 Rust link 编辑时未执行的步骤。
其次,由于“数据”数组是由 Rust 分配的,因此不会放入 CUDA 统一内存中。因此,他需要使用“process_array”例程将其添加到 OpenACC 数据区域。