Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CUDA实现大型线性回归模型_Cuda_Linear Regression_Matrix Factorization - Fatal编程技术网

使用CUDA实现大型线性回归模型

使用CUDA实现大型线性回归模型,cuda,linear-regression,matrix-factorization,Cuda,Linear Regression,Matrix Factorization,为了分析10^6个遗传因子及其GeneXGene相互作用(~5x10^11),我有许多独立的线性回归问题,这些问题可能适合GPU分析 目的是使用包含交互作用项的线性回归,在调节结果变量(大脑表型)时,彻底搜索GeneXGene交互作用效应 据我所知,Householder QR因式分解可能是拟合回归模型的解决方案,然而,鉴于这项特定工作中的每个回归矩阵都可以很容易地接近~10'000x10的大小,即使每个单一回归矩阵似乎也不适合GPU片上内存(共享、寄存器等) 我应该接受这是一个固有带宽有限的问

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

目的是使用包含交互作用项的线性回归,在调节结果变量(大脑表型)时,彻底搜索GeneXGene交互作用效应

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

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

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

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

具体的问题是,尽管有~5e11个独立的回归模型,但即使是单个回归模型似乎也不适合在芯片内存中使用

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

您的整个数据矩阵(1e4 x 1e6)可能太大,无法放入全局内存,而您的每个最小二乘解算(1e4 x 10)可能太小,无法充分利用GPU


对于每个最小二乘问题,可以使用cuSolver进行QR分解和三角求解

如果问题规模太小,无法充分利用GPU,则可以使用并发内核执行同时求解多个方程


对于整个数据矩阵,如果它不能放入全局内存,则一次只能处理其中的一部分。例如,您可以将矩阵划分为十个(1e4 x 1e5)块,每次通过PCIe加载其中两个块时,分别从两个块中选择所有可能的两列组合,求解方程,然后加载另外两个块。最大化块大小将帮助您最小化PCIe数据传输。如果设计得当,我相信PCIe数据传输的时间将比求解1e12方程要短得多。此外,还可以将数据传输与解算器内核执行重叠


首先进入高层。试着把你的问题简化成普通的线性代数例程并使用(它们有很多:例如cuBLAS和cuSolver可能已经有了你需要的东西)。推迟发明你自己的东西和担心带宽,直到你真正需要它。为什么你的问题大小突然从10^12变为10000*10?@Drop谢谢。但考虑到将有10^12个独立的回归模型,这是否有效?结果变量向量的大小?你的意思是解A(10000x10)X(10x1)=B(10000x1)?@kangshiyin你是对的。Ouctcome变量将等于受试者的数量(一个大脑测量):10'000x1。如果这个问题听起来很琐碎,很抱歉,但据我所知,这意味着我应该将两块大型遗传矩阵转移到GPU,然后使用来自主机端的循环枚举blockXblock交互,并在每个循环迭代中发送从cuSolver的输入矩阵中选择的两列的“设备指针偏移”,每次使用cudaStreamCreate()创建的新流?你能给我一个提示吗?在宿主代码的循环中如何最好地进行这种抵消?@sourena你关于流的话是正确的。你需要从块中复制两列来构建矩阵a,而不仅仅是两个指针。你可以先忘记流和重叠数据传输。我只是在你的回答中没有得到这句话。”每次通过PCIe加载两个块时”:好的,现在我假设大矩阵的两个片段在GPU全局mem中。然后您评论说“您需要从块中复制两列来构建矩阵A“。要么我应该在主机端构建A的十列,然后将其传输到GPU供cuSolver分析,要么我宁愿将主大矩阵的块传输到GPU,然后在设备端构建A的十列,然后再继续到cuSolver?将主大矩阵的块传输到GPU,然后在继续到cuSolver之前在设备端构建十列A——这将最小化PCIe数据传输。