C++ 在C+中从多线程CPU程序转移到GPU+;

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

我创建了一个程序,需要使用不同的输入参数多次调用函数(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.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编程还不熟悉

  • 有没有一种方法(因为我已经有了一个单独的计算函数)可以在不改变整个代码的情况下轻松地移动它?像一个可以在GPU上以类似于boost的方式启动线程的函数(比如用GPU线程替换boost线程)
  • 另外,我的计算功能是访问一些加载在内存中的数据(这里是RAM),GPU是否需要将这些数据加载到GPU内存中,或者它是否可以访问RAM(在这种情况下,哪个更快)
  • 还有最后一个问题(尽管我很确定我知道答案),是否可以使其独立于硬件(这样我的代码就可以在Nvidia、ATI等上运行)
  • 谢谢。

    • 1) 最简单的解决方案是使用#pragma指令(OpenACC),该指令应该已经存在于GCC7中

    • 2) 您的数据应该是GPU友好的,了解阵列的结构

    • 3) 你的compute_desc“内核”应该是GPU兼容的,如果你不知道,让我们说它应该可以被编译器矢量化


    我希望它能对你有所帮助,我认为一个关于OpenACC的小教程应该是你最好的解决方案,CUDA/OpenCL应该在稍后发布。我的2美分

    如果您需要支持多线程的跨硬件支持,您最好的选择可能是学习Vulkan。它比openGL高效得多,并且允许nVidia和AMD硬件,与我所看到的CUDAF相比,Vulkan更倾向于图形而不是计算,不是吗?是的,你是对的,也许可以尝试一下OpenCL?谢谢你的教程。虽然我必须深入研究文档,因为在我的例子中,我的循环调用我的处理函数,它本身就有循环调用函数。我认为OpenACC2.0有一个叫做
    routine
    的东西我可以使用,但我还没有弄清楚如何使用它。