如何使用CUDA/ c++创建类对象?



我想创建一个类对象数组,这个数组必须由我的GPU访问。

我有三个文件:

  1. 我的类头文件"Person.h">

#pragma once

#include <iostream>


class Person
{
private:
std::string name, surname;
int age;

public:
Person();
void print();

};
  • "Person.cpp"文件:
  • 
    #include "Person.h"
    
    
    Person::Person()
    {
    name = "John";
    surname = "Smith";
    age = 50;
    }
    
    void Person::print()
    {
    std::cout << "Name: " << name << ", Surname: " << surname << ", Age: " << age << std::endl;
    }
    
  • "main.cu"文件:
  • #include "cuda_runtime.h"
    #include "device_launch_parameters.h"
    
    #include "Person.h"
    
    int main()
    {
    int size = 3;
    Person* person_array;
    cudaMallocManaged(&person_array, size * sizeof(Person));
    
    
    std::cout << "Initialized array: " << std::endl;
    for (size_t i = 0; i < size; i++)
    {
    person_array[i].print();
    }
    
    
    cudaFree(person_array);
    }
    

    程序可以编译,但是显示错误的结果。它打印:

    初始化数组:
    Name:,姓氏:,年龄:0
    Name:,姓氏:,年龄:0
    Name:,姓氏:,年龄:0
    Name:,姓氏:,年龄:0

    看起来默认构造函数没有被调用。

    我做错了什么?

    <标题>

    = = = = = = = =编辑:谢谢你的回答。这似乎很复杂。我是CUDA的新手,很难理解面向对象编程与CUDA的联系。此外,在互联网上也没有很多关于它的信息。

    我有一个更大的项目,它使用OOP,我需要实现CUDA到它。我试着用简单的例子来说明这一点。

    也许你能帮我这个忙?
    那么,假设我只想创建一个方法,它将x添加到对象的年龄。因此,我的"人"。文件将为:

    "Person.h"

    #pragma once
    #include <iostream>
    
    class Person
    {
    private:
    std::string name, surname;
    int age;
    public:
    Person();
    void addXToAge(int x);
    };
    

    "Person.cpp"

    #include "Person.h"
    
    Person::Person()
    {
    name = "John";
    surname = "Smith";
    age = 50;
    }
    void Person::addXToAge(int x)
    {
    age += x;
    }
    

    "main.cu"

    #include "cuda_runtime.h"
    #include "device_launch_parameters.h"
    #include "Person.h"
    int main()
    {
    int size = 3;
    Person* person_array = new Person[size];
    
    for (size_t i = 0; i < size; i++)
    {
    person_array[i].addXToAge(10);
    }
    
    delete[] person_array;
    }
    

    现在,我想修改程序,使addXToAge(int x)函数将由内核调用,并使用3个线程来计算对象的新年龄。

    怎么做?

    您打印"Initialized array: ",但这是错误的。它不是数组,也没有初始化。person_array的内存刚好可以容纳3个Person的字节

    您要么需要自己处理放置new,要么将cudaMallocManaged封装在分配器接口中,以便std::vector<ValueType, Allocator>可以使用它。默认情况下,std::vector<T>使用std::allocator调用常规的new)

    你不能直接调用构造函数,你观察到构造函数没有被调用是正确的。c++为你调用构造函数,但是cudaMallocManaged是一个C函数。

    最新更新