这是我在 Stack Overflow 上的第一个问题,这是一个很长的问题。thrust::device_vector<BaseClass>
tl;dr 版本是:如果我希望 a 存储不同类型的对象,我该如何使用 aDerivedClass1
,DerivedClass2
a ?
我想利用 CUDA Thrust 的多态性。我正在编译一个-arch=sm_30
GPU (GeForce GTX 670) 进行编译。
让我们看一下下面的问题:假设镇上有 80 户家庭。其中60户是已婚夫妇,20户是单亲家庭。因此,每个家庭都有不同数量的成员。现在是人口普查时间,家庭必须说明父母的年龄和孩子的数量。Family
因此,政府构建了一个对象数组,thrust::device_vector<Family> familiesInTown(80)
即家庭信息familiesInTown[0]
对应familiesInTown[59]
为已婚夫妇,其余信息(familiesInTown[60]
为 )familiesInTown[79]
) 为单亲家庭。
Family
是基类 - 家庭中父母的数量(单亲父母数量为 1,夫妻数量为 2)以及他们拥有的孩子数量作为成员存储在此处。SingleParent
,派生自Family
,包括一个新成员 - 单亲父母的年龄,unsigned int ageOfParent
。MarriedCouple
,也源自Family
,但是,引入了两个新成员 - 父母的年龄,unsigned int ageOfParent1
以及unsigned int ageOfParent2
。
我想在 CPU 上动态创建函数指针列表(使用push_back()
从 调用的某种方法main()
)并将其复制到 GPU__constant__
或__device__
数组,而不需要诉诸静态__device__
函数指针。我相信这个问题与我的问题有关;但是,我的目标是迭代地创建__host__
函数指针数组,然后将其复制到__constant__
函数指针数组,而不是在声明时初始化后者。
常见的.h:
#ifndef COMMON_H
#define COMMON_H
#include <stdio.h>
#include <iostream>
#define num_functions 3
#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
inline void gpuAssert(cudaError_t code, const char *file, int line, bool abort=true)
{
if (code != cudaSuccess)
{
fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
if (abort) exit(code);
}
}
// fptr_t: Pointer to void function …
Run Code Online (Sandbox Code Playgroud)