从Rust调用OpenACC代码无法在GPU上运行

问题描述

更新09/07/2020

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

上为此添加一个小示例

这是一个带有自述文件的公共存储库,您应该可以在那里尝试示例。

我一直链接到的库是:nvc,acchost,pgm,您可以在build.rs中看到它们

===

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

  1. 使用openacc标志bindings.cc编译-acc -gpu=managed -Minfo=accel并将其转换为静态库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代码,并动态链接到库nvc nvcpumath nvhost nvdevice
  2. 使用一些数据运行代码,它就会运行。
  3. 使用PGI_ACC_TIME=1运行代码,没有时间信息
  4. 使用ncu --set full运行代码,它不显示内核信息

我认为我们可能链接到错误的库,但是我不确定,请您帮我解决这个问题?非常感谢!!

解决方法

我通过OpenACC Slack频道与Sanhu合作。有两个问题。

首先,由于他未与PGI / NV链接,因此需要添加“ -gpu = nordc”标志。 RDC链接到RDC时,不需要执行设备链接步骤。

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...