目前我正在使用C ++ 11异步功能来创建额外的线程来运行我的计算内核。计算内核彼此完全独立。我想知道两件事。
伪代码如下:
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();
}
增加:
答案 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。