如何将类数组、结构体数组从host端传到device端

定义的类、结构体如下:

class implicant
{public://蕴涵项的类,包括二进制数的字符串表示info,记录包含了哪些最小项的includes,重量weight,是否是质蕴涵项mark
string info;
string includes;
int weight;
bool mark;
implicant()
{
weight = 0;
mark = true;
}
implicant &operator=(const implicant &s)
{
info = s.info;
includes = s.includes;
weight = s.weight;
mark = s.mark; //标志也要赋值,否则原来memcpy拷过去的有可能mark=false的

return *this;
}
};
struct minxiang
{
string info;
string num;
int count;
int countby;
bool covered;
};

动态内存分配如下:
implicant *imp = new implicant[maxSize];
minxiang *minx = new minxiang[maxSize];

初始化后得到的结果 截图如下:
imp[0].info 00000
minx[0].num 0
imp[1].info 00010
minx[1].num 2
imp[2].info 00011
minx[2].num 3
imp[3].info 01000
minx[3].num 8
imp[4].info 01010
minx[4].num 10
imp[5].info 01110
minx[5].num 14
imp[6].info 01111
minx[6].num 15
imp[7].info 10110
minx[7].num 22
imp[8].info 11000
minx[8].num 24
imp[9].info 11011
minx[9].num 27
imp[10].info 11111
minx[10].num 31

如何将类数组、结构体数组从host端传到device端?? 谢谢

LZ您好:

请您注意如下几点:

1:您需要将这个类和struct以及相关代码放在.cu文件中,这样可以自动保证host端和device端使用同样的结构体成员安排,以及对齐安排。

2:您需要使用cudaMalloc或者其他手段申请到有效的,够用的存储空间以便保存您的device端数据。

3:您可以使用cudaMemcpy来复制您的数据。

大致如此,祝您好运~

请问 结构体数组的复制 和 一般数组(例如char *c or int *a)复制 一样吗?谢谢。

另外再请教一个问题:
cudaSetDevice(0);
mallocTest<<<1, 5>>>();
cudaSetDevice(2);
mallocTest<<<1, 9>>>();
这两个核函数是同时进行计算的吗?如果核函数中用到常量存储器,怎样分配?

另外再请教一个问题:
cudaSetDevice(0);
mallocTest<<<1, 5>>>();
cudaSetDevice(2);
mallocTest<<<1, 9>>>();
请问 这两个核函数是同时进行计算的吗?如果核函数中用到常量存储器,怎样分配?

chinasun您好:

是一样的,cudaMemcpy并不关心copy过去的内容是什么,它只是每次copy一段连续的内容。

以及关于结构体使用的其他问题,请您参考一下之前的讨论帖:
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=6820
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=6672
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=6813

祝您好运~

chinasun您好:

因为kernel执行是立即返回的,所以所以您device0的kernel开始执行之后在host端会立即向下执行,并选择device2,执行属于device2的kernel。
所以说这两个kernel是并行的,如果较真的话,这还需要两个kernel执行的时间够长才行,以及两者不是同一时刻开始执行的。

如果您此时需要使用__constant__声明的变量,那么可以如下写:

constant int dog;//两个设备都将拥有一个自己的dog,名字一样但是互不影响

int main()
{
cudaSetDevice(0);// 选device 0
cudaMemcpyToSymbolAsync(dog,…); //给device 0的dog赋值
kernel<<<>>>();//在device 0的kernel里面使用device 0的dog的值

cudaSetDevice(2);// 选device 2
cudaMemcpyToSymbolAsync(dog,…); //给device 2的dog赋值
kernel<<<>>>();//在device 2的kernel里面使用device 2的dog的值

}

大致如此,供您参考,祝您编码顺利~