CUDA - 如何返回未知大小的结果

时间:2014-11-17 15:26:06

标签: c arrays cuda combinations

我将一个大型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。

如何将此组合子集返回到要写入文件的主机;鉴于我不知道有多少组合满足条件?

2 个答案:

答案 0 :(得分:3)

一些可能的方法:

  1. 分配(来自主机)您在GPU内存中留下的任何空间用于缓冲区。如果超过这个数,那么无论如何你都无法在一次传输中将所有组合传回。 (这可能会导致您使用mtk99提出的解决方案)。
  2. 使用内核malloc在设备上根据需要动态分配空间。完成组合创建后,将所有单个组合收集到使用malloc创建的单个缓冲区中。然后将此缓冲区的总大小和指向此缓冲区的指针传递回主机。然后,主机使用cudaMalloc分配该大小的新缓冲区,并启动内核以将使用malloc创建的缓冲区中的数据复制到使用cudaMalloc创建的缓冲区。完成此复制内核后,主机可以使用cudaMalloc创建的缓冲区将数据传输回主机。
  3. 我建议1可能是最好的方法而不知道你想要做什么。在分配大量小分配时,内核malloc的速度并不是特别快。此外,在使用内核malloc时,请注意可以增加的默认大小限制(8MB)。

答案 1 :(得分:0)

您可以分页结果:

  • 创建修复结果数组(假设是Z项)。

  • 不仅返回结果,还返回您停止的位置(last_id1,last_id2)。

  • 在下一个电话中,根据您的上一个结果传递一个新的起点(start_id1,start_id2)。

您可以使用流来保持GPU加载。

基于此,您甚至可以使用多个GPU分配计算。