我创建了一个程序,需要使用不同的输入参数多次调用函数(批量!!)。 为了加快速度,我多了这个多线程:
std::vector< MTDPDS* > mtdpds_list;
boost::thread_group thread_gp;
for (size_t feat_index = 0; feat_index < feat_parser.getNumberOfFeat(); ++feat_index)
{
Feat* feat = feat_parser.getFeat(static_cast<unsigned int>(feat_index));
// != 0 has been added to avoid a warning message during compilation
bool rotatedFeat = (feat->flag & 0x00000020) != 0;
if (!rotatedFeat)
{
Desc* desc = new Desc(total_sb, ob.size());
MTDPDS* processing_data = new MTDPDS();
processing_data->feat = feat;
processing_data->desc = desc;
processing_data->img_info = image_info;
processing_data->data_op = &data_operations;
processing_data->vecs_bb = vecs_bb;
mtdpds_list.push_back(processing_data);
thread_gp.add_thread(new boost::thread(compute_desc, processing_data));
}
}
// Wait for all threads to complete
thread_gp.join_all();
这段代码是一个更大的代码片段,所以不要过分担心变量名称等...
重要的是我为每个包含输入和输出参数的线程创建一个对象(MTDPDS
),然后生成一个调用我的处理函数compute_desc
的线程,并在继续之前等待所有线程完成。
然而,我的for
循环有大约2000多次迭代,这意味着我开始大约2000多个线程。我在集群上运行我的代码,所以速度非常快,尽管IMO仍需要太长时间。
我想把这部分移到GPU上(因为它有更多核心),虽然我是GPU编程的新手。
谢谢。
答案 0 :(得分:3)
1)最简单的解决方案是使用#pragma指令(OpenACC),它应该已经存在于GCC7中。
2)您的数据应该是GPU友好的,了解数组结构
3)你的compute_desc“内核”应该符合GPU标准,如果你不知道让它说它应该由编译器进行矢量化。
我希望它会有所帮助,我认为关于OpenACC tuto 的一些小教程应该是最好的解决方案,CUDA / OpenCL应该会在以后出现。我的2美分