我想创建一个类对象数组,这个数组必须由我的GPU访问。
我有三个文件:
- 我的类头文件"Person.h">
#pragma once
#include <iostream>
class Person
{
private:
std::string name, surname;
int age;
public:
Person();
void print();
};
- "Person.cpp"文件:
- "main.cu"文件:
#include "Person.h"
Person::Person()
{
name = "John";
surname = "Smith";
age = 50;
}
void Person::print()
{
std::cout << "Name: " << name << ", Surname: " << surname << ", Age: " << age << std::endl;
}
#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函数。