【问题标题】:Can I write OpenCL-C++ kernels for nVIDIA GPUs?我可以为 nVIDIA GPU 编写 OpenCL-C++ 内核吗?
【发布时间】:2019-11-06 08:48:14
【问题描述】:

在过去几年中,Khronos 联盟发布了 OpenCL 规范版本,其中不仅包括 C-variant OpenCL 编程语言,还包括 C++-variant

是否可以使用最新版本的 CUDA 和相关工具编写此类针对 nVIDIA GPU 的类 C++ 内核? NVIDIA OpenCL samples 似乎有些过时且仅限 C 语言。

【问题讨论】:

  • 据我所知,NVIDIA 已停止围绕 OpenCL 1.2 积极开发 OpenCL
  • @talonmies:实际上,nVIDIA 开始支持 OpenCL 2.0 in 2017

标签: c++ opencl opencl-c++


【解决方案1】:

借助 OpenCL 3.0 支持,您将能够使用“C++ for OpenCL”对内核进行编程 - 它使开发人员能够在 OpenCL 内核中使用大多数 C++17 功能。有关 OpenCL 3.0 的更多信息,请访问here

“当规范最终确定时,NVIDIA 将发布符合标准的 OpenCL 3.0”——根据this 新闻稿。 OpenCL 3.0 最终规范于 2020 年 9 月 30 日发布。但是截至 2021 年 2 月,我还没有发现任何支持 OpenCL 3.0 的 Nvidia 驱动程序。

【讨论】:

  • 嗯,好吧,但就像你说的 - 那仍然是天上掉馅饼。此外,OpenCL 3.0 将大部分功能/特性从 OpenCL 2.x 降级回 OpenCL 1.x,不是吗?
  • OpenCL 3.0 已经出现在某些平台上——英特尔驱动程序已经实现了它。 Nvidia 正在努力,因此支持驱动程序应该很快就会发布。 OpenCL 3.0 使 OpenCL 1.2 成为基准,OpenCL 2.x 成为可选功能。它不会降级,但为供应商提供了灵活性。
【解决方案2】:

您没有尝试 Sycl?它使用 OpenCL,仅通过您的 C++ 主机代码。

https://www.codingame.com/playgrounds/48226/introduction-to-sycl/hello-world

#include <iostream>
#include <CL/sycl.hpp>

class vector_addition;

int main(int, char**) {
   cl::sycl::float4 a = { 1.0, 2.0, 3.0, 4.0 };
   cl::sycl::float4 b = { 4.0, 3.0, 2.0, 1.0 };
   cl::sycl::float4 c = { 0.0, 0.0, 0.0, 0.0 };

   cl::sycl::default_selector device_selector;

   cl::sycl::queue queue(device_selector);
   std::cout << "Running on "
             << queue.get_device().get_info<cl::sycl::info::device::name>()
             << "\n";
   {
      cl::sycl::buffer<cl::sycl::float4, 1> a_sycl(&a, cl::sycl::range<1>(1));
      cl::sycl::buffer<cl::sycl::float4, 1> b_sycl(&b, cl::sycl::range<1>(1));
      cl::sycl::buffer<cl::sycl::float4, 1> c_sycl(&c, cl::sycl::range<1>(1));
  
      queue.submit([&] (cl::sycl::handler& cgh) {
         auto a_acc = a_sycl.get_access<cl::sycl::access::mode::read>(cgh);
         auto b_acc = b_sycl.get_access<cl::sycl::access::mode::read>(cgh);
         auto c_acc = c_sycl.get_access<cl::sycl::access::mode::discard_write>(cgh);

         cgh.single_task<class vector_addition>([=] () {
         c_acc[0] = a_acc[0] + b_acc[0];
         });
      });
   }
   std::cout << "  A { " << a.x() << ", " << a.y() << ", " << a.z() << ", " << a.w() << " }\n"
        << "+ B { " << b.x() << ", " << b.y() << ", " << b.z() << ", " << b.w() << " }\n"
        << "------------------\n"
        << "= C { " << c.x() << ", " << c.y() << ", " << c.z() << ", " << c.w() << " }"
        << std::endl;
        
   return 0;
}

【讨论】:

  • 如果我有一个 OpenCL-C++ 内核,我可以把它放在一个 SyCL lambda 中并让它工作吗?
  • 如果类型最初不兼容,它可能需要适配器类或额外的转换。我放在那里的链接是一个实时的sycl runner,你可以在上面玩。但 Nvidia cuda 调试器或分析器可能需要更多调整才能使用 opencl 分析。
猜你喜欢
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
  • 2020-05-22
  • 2011-11-12
  • 2023-03-07
  • 2019-06-15
  • 1970-01-01
相关资源
最近更新 更多