将C ++异步函数转换为GPU计算

时间:2018-02-23 14:11:16

标签: c++ parallel-processing cuda gpu

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

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

    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上启动线程的程序标记

1 个答案:

答案 0 :(得分:1)

  

此计算模型是否适合使用GPU进行优化?

没有。好吧,大多是没有。

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

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

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

  

如果问题1为真,那么这种优化的基本实践是什么?

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

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

  

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

没有。但是有并行STL的倡议,其目的是使其能够使用GPU。请参阅this talk at CppCon 2017