dpc++(oneAPI)调用nvidiaGPU配置与验证

前提

1.安装Intel® oneAPI Toolkits
https://software.intel.com/content/www/us/en/develop/documentation/installation-guide-for-intel-oneapi-toolkits-linux/top.html
下载安装Base版,注意版本,尽量安装新版本

2.安装GPU驱动与CUDA
https://developer.nvidia.com/cuda-downloads
建议为11.8及以上版本
nvidia-smi能出现cuda版本

安装插件

1.依赖库

  • Ubuntu
sudo apt update
sudo apt -y install cmake pkg-config build-essential
  • Red Hat and Fedora
sudo yum update
sudo yum -y install cmake pkgconfig
sudo yum groupinstall "Development Tools"
  • SUSE
sudo zypper update
sudo zypper --non-interactive install cmake pkg-config
sudo zypper --non-interactive install pattern devel_C_C++
  • 验证
which cmake pkg-config make gcc g++

显示
/usr/bin/cmake
/usr/bin/pkg-config
/usr/bin/make
/usr/bin/gcc
/usr/bin/g++

2.下载

https://developer.codeplay.com/products/oneapi/nvidia/download/
对应自己的版本,没有选低一点的版本

安装

chmod +x oneapi-for-nvidia-gpus-2023.1.0-cuda-12.0-linux.sh
sh oneapi-for-nvidia-gpus-2023.1.0-cuda-12.0-linux.sh

安装之前oneapi安装的位置运行

. /opt/intel/oneapi/setvars.sh --include-intel-llvm
或者
. ~/intel/oneapi/setvars.sh --include-intel-llvm

配置.bashrc(按自己路径)

export PATH=/PATH_TO_CUDA_ROOT/bin:$PATH
export LD_LIBRARY_PATH=/PATH_TO_CUDA_ROOT/lib:$LD_LIBRARY_PATH

查看GPU

sycl-ls

显示本机的gpu如[ext_oneapi_cuda:gpu:0] NVIDIA CUDA BACKEND, TITAN RTX 0.0 [CUDA 11.0]

验证

#include 

int main() {
  // Creating buffer of 4 ints to be used inside the kernel code
  sycl::buffer<sycl::cl_int, 1> Buffer(4);

  // Creating SYCL queue
  sycl::queue Queue;

  // Size of index space for kernel
  sycl::range<1> NumOfWorkItems{Buffer.size()};

  // Submitting command group(work) to queue
  Queue.submit([&](sycl::handler &cgh) {
    // Getting write only access to the buffer on a device
    auto Accessor = Buffer.get_access<sycl::access::mode::write>(cgh);
    // Executing kernel
    cgh.parallel_for<class FillBuffer>(
        NumOfWorkItems, [=](sycl::id<1> WIid) {
          // Fill buffer with indexes
          Accessor[WIid] = (sycl::cl_int)WIid.get(0);
        });
  });

  // Getting read only access to the buffer on the host.
  // Implicit barrier waiting for queue to complete the work.
  const auto HostAccessor = Buffer.get_access<sycl::access::mode::read>();

  // Check the results
  bool MismatchFound = false;
  for (size_t I = 0; I < Buffer.size(); ++I) {
    if (HostAccessor[I] != I) {
      std::cout << "The result is incorrect for element: " << I
                << " , expected: " << I << " , got: " << HostAccessor[I]
                << std::endl;
      MismatchFound = true;
    }
  }

  if (!MismatchFound) {
    std::cout << "The results are correct!" << std::endl;
  }

  return MismatchFound;
}


编译

icpx -fsycl -fsycl-targets=nvptx64-nvidia-cuda simple-sycl-app.cpp -o simple-sycl-app

可无视的警告

icpx: warning: CUDA version is newer than the latest supported version 11.8 [-Wunknown-cuda-version]

运行

SYCL_DEVICE_FILTER=cuda SYCL_PI_TRACE=1 ./simple-sycl-app

结果

SYCL_PI_TRACE[basic]: Plugin found and successfully loaded: libpi_cuda.so [ PluginVersion: 11.15.1 ]
SYCL_PI_TRACE[all]: Selected device: -> final score = 1500
SYCL_PI_TRACE[all]:   platform: NVIDIA CUDA BACKEND
SYCL_PI_TRACE[all]:   device: NVIDIA GeForce RTX 2060
The results are correct!

如果没有成功可以把oneapi全部卸载(/opt和/home下的intel全部删除)再来一次安装

你可能感兴趣的:(c++,oneapi)