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

whi*_*dow 6 c++ multithreading cuda gpu

我创建了一个程序,需要使用不同的输入参数多次(很多次!!)调用一个函数。为了加快速度,我像这样进行多线程处理:

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();
Run Code Online (Sandbox Code Playgroud)

这段代码是一个更大的代码的一部分,所以不要太担心变量名称等...重要的是我MTDPDS为每个包含输入和输出参数的线程创建一个对象(),然后生成一个线程调用我的处理函数compute_desc,并等待所有线程完成后再继续。

然而,我的for循环有大约 2000 多次迭代,这意味着我启动了大约 2000 多个线程。我在集群上运行我的代码,所以速度相当快,尽管在我看来仍然需要很长时间。

我想将这部分移至 GPU(因为它有更多的内核),尽管我对 GPU 编程很陌生。

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

谢谢。

Tim*_*afé 3

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

  • 2)你的数据应该是GPU友好的,了解数组的结构

  • 3)你的compute_desc“内核”应该是GPU兼容的,如果你不知道,就说它应该由编译器进行矢量化。

我希望它能有所帮助,我认为有关 OpenACC tuto的小教程应该是最适合您的解决方案,CUDA/OpenCL 应该稍后提供。我的2分钱