我将一个大型2D数组(在C中)传递给设备并确定所有可能的组合。例如:
A =
id val1 val2
1 100 200
2 400 800
Combination =
id1 id2 sumval1 sumval2
1 2 500 1000
由于原始数组的大小,无法存储和返回所有可能的组合。我想返回sumval1>的所有组合。 500和sumval2> 1000。
如何将此组合子集返回到要写入文件的主机;鉴于我不知道有多少组合满足条件?
答案 0 :(得分:3)
一些可能的方法:
malloc
在设备上根据需要动态分配空间。完成组合创建后,将所有单个组合收集到使用malloc
创建的单个缓冲区中。然后将此缓冲区的总大小和指向此缓冲区的指针传递回主机。然后,主机使用cudaMalloc
分配该大小的新缓冲区,并启动内核以将使用malloc
创建的缓冲区中的数据复制到使用cudaMalloc
创建的缓冲区。完成此复制内核后,主机可以使用cudaMalloc
创建的缓冲区将数据传输回主机。我建议1可能是最好的方法而不知道你想要做什么。在分配大量小分配时,内核malloc
的速度并不是特别快。此外,在使用内核malloc
时,请注意可以增加的默认大小限制(8MB)。
答案 1 :(得分:0)
您可以分页结果:
创建修复结果数组(假设是Z项)。
不仅返回结果,还返回您停止的位置(last_id1,last_id2)。
在下一个电话中,根据您的上一个结果传递一个新的起点(start_id1,start_id2)。
您可以使用流来保持GPU加载。
基于此,您甚至可以使用多个GPU分配计算。