C++ 在C+中从多线程CPU程序转移到GPU+;
我创建了一个程序,需要使用不同的输入参数多次调用函数(lots!!)。 为了加快速度,我将多线程处理如下:C++ 在C+中从多线程CPU程序转移到GPU+;,c++,multithreading,cuda,gpu,C++,Multithreading,Cuda,Gpu,我创建了一个程序,需要使用不同的输入参数多次调用函数(lots!!)。 为了加快速度,我将多线程处理如下: 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.get
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();
std::vectorMTDPDS\u列表;
boost::线程组线程组;
对于(size_t feat_index=0;feat_index标志&0x00000020)!=0;
如果(!rotatedFeat)
{
Desc*Desc=新Desc(总尺寸());
MTDPDS*处理_数据=新MTDPDS();
处理数据->专长=专长;
处理数据->描述=描述;
处理数据->图像信息=图像信息;
处理数据->数据操作=&数据操作;
处理_数据->向量_bb=向量_bb;
mtdpds_列表。推回(处理_数据);
线程总成。添加线程(新的boost::thread(计算描述,处理数据));
}
}
//等待所有线程完成
螺纹总成连接所有螺纹();
这段代码是一段大得多的代码,所以不要太担心变量名等。。。
重要的是,我为每个包含输入和输出参数的线程创建一个对象(MTDPDS
),然后生成一个调用我的处理函数compute_desc
)的线程,并等待所有线程完成后再继续
然而,我的for
循环有大约2000多个迭代,这意味着我开始大约2000多个线程。我在集群上运行我的代码,所以速度相当快,尽管它仍然需要很长时间
我想把这个部分转移到GPU上(因为它有更多的内核),尽管我对GPU编程还不熟悉
- 1) 最简单的解决方案是使用#pragma指令(OpenACC),该指令应该已经存在于GCC7中
- 2) 您的数据应该是GPU友好的,了解阵列的结构
- 3) 你的compute_desc“内核”应该是GPU兼容的,如果你不知道,让我们说它应该可以被编译器矢量化
我希望它能对你有所帮助,我认为一个关于OpenACC的小教程应该是你最好的解决方案,CUDA/OpenCL应该在稍后发布。我的2美分如果您需要支持多线程的跨硬件支持,您最好的选择可能是学习Vulkan。它比openGL高效得多,并且允许nVidia和AMD硬件,与我所看到的CUDAF相比,Vulkan更倾向于图形而不是计算,不是吗?是的,你是对的,也许可以尝试一下OpenCL?谢谢你的教程。虽然我必须深入研究文档,因为在我的例子中,我的循环调用我的处理函数,它本身就有循环调用函数。我认为OpenACC2.0有一个叫做
routine
的东西我可以使用,但我还没有弄清楚如何使用它。