pytorch 是如何调用 cusolver API 的调用

0,环境

ubuntu 22.04

pytorch 2.3.1

x86

RTX 3080

cuda 12.2

1, 示例代码

以potrs为例;

hello_cholesk.py

复制代码
""" 
hello_cholesky.py
step1, Cholesky decompose;
step2, inverse A;
step3, Cholesky again;
python3 hello_cholesky.py --size 256  --cuda_device_id  0
"""
import torch
import time
import argparse


def cholesky_measure(A, cuda_dev=0):
    dev = torch.device(f"cuda:{cuda_dev}")
    A = A.to(dev)

    print(f'Which device to compute : {dev}')
  
    SY = 100* torch.mm(A, A.t()) +  200*torch.eye(N, device=dev)

    to_start = time.time() 
    SY = torch.linalg.cholesky(SY)
    SY = torch.cholesky_inverse(SY)
    SY = torch.linalg.cholesky(SY, upper=True)
    run_time = time.time() - to_start   
     
    print(f'The device: {dev}, run: {run_time:.3f} second')
    print(f'SY : {SY}')
    print(f'****'*20)

    return run_time

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='dim of A.')
    parser.add_argument('--N', type=int, default=512, required=True, help='dim of A')
    args = parser.parse_args()
    N = args.N

    print(f'A N : {N}')    
    A = torch.randn(N, N)
       
    cuda_dev = 0
    time_dev0 = cholesky_measure(A, cuda_dev)    
    time_dev1 = cholesky_measure(A, cuda_dev+1)    
    print(f'time_dev0 /time_dev1 = {time_dev0/time_dev1:.2f} ')

运行效果:

2,调用栈跟踪

跟踪如下调用关系:

复制代码
Tensor cholesky_inverse(const Tensor &input, bool upper)    aten/src/ATen/native/BatchLinearAlgebra.cpp
	static Tensor& cholesky_inverse_out_info(Tensor& result, Tensor& infos, const Tensor& input, bool upper)
	DECLARE_DISPATCH(cholesky_inverse_fn, cholesky_inverse_stub);
	REGISTER_ARCH_DISPATCH(cholesky_inverse_stub, DEFAULT, &cholesky_inverse_kernel_impl);
	Tensor& cholesky_inverse_kernel_impl(Tensor &result, Tensor& infos, bool upper)
	Tensor& cholesky_inverse_kernel_impl_cusolver(Tensor &result, Tensor& infos, bool upper)
	void _cholesky_inverse_cusolver_potrs_based(Tensor& result, Tensor& infos, bool upper)
	template<typename scalar_t>
	inline static void apply_cholesky_cusolver_potrs(Tensor& self_working_copy, const Tensor& A_column_major_copy, bool upper, Tensor& infos)
	at::cuda::solver::potrs<scalar_t>(
      handle, uplo, n_32, nrhs_32,
      A_ptr + i * A_matrix_stride,
      lda_32,
      self_working_copy_ptr + i * self_matrix_stride,
      ldb_32,
      infos_ptr
    );

一些细节:

相关推荐
升鲜宝供应链及收银系统源代码服务1 分钟前
升鲜宝AI助手功能使用流程与数据库关联操作文档(三)---升鲜宝生鲜配送供应链管理系统源代码
人工智能·生鲜配送系统·生鲜物流线路规划·生鲜电商订单系统·生鲜供应链系统·生鲜系统架构设计·生鲜配送系统源代码服务出售
1892280486133 分钟前
NV086固态MT29F16T08EWLCHD8-TES:C
大数据·服务器·人工智能·科技·缓存
古月开发36 分钟前
本地化 AI 论文查重与润色工具部署指南
人工智能·自动化
多年小白1 小时前
【周末消息复盘】2026年6月5日-7日——纳指暴跌1100点,明日A股如何开盘
人工智能·科技股
Sirius Wu1 小时前
Agent Skill能力建设
人工智能·深度学习·机器学习·ai·语言模型·aigc
腾讯云开发者1 小时前
从Agent浪潮到组织变革,共探OpenClaw 时代的安全边界与企业进化
人工智能
弱冠少年1 小时前
anthropics skill-creator入门
人工智能
攻城狮7号1 小时前
ChatGPT 全新 Dreaming 记忆系统详解
人工智能·chatgpt·dreaming 记忆系统·dreaming v3
m0_571186601 小时前
第四十九周周报
人工智能
腾讯云开发者1 小时前
从低谷到暴增 312.8%,增长背后的算法革命|专访中顺洁柔杨森林
人工智能