C++从多线程 CPU 程序迁移到 GPU
Moving from Multithreaded CPU program to GPU in C++
我创建了一个程序,该程序需要使用不同的输入参数多次调用函数(很多!!(。 为了加快速度,我像这样多线程:
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 编程的新手。
- 有没有办法(因为我已经有一个单独的计算功能(在不更改整个代码的情况下轻松移动它?就像一个可以以类似于 boost 的方式在 GPU 上启动线程的函数(比如用 GPU 线程替换提升线程(?
- 另外,我的计算函数正在访问内存中加载的一些数据(此处为 RAM(,GPU 是否需要将这些数据加载到 GPU 内存中,或者它可以访问 RAM(然后在这种情况下,哪个更快(?
- 最后一个问题(虽然我很确定我知道答案(,是否有可能使其独立于硬件(这样我的代码就可以在 Nvidia、ATI 等上运行......
谢谢。
-
1(最简单的解决方案是使用GCC7中应该已经存在的 #pragma 指令(OpenACC(。
-
2(您的数据应该是GPU友好的,了解数组的结构
-
3(你的compute_desc"内核"应该是GPU兼容的,如果你不知道,就说它应该可以被编译器矢量化。
我希望它会有所帮助,我认为关于OpenACC tuto的小教程应该是最适合您的解决方案,CUDA/OpenCL应该稍后出现。我的2美分
相关文章:
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 有没有办法简单地从 GPU 调用多个 cpp 输出文件?
- 将项目从 Debian 8 Xenomai 2.x 迁移到 Debain 9 Xenomai 3.x
- 在 DirectX 11 中从 GPU 读回顶点缓冲区(并获取顶点)
- 跨平台 GPU 计算
- C++:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)
- 请求最简单的 OpenMP 目标 GPU 示例
- DirectX 11 如何处理来自 GPU 上的 sharedHandle 的图像
- 编译 GPU 的张量流示例自定义操作
- 多 GPU 批处理 1D FFT:似乎只有一个 GPU 可以工作
- 如何在GPU支持下编译tflite?
- OpenCL 在 NVIDIA 和 Intel GPU 上启动内核时CL_INVALID_COMMAND_QUEUE
- OpenGL glGetUniformBlockIndex 在 nvidea GPU 上返回INVALID_INDEX
- 从 MFC C++ 6.0 应用程序迁移到 VS 2005
- 将预处理器配置定义迁移到 constexpr,而不会造成内存膨胀
- SDL GPU 为什么将两个图像分成两个单独的循环更快?
- 使 C++ Pi 近似在 GPU Nvidia 970M CUDA 上的 Paralell 中运行
- 具有 GPU 时间表的卤化物产生黑色图像
- TensorFlow c++ SetDefaultDevice 在多 GPU 模式下
- C++从多线程 CPU 程序迁移到 GPU