嵌入对象/结构的cudaMalloc / cudaMemcpy

时间:2017-11-27 11:23:15

标签: c++ vector struct cuda mpi

我正在开发一个相当大的并行应用程序,使用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)我认为可以用指向数组的指针替换所有向量。

1 个答案:

答案 0 :(得分:2)

不,这个问题的其他部分没有帮助。 std::vector并不打算以这种方式工作:它“拥有”它所指向的内存,如果你将它存储在其他地方(甚至在主机内存中)并从那里使用它,你就会腐败你的记忆此外,std::vector代码甚至无法在GPU上运行,因为它不是__device__ - 代码。

你可以做的是使用std::span拥有内存,而不是std::vector。如果你这样做,并且内存被管理,那么mem-copy类可能会有效。

注意我完全忽视了矢量以外的成员,因为这似乎是这里的主要问题。