【问题标题】:Convert C++ Async function to GPU compute将 C++ 异步函数转换为 GPU 计算
【发布时间】:2018-02-23 14:11:16
【问题描述】:

目前我正在使用 C++ 11 异步功能来创建额外的线程来运行我的计算内核。计算内核彼此完全独立。我想知道两件事。

  1. 这种计算模型是否适合使用 GPU 进行优化?
  2. 如果问题 1 为真,这种优化的基本做法是什么?

伪代码如下:

vector<std::future<ResultType>> futureVector;
for (int i = 0; i < std::thread::hardware_concurrency(); i ++) {
    auto future = std::async(
    std::launch::async,
        &computingKernel,
        this,
        parameter1,
        parameter2);
    futureVector.push_back(move(future));
}

for (int i = 0 ; i < futureVector.size(); i++) {
    // Get result
    futureVector[i].get();
}

加法:

  1. 有没有办法在不更改整个代码的情况下轻松移动它?就像可以在 GPU 上启动线程的程序标记

【问题讨论】:

  • 不,不适用,不,CUDA 编程不像你想象的那样工作
  • @talonmies 所以你的意思是使用 GPU 优化它的唯一方法是在 CUDA 中重写这部分,对吧?
  • @talonmies 我正在通过 openACC。你认为这对我的目的有好处吗?
  • 关于你的第一点——不是真的。您显示的代码甚至不会存在于 CUDA 实现中。你会得到一个重写的computingKernel。不管你想象什么,GPU 不会像伪代码假设的那样运行线程
  • @talonmies 感谢您的评论。实际上,computingKernel 在我的用例中运行了 1 亿次。所以这就是我想使用 GPU 来加速它的原因。但它在典型的多核/SMP 架构中作为生产者和消费者模型运行,并且需要大量时间。我会尝试重新实现计算内核以兼容 GPU 来尝试

标签: c++ parallel-processing cuda gpu


【解决方案1】:

这个计算模型适合用GPU优化吗?

没有。嗯,大部分都没有。

使用 GPU,您无需单独调度单线程任务或内核并明确等待每个任务结束。你告诉 GPU 用 N 个线程运行你的内核(N 可以很大);当然,内核是同一段代码,但行为根据线程索引而有所不同;然后等待所有线程的执行结束。

实际上它有点复杂(例如线程索引是 3 维的,线程分组具有特殊含义)但基本上就是这样。

因此,GPU 的计算模型与此有一些相似之处和不同之处。

如果问题1为真,这种优化的基本做法是什么?

您可以找到启动 CUDA 内核 here 的基本示例(或相同的程序,但使用官方的底层 C 风格 API here)。

请注意,可以异步启动 CUDA 内核。无论如何,单线程的执行大多是异步的,但 CPU 线程可以选择不等待 GPU 上的执行结束。

有没有办法在不更改整个代码的情况下轻松移动它?就像可以在 GPU 上启动线程的程序标记

没有。但是有 Parallel STL 的倡议,目的是让它也能够利用 GPU。见this talk at CppCon 2017

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-25
    • 2012-07-25
    • 1970-01-01
    • 2014-03-29
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多