2

为了分析 10^6 个遗传因素及其 GeneXGene 相互作用 (~5x10^11),我有许多独立的线性回归问题,这些问题可能适合在 GPU 上进行分析。

目标是使用包含交互项的线性回归详尽地搜索 GeneXGene 交互作用在调节结果变量(大脑表型)中的作用。

据我所知,Householder QR 分解可能是拟合回归模型的解决方案,但是,鉴于这项特定工作中的每个回归矩阵都可以轻松接近 ~ 10'000x10 的大小,即使每个单个回归矩阵似乎也不适合 GPU 片上内存(共享、寄存器等)。

我是否应该接受这是一个固有带宽受限的问题,并在回归分析期间将矩阵保留在 GPU 全局内存中,还是其他策略可行?

编辑 以下是有关该问题的更多详细信息:

将有大约 10'000 名受试者,每名受试者都有约 1M 的遗传参数(遗传矩阵:10'000x10^6)。每次迭代中的算法应选择此遗传矩阵的两列 (10'000x2) 以及大约 6 个与遗传数据无关的其他变量(年龄、性别等),因此最终回归模型将处理大小为 10 的矩阵'000x[2(遗传因素)+6(协变量)+2(截距和交互项)] 和结果变量向量(10'000x1)。对于给定的一对遗传因素,每次将重复此相同的过程约 5e11 次。那些通过预定义统计阈值的模型应保存为输出。

具体问题是,尽管有大约 5e11 个单独的回归模型,但即使是单个回归模型似乎也不适合片上存储器。

我还猜想坚持使用 CUDA 库可能不是这里的解决方案,因为这要求大部分数据操作都在 CPU 端进行,并且只将每个 QR 分解发送到 GPU?

4

1 回答 1

2

You whole data matrix (1e4 x 1e6) may be too large to fit in the global memory, while each of your least squares solving (1e4 x 10) may be too small to fully utilize the GPU.


For each least squares problem, you could use cuSolver for QR factorization and triangular solving.

http://docs.nvidia.com/cuda/cusolver/index.html#cuds-lt-t-gt-geqrf

If the problem size is too small to fully utilize the GPU, you could use concurrent kernel execution to solve multiple equations at the same time.

https://devblogs.nvidia.com/parallelforall/gpu-pro-tip-cuda-7-streams-simplify-concurrency/


For the whole data matrix, if it can not fit into the global memory, you could work on only part of it at a time. For example you could divide the matrix into ten (1e4 x 1e5) blocks, each time you load two of the blocks through PCIe, select all possible two-column combinations from the two blocks respectively, solve the equation and then load another two blocks. Maximize the block size will help you minimize the PCIe data transfer. With proper design, I'm sure the time for PCIe data transfer will be much smaller than solving 1e12 equations. Furthermore you could overlap the data transfer with solver kernel executions.

https://devblogs.nvidia.com/parallelforall/how-overlap-data-transfers-cuda-cc/

于 2016-07-02T09:54:22.523 回答