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

文章详细介绍了如何安装InteloneAPI的基础版和NVIDIAGPU驱动及CUDA,包括在Ubuntu、RedHat和Fedora、SUSE等Linux系统上的依赖库安装。接着,下载并安装CodePlay的SYCL支持,配置环境变量,并通过编写和运行一个简单的SYCL程序来验证GPU的正确配置和功能。如果遇到问题,文章提供了卸载重装的建议。
摘要由CSDN通过智能技术生成

前提

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 <sycl/sycl.hpp>

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全部删除)再来一次安装

选择合适的矩阵布局是提高使用Intel oneAPI Math Kernel Library (oneMKL) 进行DPC++开发性能的关键步骤之一。在oneMKL中,矩阵可以以行主序(row-major)或列主序(column-major)布局存储,这直接影响着性能表现,尤其是在多核心和异构计算环境中。行主序布局意味着矩阵的行在内存中连续存放,而列主序布局则是指列在内存中连续存放。 参考资源链接:[Intel oneAPI Math Kernel Library for DPC++ Developer's Guide: Data Parallel Acceleration and APIs](https://wenku.csdn.net/doc/5z38cyenfs) 开发者在选择矩阵布局时应该考虑以下几点: 1. **硬件架构**:不同的处理器和加速器对于不同布局的优化程度不同。例如,GPU通常更善于处理行主序布局的数据,因为这样可以更好地利用其宽内存接口,而CPU则可能对两种布局都有较好的支持。 2. **数据访问模式**:分析算法中数据访问模式,如果算法中某个方向的索引变化更频繁,那么将该方向设置为主序布局可能更优。 3. **缓存效率**:考虑矩阵布局对缓存的影响。行主序布局通常在处理大型矩阵时能更好地利用缓存,而列主序布局可能在某些情况下导致缓存未命中率提高。 4. **oneMKL实现特性**:oneMKL的某些函数对于特定布局进行了优化。查阅oneMKL文档,了解不同BLAS和LAPACK函数对矩阵布局的具体要求和性能特点。 5. **内存带宽**:内存带宽是影响性能的另一重要因素。如果数据访问模式能够很好地与内存带宽对齐,性能将得到提升。 在实际应用中,开发者应该基于oneMKL提供的性能基准测试结果和自己的特定应用场景,来选择最适合的矩阵布局。此外,可以参考《Intel oneAPI Math Kernel Library for DPC++ Developer's Guide: Data Parallel Acceleration and APIs》来进一步了解如何在不同场景下选择和优化矩阵布局。这份资料提供了深入的技术细节和案例研究,帮助开发者利用oneMKL的API进行高效的数据并行开发。 参考资源链接:[Intel oneAPI Math Kernel Library for DPC++ Developer's Guide: Data Parallel Acceleration and APIs](https://wenku.csdn.net/doc/5z38cyenfs)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值