我正在开发一个相当大的并行应用程序,使用OpenMPI在MPI进程之间分发数据。将MPI与一些序列化库一起使用,例如"谷物"使传递巨大的多嵌入物体变得非常舒适。为了暗示多嵌入式结构的含义,我目前正在使用简化版本,例如:
// structures for CUDA - this is inside std::vector<struct_multi_data> multi_data_vector
struct struct_multi_data{
int intended_kernel_block;
int intended_kernel_thread;
std::vector<float> data_float;
std::vector<float> data_int;
float result;
};
struct struct_unique_data{
// this structure is shared among all blocks/threads
float x;
float y;
float z;
};
class Data_object{
// functions
public:
Data_object();
~Data_object();
int resize(int multi_data_vector_len, int data_float_len, int data_int_len);
void set_id(int id);
int clean(void);
int get_multi_data_len();
int get_multi_data(struct_multi_data * data, int vector_element);
int set_multi_data(struct_multi_data * data, int vector_element);
// variables
private:
std::vector<struct_multi_data> multi_data_vector;
struct_unique_data unique_data;
int data_id;
};
*上面的代码是简化的,我删除了序列化函数和其他一些基本的东西,但整体结构保持
简单地说,我正在移动 Data_object ,其中包含 vector {struct_multi_data} ,这是一个结构向量,其中每个结构 struct_multi_data < / strong>包含一些 vector {float} 。
我有充分的理由将所有数据嵌入到1个Data_object中,因为它简化了MPI的发送和接收。
问题
使用cudaMalloc / cudaMemcpy函数将Data_object移动到GPU内存是否有一些舒适的方法?
常规std :: vector似乎有问题。我不想依赖 Thrust 库,因为我不确定它是否适用于我的MPI序列化解决方案。
编辑问题 我可以将托管用于我的Data_object,还是使用cudaMallocManaged()来使GPU可以访问数据?
请仔细阅读
Data_object的大小在程序执行开始时定义良好。没有任何向量在其他任何地方改变大小,但是执行的开始。那我为什么要使用载体呢?这样我就可以通过传递参数来设置向量大小,而不是重新编译程序来改变数据大小(例如当数据被定义为数组时)。
对评论的回应 1)我认为可以用指向数组的指针替换所有向量。
答案 0 :(得分:2)
不,这个问题的其他部分没有帮助。 std::vector
并不打算以这种方式工作:它“拥有”它所指向的内存,如果你将它存储在其他地方(甚至在主机内存中)并从那里使用它,你就会腐败你的记忆此外,std::vector
代码甚至无法在GPU上运行,因为它不是__device__
- 代码。
你可以做的是使用std::span
,不拥有内存,而不是std::vector
。如果你这样做,并且内存被管理,那么mem-copy类可能会有效。
注意我完全忽视了矢量以外的成员,因为这似乎是这里的主要问题。