2

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

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

4

2 回答 2

0

你没试过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;
}
于 2021-02-15T16:39:08.923 回答
0

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

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

于 2021-02-07T21:43:10.813 回答