NVIDIA Fortran CUDA 接口

前言

本文档描述了 NVIDIA Fortran 接口,用于 cuBLAS、cuFFT、cuRAND、cuSPARSE 和其他 CUDA 库,这些库用于构建在 CUDA 计算架构之上的科学和工程应用程序。

目标读者

本指南适用于精通 Fortran 语言编程的应用程序员、科学家和工程师。本指南假定读者对 CUDA Fortran 或 OpenACC 有一定的了解。

组织结构

本文档的组织结构如下:

简介

包含 Fortran 接口、OpenACC、CUDA Fortran 和 CUDA 库函数的总体介绍

BLAS 运行时库

描述了各种 cuBLAS 库的 Fortran 接口

FFT 运行时库 API

描述了 cuFFT 库的模块类型、定义和 Fortran 接口

随机数运行时 API

描述了主机和设备 cuRAND 库的 Fortran 接口

稀疏矩阵运行时 API

描述了 cuSPARSE 库的模块类型、定义和 Fortran 接口

矩阵求解器运行时 API

描述了 cuSOLVER 库的模块类型、定义和 Fortran 接口

张量原语运行时 API

描述了 cuTENSOR 库的模块类型、定义和 Fortran 接口

NVIDIA 集体通信库 API

描述了 NCCL 库的模块类型、定义和 Fortran 接口

NVSHMEM 通信库 API

描述了 NVSHMEM 库的模块类型、定义和 Fortran 接口

NVTX 性能分析库 API

描述了 NVTX API 和库的模块类型、定义和 Fortran 接口

示例

提供了示例代码和每个简单示例的解释。

约定

本指南使用以下约定:

斜体

用于强调。

等宽字体

用于文件名、目录、参数、选项、示例以及文本中的语言语句,包括汇编语言语句。

粗体

用于命令。

[ item1 ]

通常,方括号表示可选项目。在本例中,item1 是可选的。在 p/t 集的上下文中,方括号是指定 p/t 集所必需的。

{ item2 | item 3 }

花括号表示需要选择。在本例中,您必须选择 item2 或 item3。

filename …

省略号表示重复。可以出现零个或多个前面的项目。在本例中,允许多个文件名。

FORTRAN

Fortran 语言语句在本指南的文本中使用缩小的固定点大小显示。

C++ C

C++ 和 C 语言语句在本指南的测试中使用缩小的固定点大小显示。

术语

如果本指南中有您不熟悉的术语,请参阅 NVIDIA HPC 词汇表

相关出版物

以下文档包含与 OpenACC 和 CUDA Fortran 编程、CUDA 和 CUDA 库相关的其他信息。

  • ISO/IEC 1539-1:1997,信息技术 – 编程语言 – FORTRAN,日内瓦,1997 年(Fortran 95)。

  • NVIDIA CUDA 编程指南,NVIDIA。在线提供,网址为 docs.nvidia.com/cuda

  • NVIDIA HPC 编译器用户指南,2024 年发行版。在线提供,网址为 docs.nvidia.com/hpc-sdk

1. 简介

本文档为从 NVIDIA Fortran 调用 CUDA 库函数提供了参考。它可以从使用 OpenACC 或 OpenMP 编程模型的 Fortran 代码中使用,也可以从 NVIDIA CUDA Fortran 中使用。目前,NVIDIA 为其提供了预构建接口模块的 CUDA 库,并在本文档中进行了记录,包括:

  • cuBLAS,BLAS 的实现。

  • cuFFT,快速傅里叶变换 (FFT) 例程库。

  • cuRAND,用于随机数生成的库。

  • cuSPARSE,用于稀疏矩阵的线性代数例程库。

  • cuSOLVER,用于密集矩阵或其他矩阵的方程求解器库。

  • cuTENSOR,用于张量原语操作的库。

  • NCCL,一个集体通信库。

  • NVSHMEM,OpenSHMEM 在 GPU 上的库实现。

  • NVTX,用于注释应用程序事件、代码范围和资源的 API。

OpenACC 应用程序编程接口是编译器指令和运行时例程的集合,允许程序员指定循环和代码区域,以便从主机 CPU 卸载到附加的加速器,例如 GPU。OpenACC API 由行业联盟设计和维护。有关 OpenACC API 的更多信息,请参阅 OpenACC 网站

OpenMP 是一组编译器指令、应用程序编程接口 (API) 和一组环境变量的规范,可用于指定来自 Fortran(和其他语言)的并行执行。OpenMP 目标卸载功能在许多方面与 OpenACC 相似。与 OpenACC 中使用的方法相比,从主机代码将设备数组传递给库函数的方法仅在语法上有所不同。有关使用 OpenMP 的一般信息以及获取 OpenMP 规范副本,请参阅 OpenMP 组织的网站。

CUDA Fortran 是 Fortran 的一小组扩展,它支持 CUDA 计算架构并在其基础上构建。CUDA Fortran 包括 Fortran 2003 编译器和工具链,用于使用 Fortran 编程 NVIDIA GPU,并且是 NVIDIA CUDA C 编译器的类似物。与 NVIDIA Accelerator 和基于 OpenACC 指令的模型和编译器相比,CUDA Fortran 是一种较低级别的显式编程模型,具有大量的运行时库组件,使专业程序员可以直接控制 GPGPU 编程的各个方面。

本文档不包含库函数的解释或用途,也不包含 CUDA 实现中用于定位 GPU 的方法的详细信息。有关该信息,请参阅 NVIDIA CUDA 工具包附带的相应库文档。本文档确实提供了 Fortran 模块内容:派生类型、枚举和接口,以便从 Fortran 而不是从 C 或 C++ 中使用库。

本文档中使用的许多示例都随 HPC 编译器和工具发行版一起提供,以及 Makefiles,并存储在年度目录中,例如 2020/examples/CUDA-Libraries。

1.1. Fortran 接口和封装器

本文档中显示的几乎所有函数接口都使用了来自 Fortran 2003 iso_c_binding 内在模块的功能。该模块提供了一种处理诸如跨语言数据类型、大小写、向符号名称添加下划线或按值传递参数等问题的标准方法。

通常,iso_c_binding 模块使包含正确编写的接口的 Fortran 程序能够直接调用 C 库函数。在某些情况下,NVIDIA 编写了 C 库函数周围的小型封装器,以使 Fortran 调用站点更“类 Fortran”,隐藏 C 接口中暴露的一些问题,如句柄管理、主机与设备指针管理或字符和复数数据类型问题。

在少数情况下,C 库可能包含多个入口点来处理不同的数据类型,可能在一个函数中使用 int,而在另一个函数中使用 size_t,否则这些函数是相同的。在这些情况下,NVIDIA 可能只提供一个通用 Fortran 接口,并在底层调用适当的 C 函数。

1.2. 从 OpenACC 主机代码中使用 CUDA 库

本文档涵盖的所有库都包含可从 OpenACC 主机代码调用的函数。大多数函数都接受一些预期为设备指针(设备全局内存中变量的地址)的参数。在 OpenACC 中有几种方法可以做到这一点。

如果调用在词法上嵌套在 OpenACC data 指令中,则在存在显式接口(例如 NVIDIA 库模块提供的接口)的情况下,NVIDIA Fortran 编译器将默认在需要时传递设备指针。

subroutine hostcall(a, b, n)
use cublas
real a(n), b(n)
!$acc data copy(a, b)
call cublasSswap(n, a, 1, b, 1)
!$acc end data

return
end

当您使用包含 Fortran 接口的模块时(如上面的示例中的 use cublas 行),Fortran 接口是显式的。如果您查看 cublasSswap 的实际接口,您将看到数组 a 和 b 使用 CUDA Fortran device 属性声明,因此它们仅将设备地址作为参数。

当使用 OpenACC 时,通过使用 host_data 子句将设备指针传递给子程序是更可接受和通用的方法,因为大多数实现都没有办法将参数标记为设备指针。带有 use_device 子句的 host_data 构造使设备地址在主机代码中可用,以便传递给子程序。

use cufft
use openacc
. . .
!$acc data copyin(a), copyout(b,c)
ierr = cufftPlan2D(iplan1,m,n,CUFFT_C2C)
ierr = ierr + cufftSetStream(iplan1,acc_get_cuda_stream(acc_async_sync))
!$acc host_data use_device(a,b,c)
ierr = ierr + cufftExecC2C(iplan1,a,b,CUFFT_FORWARD)
ierr = ierr + cufftExecC2C(iplan1,b,c,CUFFT_INVERSE)
!$acc end host_data

! scale c
!$acc kernels
c = c / (m*n)
!$acc end kernels
!$acc end data

此代码片段还显示了共享 OpenACC 和 cuFFT 库使用的流的示例。本文档中的每个库都有一个用于设置库在其上运行的 CUDA 流的函数。通常,当使用 OpenACC 时,您希望 OpenACC 内核与库函数在同一流上运行。在上面的例子中,这保证了内核 c = c / (m*n) 在 FFT 操作完成之前不会启动。函数 acc_get_cuda_stream 和 acc_async_sync 的定义在 openacc 模块中。

1.3. 从 OpenACC 设备代码中使用 CUDA 库

目前,有两个库可以从 OpenACC 计算区域内使用。openacc_curand 模块和 nvshmem 模块中的某些函数被标记为 acc routine seq

cuRAND 设备库全部包含在 CUDA 头文件中。在设备代码中,它旨在为每个线程返回一个或少量随机数。线程的随机数生成器彼此独立运行,并且通常建议出于性能原因为每个线程提供不同的种子,而不是不同的偏移量。

program t
use openacc_curand
integer, parameter :: n = 500
real a(n,n,4)
type(curandStateXORWOW) :: h
integer(8) :: seed, seq, offset
a = 0.0
!$acc parallel num_gangs(n) vector_length(n) copy(a)
!$acc loop gang
do j = 1, n
!$acc loop vector private(h)
  do i = 1, n
    seed = 12345_8 + j*n*n + i*2
    seq = 0_8
    offset = 0_8
    call curand_init(seed, seq, offset, h)
!$acc loop seq
    do k = 1, 4
      a(i,j,k) = curand_uniform(h)
    end do
  end do
end do
!$acc end parallel
print *,maxval(a),minval(a),sum(a)/(n*n*4)
end

当使用 openacc_curand 模块时,由于所有代码都包含在 CUDA 头文件中,因此您不需要链接行上的任何其他库。

1.4. 从 CUDA Fortran 主机代码中使用 CUDA 库

本文档中列出的库函数的主要使用模型是从 CUDA 主机代码调用它们。CUDA Fortran 允许一些特殊功能,因为编译器能够在解析通用接口时识别 device 和 managed 属性。设备实参只能匹配接口的设备哑元;托管实参优先匹配托管哑元,然后是设备哑元,然后是主机哑元。

program testisamax  ! link with -cudalib=cublas -lblas
use cublas
real*4              x(1000)
real*4, device  :: xd(1000)
real*4, managed :: xm(1000)

call random_number(x)

! Call host BLAS
j = isamax(1000,x,1)

xd = x
! Call cuBLAS
k = isamax(1000,xd,1)
print *,j.eq.k

xm = x
! Also calls cuBLAS
k = isamax(1000,xm,1)
print *,j.eq.k
end

使用 cudafor 模块,程序员可以使用全套 CUDA 功能来管理 CUDA 事件、流、同步和异步行为。CUDA Fortran 可用于 OpenMP 程序,并且本文档中的 CUDA 库对于主机 CPU 线程是线程安全的。更多示例包含在 示例 章节中。

1.5. 从 CUDA Fortran 设备代码中使用 CUDA 库

curAND 和 NVSHMEM 库具有可从 CUDA Fortran 设备代码调用的函数,它们的接口分别通过 curand_device 和 nvshmem 模块访问。模块接口与 OpenACC 设备代码中使用的模块非常相似,但对于 CUDA Fortran,每个子例程和函数都声明了 attributes([host,]device),并且子例程和函数不需要标记为 acc routine seq

module mrand
    use curand_device
    integer, parameter :: n = 500
    contains
    attributes(global) subroutine randsub(a)
    real, device :: a(n,n,4)
    type(curandStateXORWOW) :: h
    integer(8) :: seed, seq, offset
    j = blockIdx%x; i = threadIdx%x
    seed = 12345_8 + j*n*n + i*2
    seq = 0_8
    offset = 0_8
    call curand_init(seed, seq, offset, h)
    do k = 1, 4
        a(i,j,k) = curand_uniform(h)
    end do
    end subroutine
end module

program t   ! nvfortran t.cuf
use mrand
use cudafor ! recognize maxval, minval, sum w/managed
real, managed :: a(n,n,4)
a = 0.0
call randsub<<<n,n>>>(a)
print *,maxval(a),minval(a),sum(a)/(n*n*4)
end program

1.6. cuBLAS 和 cuSPARSE 中的指针模式

由于 NVIDIA Fortran 编译器可以区分主机和设备参数,因此用于连接 cuBLAS 和 cuSPARSE 的 NVIDIA 模块处理指针模式的方式与 CUDA C 不同,后者需要为标量参数显式设置模式。可以驻留在主机或设备上的标量参数示例是 *gemm 函数的 alpha 和 beta 比例因子。

通常,当在 cuBLAS 和 cuSPARSE 模块中使用正常的 “non-_v2” 接口时,运行时包装器将在幕后隐式添加库指针模式的设置和恢复。这会给调用增加一些可忽略但不为零的开销。

要避免在每次调用库函数时隐式获取和设置指针模式,请执行以下操作

  • 对于 BLAS,请使用 cublas_v2 模块和 v2 入口点,例如 cublasIsamax_v2。程序员有责任在需要时正确设置指针模式。需要设置指针模式的标量参数示例是传递给 *gemm 例程的 alpha 和 beta 比例因子,以及从 *amax()、*amin()、*asum()、*rotg()、*rotmg()、*nrm2() 和 *dot() 函数的 v2 版本返回的标量结果。在第 2 章中显示的 v2 接口中,这些标量参数将带有注释 ! device or host variable。不需要设置指针模式的标量参数示例是增量、范围和长度,例如 incx、incy、n、lda、ldb 和 ldc。

  • 对于 cuSPARSE 库,第 5 章中列出的每个包含注释 ! device or host variable 的标量参数的函数都有一个对应的 v2 接口,尽管此处未记录。例如,除了名为 cusparseSaxpyi 的接口之外,还有另一个名为 cusparseSaxpyi_v2 的接口,其参数列表完全相同,它直接调用 cuSPARSE 库,并且不会隐式获取或设置库指针模式。

CUDA 默认指针模式是标量参数驻留在主机上。NVIDIA 运行时不会更改该设置。

1.7. 编写您自己的 CUDA 接口

尽管本文档中描述的模块中包含了大量的接口,但用户有时仍然需要编写自己的接口来连接新的库或他们自己调整的 CUDA,可能用 C/C++ 编写。有一些标准技术可以使用,以及一些非标准的 NVIDIA 扩展,这些扩展可以使创建工作接口更容易。

! cufftExecC2C
interface cufftExecC2C
    integer function cufftExecC2C( plan, idata, odata, direction ) &
        bind(C,name='cufftExecC2C')
        integer, value :: plan
        complex, device, dimension(*) :: idata, odata
        integer, value :: direction
    end function cufftExecC2C
end interface cufftExecC2C

此接口直接调用 C 库函数。您可以通过将正确大写的 C 函数放在 bind(C) 属性中来处理 Fortran 的大小写问题。如果 C 函数期望按值传递输入参数,您也可以将 value 属性添加到虚拟声明中。Fortran 的一个优点是接口可以更改,但调用站点的代码可能不必更改。编译器会更改调用的细节以适应接口。

现在假设此接口的用户想要使用 REAL 数据调用此函数(F77 代码以混合 REAL 和 COMPLEX 声明而闻名)。有两种方法可以做到这一点

! cufftExecC2C
interface cufftExecC2C
    integer function cufftExecC2C( plan, idata, odata, direction ) &
        bind(C,name='cufftExecC2C')
        integer, value :: plan
        complex, device, dimension(*) :: idata, odata
        integer, value :: direction
    end function cufftExecC2C
    integer function cufftExecR2R( plan, idata, odata, direction ) &
        bind(C,name='cufftExecC2C')
        integer, value :: plan
        real, device, dimension(*) :: idata, odata
        integer, value :: direction
    end function cufftExecR2R
end interface cufftExecC2C

这里 C 名称没有改变。编译器现在将接受与声明为 REAL 的 idata 和 odata 相对应的实际参数。创建了一个名为 cufftExecC2C 的通用接口。如果您在调试通用接口时遇到问题,作为调试辅助,您可以尝试调用特定名称,在本例中为 cufftExecR2R,以帮助诊断问题。

NVIDIA 支持的常用扩展是 ignore_tkr。程序员可以在接口中使用它来指示编译器在接口匹配过程中忽略类型、种类和秩的任何组合。使用 ignore_tkr 的先前示例看起来像这样

! cufftExecC2C
interface cufftExecC2C
    integer function cufftExecC2C( plan, idata, odata, direction ) &
        bind(C,name='cufftExecC2C')
        integer, value :: plan
        !dir$ ignore_tkr(tr) idata, (tr) odata
        complex, device, dimension(*) :: idata, odata
        integer, value :: direction
    end function cufftExecC2C
end interface cufftExecC2C

现在,当将调用站点与接口匹配时,编译器将忽略 idata 和 odata 的类型和秩(F77 在处理数组维度方面也可能很草率)。一个不幸的副作用是,该接口现在将允许 idata 和 odata 的整数、逻辑和字符数据。是否可以接受取决于实施者。

最后一个特定于 NVIDIA 的辅助方法,值得在此处提及的是 ignore_tkr (d),它在接口匹配期间忽略实际参数的 device 属性。

当然,如果您编写一个包装器,即 Fortran 调用和您的库函数之间的一小段代码,您将不受编译器可以执行的简单转换的限制,例如此处列出的那些。如前所述,cuBLAS 和 cuSPARSE 模块中提供的许多接口都使用包装器。

一个常见的请求是 Fortran 程序员如何利用 thrust 库。解释 thrust 和 C++ 编程超出了本文档的范围,但这个简单的示例可以展示如何利用 thrust 中出色的排序功能

// Filename: csort.cu
// nvcc -c -arch sm_35 csort.cu
#include <thrust/device_vector.h>
#include <thrust/copy.h>
#include <thrust/sort.h>

extern "C" {

    //Sort for integer arrays
    void thrust_int_sort_wrapper( int *data, int N)
    {
    thrust::device_ptr <int> dev_ptr(data);
    thrust::sort(dev_ptr, dev_ptr+N);
    }

    //Sort for float arrays
    void thrust_float_sort_wrapper( float *data, int N)
    {
    thrust::device_ptr <float> dev_ptr(data);
    thrust::sort(dev_ptr, dev_ptr+N);
    }

    //Sort for double arrays
    void thrust_double_sort_wrapper( double *data, int N)
    {
    thrust::device_ptr <double> dev_ptr(data);
    thrust::sort(dev_ptr, dev_ptr+N);
    }
}

在 Fortran 中设置排序子例程的接口,调用很简单

program t
interface sort
   subroutine sort_int(array, n) &
        bind(C,name='thrust_int_sort_wrapper')
        integer(4), device, dimension(*) :: array
        integer(4), value :: n
    end subroutine
end interface
integer(4), parameter :: n = 100
integer(4), device :: a_d(n)
integer(4) :: a_h(n)
!$cuf kernel do
do i = 1, n
    a_d(i) = 1 + mod(47*i,n)
end do
call sort(a_d, n)
a_h = a_d
nres  = count(a_h .eq. (/(i,i=1,n)/))
if (nres.eq.n) then
    print *,"test PASSED"
else
    print *,"test FAILED"
endif
end

1.8. NVIDIA Fortran 编译器选项

NVIDIA Fortran 编译器驱动程序称为 nvfortran。可以通过键入 nvfortran -help 来获取有关可以传递给 nvfortran 的编译器选项的常规信息。要使用 OpenACC 启用 NVIDIA GPU 目标,请使用 nvfortran -acc=gpu。要使用 CUDA Fortran 启用 NVIDIA GPU 目标,请使用 nvfortran -cuda。当文件名使用 .cuf 扩展名时,NVIDIA Fortran 编译器也支持 CUDA Fortran。大写文件扩展名,例如 .F90 或 .CUF,也可以使用,在这种情况下,程序在编译之前由预处理器处理。

与本文档中的示例相关的其他选项包括

  • -⁠cudalib[=cublas|cufft|cufftw|curand|cusolver|cusparse|cutensor|nvblas|nccl|nvshmem|nvlamath|nvtx]:此选项将 CUDA 优化的库的相应版本添加到链接行。它可以不引人注目地处理静态和动态链接以及平台(Linux、Windows)差异。

  • -⁠gpu=cc70:此选项编译为计算能力 7.0。某些库功能可能需要最低计算能力为 6.0、7.0 或更高。

  • -⁠gpu=cudaX.Y:此选项使用特定的 CUDA 工具包版本进行编译和链接。某些库功能可能需要较新(或较旧,对于已弃用的函数)的 CUDA 运行时版本。

2. BLAS 运行时 API

本节介绍 CUDA BLAS 库的 Fortran 接口。目前有四个独立的函数入口点集合,通常称为 cuBLAS

  • BLAS 例程的原始 CUDA 实现,称为旧版 API,可以从主机调用,并期望和操作设备数据。

  • BLAS 例程的较新的 “v2” CUDA 实现,以及一些用于批量操作的扩展。这些也可以从主机调用,并操作设备数据。在 Fortran 术语中,这些入口点已从子例程更改为返回状态的函数。

  • cuBLAS XT 库,它可以使用仅驻留在主机上的数据来定位多个 GPU。

  • cuBLAS MP 库,它可以使用分布式设备数据来定位多个 GPU,类似于 ScaLAPACK PBLAS 函数。cublasMp 和 cusolverMp 库部分构建在名为 CAL 的通信库之上,该库在本文档的另一节中进行了记录。

NVIDIA 当前附带四个 Fortran 模块,程序员可以使用这些模块来调用此 cuBLAS 功能

  • cublas,它提供到主 cublas 库的接口。支持旧版和 v2 名称。在此模块中,cublas 名称(例如 cublasSaxpy)使用旧版调用约定。主机 BLAS 库(例如 NVIDIA 发行版中的 libblas.a)的接口也包含在 cublas 模块中。通过添加以下行来公开这些接口

    use cublas
    

    到您的程序单元。

  • cublas_v2,它在大多数方面与 cublas 模块相似,但 cublas 名称(例如 cublasSaxpy)使用 v2 调用约定。例如,cublasSaxpy 不是子例程,而是一个函数,它将句柄作为第一个参数,并返回一个整数,其中包含调用的状态。通过添加以下行来公开这些接口

    use cublas_v2
    

    到您的程序单元。

  • cublasxt,它直接接口到 cublasXT API。通过添加以下行来公开这些接口

    use cublasxt
    

    到您的程序单元。

  • cublasmp,它提供到 cublasMp API 的接口。通过添加以下行来公开这些接口

    use cublasMp
    

    到您的程序单元。

v2 例程是返回错误状态代码的整数函数;如果调用成功,它们将返回值 CUBLAS_STATUS_SUCCESS,如果发生错误,则返回其他 cuBLAS 状态返回值。

在后续部分中记录的传统 BLAS 名称的接口,其中包含注释 ! device or host variable 不应与第 1.6 节中的指针模式问题混淆。传统的 BLAS 名称是 cublas 模块中的重载通用名称。例如,在此接口中

subroutine scopy(n, x, incx, y, incy)
  integer :: n
  real(4), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy

数组 x 和 y 可以都是设备数组,在这种情况下,通过通用接口调用 cublasScopy,或者它们都可以是主机数组,在这种情况下,调用主机 BLAS 库中的 scopy。将 CUDA Fortran 托管数据用作 scopy 的实际参数会产生一个有趣的案例,默认情况下选择调用 cublasScopy。如果您希望使用托管数据调用 scopy 的主机库版本,请不要在调用站点公开通用 scopy 接口。

除非提供特定种类,否则在以下接口中,普通整数类型表示 integer(4),普通实数类型表示 real(4)。

2.1. CUBLAS 定义和辅助函数

本节包含 cuBLAS 库中使用的定义和数据类型,以及到 cuBLAS 辅助函数的接口。

cublas 模块包含以下派生类型定义

TYPE cublasHandle
  TYPE(C_PTR)  :: handle
END TYPE

cuBLAS 模块包含以下枚举

enum, bind(c)
    enumerator :: CUBLAS_STATUS_SUCCESS         =0
    enumerator :: CUBLAS_STATUS_NOT_INITIALIZED =1
    enumerator :: CUBLAS_STATUS_ALLOC_FAILED    =3
    enumerator :: CUBLAS_STATUS_INVALID_VALUE   =7
    enumerator :: CUBLAS_STATUS_ARCH_MISMATCH   =8
    enumerator :: CUBLAS_STATUS_MAPPING_ERROR   =11
    enumerator :: CUBLAS_STATUS_EXECUTION_FAILED=13
    enumerator :: CUBLAS_STATUS_INTERNAL_ERROR  =14
end enum
enum, bind(c)
    enumerator :: CUBLAS_FILL_MODE_LOWER=0
    enumerator :: CUBLAS_FILL_MODE_UPPER=1
end enum
enum, bind(c)
    enumerator :: CUBLAS_DIAG_NON_UNIT=0
    enumerator :: CUBLAS_DIAG_UNIT=1
end enum
enum, bind(c)
    enumerator :: CUBLAS_SIDE_LEFT =0
    enumerator :: CUBLAS_SIDE_RIGHT=1
end enum
enum, bind(c)
    enumerator :: CUBLAS_OP_N=0
    enumerator :: CUBLAS_OP_T=1
    enumerator :: CUBLAS_OP_C=2
end enum
enum, bind(c)
    enumerator :: CUBLAS_POINTER_MODE_HOST   = 0
    enumerator :: CUBLAS_POINTER_MODE_DEVICE = 1
end enum

2.1.1. cublasCreate

此函数初始化 CUBLAS 库并创建一个句柄,指向保存 CUBLAS 库上下文的不透明结构。它在主机和设备上分配硬件资源,必须在进行任何其他 CUBLAS 库调用之前调用。CUBLAS 库上下文与当前的 CUDA 设备相关联。要在多个设备上使用该库,需要为每个设备创建一个 CUBLAS 句柄。此外,对于给定的设备,可以创建具有不同配置的多个 CUBLAS 句柄。由于 cublasCreate 分配了一些内部资源,并且通过调用 cublasDestroy 释放这些资源将隐式调用 cublasDeviceSynchronize,因此建议尽量减少 cublasCreate/cublasDestroy 的出现次数。对于从不同线程使用同一设备的多线程应用程序,建议的编程模型是为每个线程创建一个 CUBLAS 句柄,并在线程的整个生命周期中使用该 CUBLAS 句柄。

integer(4) function cublasCreate(handle)
  type(cublasHandle) :: handle

2.1.2. cublasDestroy

此函数释放 CUBLAS 库使用的硬件资源。此函数通常是使用特定句柄对 CUBLAS 库的最后一次调用。由于 cublasCreate 分配了一些内部资源,并且通过调用 cublasDestroy 释放这些资源将隐式调用 cublasDeviceSynchronize,因此建议尽量减少 cublasCreate/cublasDestroy 的出现次数。

integer(4) function cublasDestroy(handle)
  type(cublasHandle) :: handle

2.1.3. cublasGetVersion

此函数返回 cuBLAS 库的版本号。

integer(4) function cublasGetVersion(handle, version)
  type(cublasHandle) :: handle
  integer(4) :: version

2.1.4. cublasSetStream

此函数设置 cuBLAS 库流,该流将用于执行对 cuBLAS 库函数的所有后续调用。如果未设置 cuBLAS 库流,则所有内核都使用默认的 NULL 流。特别是,此例程可用于在内核启动之间更改流,然后将 cuBLAS 库流重置为 NULL。

integer(4) function cublasSetStream(handle, stream)
  type(cublasHandle) :: handle
  integer(kind=cuda_stream_kind()) :: stream

2.1.5. cublasGetStream

此函数获取 cuBLAS 库流,该流正用于执行对 cuBLAS 库函数的所有调用。如果未设置 cuBLAS 库流,则所有内核都使用默认的 NULL 流。

integer(4) function cublasGetStream(handle, stream)
  type(cublasHandle) :: handle
  integer(kind=cuda_stream_kind()) :: stream

2.1.6. cublasGetStatusName

此函数返回与给定状态值关联的 cuBLAS 状态名称。

character(128) function cublasGetStatusName(ierr)
  integer(4) :: ierr

2.1.7. cublasGetStatusString

此函数返回与给定状态值关联的 cuBLAS 状态字符串。

character(128) function cublasGetStatusString(ierr)
  integer(4) :: ierr

2.1.8. cublasGetPointerMode

此函数获取 cuBLAS 库使用的指针模式。在 cublas 模块中,指针模式根据是否在标量实际参数上设置了 device 属性,在每次调用的基础上设置和重置。有关指针模式的讨论,请参见第 1.6 节。

integer(4) function cublasGetPointerMode(handle, mode)
  type(cublasHandle) :: handle
  integer(4) :: mode

2.1.9. cublasSetPointerMode

此函数设置 cuBLAS 库使用的指针模式。当使用 cublas 模块时,指针模式根据是否在标量实际参数上设置了 device 属性,在每次调用的基础上设置。当将 cublas_v2 模块与 v2 接口一起使用时,程序员有责任调用 cublasSetPointerMode,以便库正确处理标量参数。有关指针模式的讨论,请参见第 1.6 节。

integer(4) function cublasSetPointerMode(handle, mode)
  type(cublasHandle) :: handle
  integer(4) :: mode

2.1.10. cublasGetAtomicsMode

此函数获取 cuBLAS 库使用的原子模式。

integer(4) function cublasGetAtomicsMode(handle, mode)
  type(cublasHandle) :: handle
  integer(4) :: mode

2.1.11. cublasSetAtomicsMode

此函数设置 cuBLAS 库使用的原子模式。cuBLAS 库中的某些例程具有使用原子操作累积结果的替代实现。这些替代实现可能会运行得更快,但也可能会生成每次运行结果不完全相同的结果。默认设置是不允许在 cuBLAS 函数中使用原子操作。

integer(4) function cublasSetAtomicsMode(handle, mode)
  type(cublasHandle) :: handle
  integer(4) :: mode

2.1.12. cublasGetMathMode

此函数获取 cuBLAS 库使用的数学模式。

integer(4) function cublasGetMathMode(handle, mode)
  type(cublasHandle) :: handle
  integer(4) :: mode

2.1.13. cublasSetMathMode

此函数设置 cuBLAS 库使用的数学模式。cuBLAS 库中的某些例程允许您选择用于生成结果的计算精度。这些替代方法可能会运行得更快,但也可能会生成不同的、不太准确的结果。

integer(4) function cublasSetMathMode(handle, mode)
  type(cublasHandle) :: handle
  integer(4) :: mode

2.1.14. cublasGetSmCountTarget

此函数获取 cuBLAS 库使用的 SM 计数目标。

integer(4) function cublasGetSmCountTarget(handle, counttarget)
  type(cublasHandle) :: handle
  integer(4) :: counttarget

2.1.15. cublasSetSmCountTarget

此函数设置 cuBLAS 库使用的 SM 计数目标。

integer(4) function cublasSetSmCountTarget(handle, counttarget)
  type(cublasHandle) :: handle
  integer(4) :: counttarget

2.1.16. cublasGetHandle

此函数获取线程当前正在使用的 cuBLAS 句柄。如果您正在使用旧版 BLAS API,或者不希望手动将句柄传递给底层函数或子例程,则 CUDA Fortran 运行时会跟踪 CPU 线程的当前句柄。

type(cublashandle) function cublasGetHandle()
integer(4) function cublasGetHandle(handle)
  type(cublasHandle) :: handle

2.1.17. cublasSetVector

此函数将主机内存空间中向量 x 的 n 个元素复制到 GPU 内存空间中向量 y。假定每个元素需要 elemSize 字节的存储空间。在 CUDA Fortran 中,向量 x 和 y 的类型被重载为接受任何数据类型,但数据类型的大小仍必须以字节为单位指定。此功能也可以使用 cudaMemcpy 或数组赋值语句来实现。

integer(4) function cublassetvector(n, elemsize, x, incx, y, incy)
  integer :: n, elemsize, incx, incy
  integer*1, dimension(*) :: x
  integer*1, device, dimension(*) :: y

2.1.18. cublasGetVector

此函数将 GPU 内存空间中向量 x 的 n 个元素复制到主机内存空间中向量 y。假定每个元素需要 elemSize 字节的存储空间。在 CUDA Fortran 中,向量 x 和 y 的类型被重载为接受任何数据类型,但数据类型的大小仍必须以字节为单位指定。此功能也可以使用 cudaMemcpy 或数组赋值语句来实现。

integer(4) function cublasgetvector(n, elemsize, x, incx, y, incy)
  integer :: n, elemsize, incx, incy
  integer*1, device, dimension(*) :: x
  integer*1, dimension(*) :: y

2.1.19. cublasSetMatrix

此函数将主机内存空间中矩阵 A 的 rows x cols 个元素的图块复制到 GPU 内存空间中矩阵 B。假定每个元素需要 elemSize 字节的存储空间。在 CUDA Fortran 中,矩阵 A 和 B 的类型被重载为接受任何数据类型,但数据类型的大小仍必须以字节为单位指定。此功能也可以使用 cudaMemcpy、cudaMemcpy2D 或数组赋值语句来实现。

integer(4) function cublassetmatrix(rows, cols, elemsize, a, lda, b, ldb)
  integer :: rows, cols, elemsize, lda, ldb
  integer*1, dimension(lda, *) :: a
  integer*1, device, dimension(ldb, *) :: b

2.1.20. cublasGetMatrix

此函数将 GPU 内存空间中矩阵 A 的 rows x cols 个元素的图块复制到主机内存空间中矩阵 B。假定每个元素需要 elemSize 字节的存储空间。在 CUDA Fortran 中,矩阵 A 和 B 的类型被重载为接受任何数据类型,但数据类型的大小仍必须以字节为单位指定。此功能也可以使用 cudaMemcpy、cudaMemcpy2D 或数组赋值语句来实现。

integer(4) function cublasgetmatrix(rows, cols, elemsize, a, lda, b, ldb)
  integer :: rows, cols, elemsize, lda, ldb
  integer*1, device, dimension(lda, *) :: a
  integer*1, dimension(ldb, *) :: b

2.1.21. cublasSetVectorAsync

此函数在给定的 CUDA 流上异步地将主机内存空间中向量 x 的 n 个元素复制到 GPU 内存空间中向量 y。假定每个元素需要 elemSize 字节的存储空间。在 CUDA Fortran 中,向量 x 和 y 的类型被重载为接受任何数据类型,但数据类型的大小仍必须以字节为单位指定。此功能也可以使用 cudaMemcpyAsync 来实现。

integer(4) function cublassetvectorasync(n, elemsize, x, incx, y, incy, stream)
  integer :: n, elemsize, incx, incy
  integer*1, dimension(*) :: x
  integer*1, device, dimension(*) :: y
  integer(kind=cuda_stream_kind()) :: stream

2.1.22. cublasGetVectorAsync

此函数在给定的 CUDA 流上异步地将主机内存空间中向量 x 的 n 个元素复制到 GPU 内存空间中向量 y。假定每个元素需要 elemSize 字节的存储空间。在 CUDA Fortran 中,向量 x 和 y 的类型被重载为接受任何数据类型,但数据类型的大小仍必须以字节为单位指定。此功能也可以使用 cudaMemcpyAsync 来实现。

integer(4) function cublasgetvectorasync(n, elemsize, x, incx, y, incy, stream)
  integer :: n, elemsize, incx, incy
  integer*1, device, dimension(*) :: x
  integer*1, dimension(*) :: y
  integer(kind=cuda_stream_kind()) :: stream

2.1.23. cublasSetMatrixAsync

此函数使用指定的流异步地将主机内存空间中矩阵 A 的 rows x cols 个元素的图块复制到 GPU 内存空间中矩阵 B。假定每个元素需要 elemSize 字节的存储空间。在 CUDA Fortran 中,矩阵 A 和 B 的类型被重载为接受任何数据类型,但数据类型的大小仍必须以字节为单位指定。此功能也可以使用 cudaMemcpyAsync 或 cudaMemcpy2DAsync 来实现。

integer(4) function cublassetmatrixasync(rows, cols, elemsize, a, lda, b, ldb, stream)
  integer :: rows, cols, elemsize, lda, ldb
  integer*1, dimension(lda, *) :: a
  integer*1, device, dimension(ldb, *) :: b
  integer(kind=cuda_stream_kind()) :: stream

2.1.24. cublasGetMatrixAsync

此函数使用指定的流异步地将 GPU 内存空间中矩阵 A 的 rows x cols 个元素的图块复制到主机内存空间中矩阵 B。假定每个元素需要 elemSize 字节的存储空间。在 CUDA Fortran 中,矩阵 A 和 B 的类型被重载为接受任何数据类型,但数据类型的大小仍必须以字节为单位指定。此功能也可以使用 cudaMemcpyAsync 或 cudaMemcpy2DAsync 来实现。

integer(4) function cublasgetmatrixasync(rows, cols, elemsize, a, lda, b, ldb, stream)
  integer :: rows, cols, elemsize, lda, ldb
  integer*1, device, dimension(lda, *) :: a
  integer*1, dimension(ldb, *) :: b
  integer(kind=cuda_stream_kind()) :: stream

2.2. 单精度函数和子例程

本节包含到单精度 BLAS 和 cuBLAS 函数和子例程的接口。

2.2.1. isamax

ISAMAX 查找具有最大绝对值的元素的索引。

integer(4) function isamax(n, x, incx)
  integer :: n
  real(4), device, dimension(*) :: x ! device or host variable
  integer :: incx
integer(4) function cublasIsamax(n, x, incx)
  integer :: n
  real(4), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasIsamax_v2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  real(4), device, dimension(*) :: x
  integer :: incx
  integer, device :: res ! device or host variable

2.2.2. isamin

ISAMIN 查找具有最小绝对值的元素的索引。

integer(4) function isamin(n, x, incx)
  integer :: n
  real(4), device, dimension(*) :: x ! device or host variable
  integer :: incx
integer(4) function cublasIsamin(n, x, incx)
  integer :: n
  real(4), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasIsamin_v2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  real(4), device, dimension(*) :: x
  integer :: incx
  integer, device :: res ! device or host variable

2.2.3. sasum

SASUM 获取绝对值的总和。

real(4) function sasum(n, x, incx)
  integer :: n
  real(4), device, dimension(*) :: x ! device or host variable
  integer :: incx
real(4) function cublasSasum(n, x, incx)
  integer :: n
  real(4), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasSasum_v2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  real(4), device, dimension(*) :: x
  integer :: incx
  real(4), device :: res ! device or host variable

2.2.4. saxpy

SAXPY 常数乘以向量加上向量。

subroutine saxpy(n, a, x, incx, y, incy)
  integer :: n
  real(4), device :: a ! device or host variable
  real(4), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasSaxpy(n, a, x, incx, y, incy)
  integer :: n
  real(4), device :: a ! device or host variable
  real(4), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasSaxpy_v2(h, n, a, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  real(4), device :: a ! device or host variable
  real(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.2.5. scopy

SCOPY 将向量 x 复制到向量 y。

subroutine scopy(n, x, incx, y, incy)
  integer :: n
  real(4), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasScopy(n, x, incx, y, incy)
  integer :: n
  real(4), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasScopy_v2(h, n, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  real(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.2.6. sdot

SDOT 形成两个向量的点积。

real(4) function sdot(n, x, incx, y, incy)
  integer :: n
  real(4), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
real(4) function cublasSdot(n, x, incx, y, incy)
  integer :: n
  real(4), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasSdot_v2(h, n, x, incx, y, incy, res)
  type(cublasHandle) :: h
  integer :: n
  real(4), device, dimension(*) :: x, y
  integer :: incx, incy
  real(4), device :: res ! device or host variable

2.2.7. snrm2

SNRM2 通过函数名称返回向量的欧几里得范数,因此 SNRM2 := sqrt( x’*x )。

real(4) function snrm2(n, x, incx)
  integer :: n
  real(4), device, dimension(*) :: x ! device or host variable
  integer :: incx
real(4) function cublasSnrm2(n, x, incx)
  integer :: n
  real(4), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasSnrm2_v2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  real(4), device, dimension(*) :: x
  integer :: incx
  real(4), device :: res ! device or host variable

2.2.8. srot

SROT 应用平面旋转。

subroutine srot(n, x, incx, y, incy, sc, ss)
  integer :: n
  real(4), device :: sc, ss ! device or host variable
  real(4), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasSrot(n, x, incx, y, incy, sc, ss)
  integer :: n
  real(4), device :: sc, ss ! device or host variable
  real(4), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasSrot_v2(h, n, x, incx, y, incy, sc, ss)
  type(cublasHandle) :: h
  integer :: n
  real(4), device :: sc, ss ! device or host variable
  real(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.2.9. srotg

SROTG 构造 Givens 平面旋转。

subroutine srotg(sa, sb, sc, ss)
  real(4), device :: sa, sb, sc, ss ! device or host variable
subroutine cublasSrotg(sa, sb, sc, ss)
  real(4), device :: sa, sb, sc, ss ! device or host variable
integer(4) function cublasSrotg_v2(h, sa, sb, sc, ss)
  type(cublasHandle) :: h
  real(4), device :: sa, sb, sc, ss ! device or host variable

2.2.10. srotm

SROTM 将修改后的 Givens 变换 H 应用于 2 乘 N 矩阵 (SX**T),其中 **T 表示转置。SX 的元素位于 (SX**T) SX(LX+I*INCX) 中,I = 0 到 N-1,其中 LX = 1 如果 INCX .GE. 0,否则 LX = (-INCX)*N,SY 使用 LY 和 INCY 的情况类似。对于 SPARAM(1)=SFLAG,H 具有以下形式之一。SFLAG=-1.E0 SFLAG=0.E0 SFLAG=1.E0 SFLAG=-2.E0 (SH11 SH12) (1.E0 SH12) (SH11 1.E0) (1.E0 0.E0) H=( ) ( ) ( ) ( ) (SH21 SH22), (SH21 1.E0), (-1.E0 SH22), (0.E0 1.E0)。有关 SPARAM 中数据存储的描述,请参见 SROTMG。

subroutine srotm(n, x, incx, y, incy, param)
  integer :: n
  real(4), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasSrotm(n, x, incx, y, incy, param)
  integer :: n
  real(4), device, dimension(*) :: x, y
  integer :: incx, incy
  real(4), device :: param(*) ! device or host variable
integer(4) function cublasSrotm_v2(h, n, x, incx, y, incy, param)
  type(cublasHandle) :: h
  integer :: n
  real(4), device :: param(*) ! device or host variable
  real(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.2.11. srotmg

SROTMG 构造修改后的 Givens 变换矩阵 H,该矩阵将 2 向量 (SQRT(SD1)*SX1,SQRT(SD2)*SY2)**T 的第二个分量归零。对于 SPARAM(1)=SFLAG,H 具有以下形式之一。SFLAG=-1.E0 SFLAG=0.E0 SFLAG=1.E0 SFLAG=-2.E0 (SH11 SH12) (1.E0 SH12) (SH11 1.E0) (1.E0 0.E0) H=( ) ( ) ( ) (SH21 SH22), (SH21 1.E0), (-1.E0 SH22), (0.E0 1.E0). SPARAM 的位置 2-4 分别包含 SH11、SH21、SH12 和 SH22。(SPARAM(1) 的值隐含的 1.E0、-1.E0 或 0.E0 不存储在 SPARAM 中。)

subroutine srotmg(d1, d2, x1, y1, param)
  real(4), device :: d1, d2, x1, y1, param(*) ! device or host variable
subroutine cublasSrotmg(d1, d2, x1, y1, param)
  real(4), device :: d1, d2, x1, y1, param(*) ! device or host variable
integer(4) function cublasSrotmg_v2(h, d1, d2, x1, y1, param)
  type(cublasHandle) :: h
  real(4), device :: d1, d2, x1, y1, param(*) ! device or host variable

2.2.12. sscal

SSCAL 按常数缩放向量。

subroutine sscal(n, a, x, incx)
  integer :: n
  real(4), device :: a ! device or host variable
  real(4), device, dimension(*) :: x ! device or host variable
  integer :: incx
subroutine cublasSscal(n, a, x, incx)
  integer :: n
  real(4), device :: a ! device or host variable
  real(4), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasSscal_v2(h, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: n
  real(4), device :: a ! device or host variable
  real(4), device, dimension(*) :: x
  integer :: incx

2.2.13. sswap

SSWAP 交换两个向量。

subroutine sswap(n, x, incx, y, incy)
  integer :: n
  real(4), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasSswap(n, x, incx, y, incy)
  integer :: n
  real(4), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasSswap_v2(h, n, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  real(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.2.14. sgbmv

SGBMV 执行矩阵向量运算之一 y := alpha*A*x + beta*y 或 y := alpha*A**T*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是向量,A 是 m 乘 n 带状矩阵,具有 kl 个下对角线和 ku 个上对角线。

subroutine sgbmv(t, m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: m, n, kl, ku, lda, incx, incy
  real(4), device, dimension(lda, *) :: a ! device or host variable
  real(4), device, dimension(*) :: x, y ! device or host variable
  real(4), device :: alpha, beta ! device or host variable
subroutine cublasSgbmv(t, m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: m, n, kl, ku, lda, incx, incy
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x, y
  real(4), device :: alpha, beta ! device or host variable
integer(4) function cublasSgbmv_v2(h, t, m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: m, n, kl, ku, lda, incx, incy
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x, y
  real(4), device :: alpha, beta ! device or host variable

2.2.15. sgemv

SGEMV 执行矩阵向量运算之一 y := alpha*A*x + beta*y 或 y := alpha*A**T*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是向量,A 是 m 乘 n 矩阵。

subroutine sgemv(t, m, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: m, n, lda, incx, incy
  real(4), device, dimension(lda, *) :: a ! device or host variable
  real(4), device, dimension(*) :: x, y ! device or host variable
  real(4), device :: alpha, beta ! device or host variable
subroutine cublasSgemv(t, m, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: m, n, lda, incx, incy
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x, y
  real(4), device :: alpha, beta ! device or host variable
integer(4) function cublasSgemv_v2(h, t, m, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: m, n, lda, incx, incy
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x, y
  real(4), device :: alpha, beta ! device or host variable

2.2.16. sger

SGER 执行秩 1 运算 A := alpha*x*y**T + A,其中 alpha 是标量,x 是 m 元素向量,y 是 n 元素向量,A 是 m 乘 n 矩阵。

subroutine sger(m, n, alpha, x, incx, y, incy, a, lda)
  integer :: m, n, lda, incx, incy
  real(4), device, dimension(lda, *) :: a ! device or host variable
  real(4), device, dimension(*) :: x, y ! device or host variable
  real(4), device :: alpha ! device or host variable
subroutine cublasSger(m, n, alpha, x, incx, y, incy, a, lda)
  integer :: m, n, lda, incx, incy
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x, y
  real(4), device :: alpha ! device or host variable
integer(4) function cublasSger_v2(h, m, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: m, n, lda, incx, incy
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x, y
  real(4), device :: alpha ! device or host variable

2.2.17. ssbmv

SSBMV 执行矩阵向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是 n 元素向量,A 是 n 乘 n 对称带状矩阵,具有 k 个上对角线。

subroutine ssbmv(t, n, k, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: k, n, lda, incx, incy
  real(4), device, dimension(lda, *) :: a ! device or host variable
  real(4), device, dimension(*) :: x, y ! device or host variable
  real(4), device :: alpha, beta ! device or host variable
subroutine cublasSsbmv(t, n, k, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: k, n, lda, incx, incy
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x, y
  real(4), device :: alpha, beta ! device or host variable
integer(4) function cublasSsbmv_v2(h, t, n, k, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: k, n, lda, incx, incy
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x, y
  real(4), device :: alpha, beta ! device or host variable

2.2.18. sspmv

SSPMV 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是 n 元素向量,A 是以压缩形式提供的 n x n 对称矩阵。

subroutine sspmv(t, n, alpha, a, x, incx, beta, y, incy)
  character*1 :: t
  integer :: n, incx, incy
  real(4), device, dimension(*) :: a, x, y ! device or host variable
  real(4), device :: alpha, beta ! device or host variable
subroutine cublasSspmv(t, n, alpha, a, x, incx, beta, y, incy)
  character*1 :: t
  integer :: n, incx, incy
  real(4), device, dimension(*) :: a, x, y
  real(4), device :: alpha, beta ! device or host variable
integer(4) function cublasSspmv_v2(h, t, n, alpha, a, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy
  real(4), device, dimension(*) :: a, x, y
  real(4), device :: alpha, beta ! device or host variable

2.2.19. sspr

SSPR 执行对称秩 1 运算 A := alpha*x*x**T + A,其中 alpha 是实标量,x 是 n 元素向量,A 是以压缩形式提供的 n x n 对称矩阵。

subroutine sspr(t, n, alpha, x, incx, a)
  character*1 :: t
  integer :: n, incx
  real(4), device, dimension(*) :: a, x ! device or host variable
  real(4), device :: alpha ! device or host variable
subroutine cublasSspr(t, n, alpha, x, incx, a)
  character*1 :: t
  integer :: n, incx
  real(4), device, dimension(*) :: a, x
  real(4), device :: alpha ! device or host variable
integer(4) function cublasSspr_v2(h, t, n, alpha, x, incx, a)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx
  real(4), device, dimension(*) :: a, x
  real(4), device :: alpha ! device or host variable

2.2.20. sspr2

SSPR2 执行对称秩 2 运算 A := alpha*x*y**T + alpha*y*x**T + A,其中 alpha 是标量,x 和 y 是 n 元素向量,A 是以压缩形式提供的 n x n 对称矩阵。

subroutine sspr2(t, n, alpha, x, incx, y, incy, a)
  character*1 :: t
  integer :: n, incx, incy
  real(4), device, dimension(*) :: a, x, y ! device or host variable
  real(4), device :: alpha ! device or host variable
subroutine cublasSspr2(t, n, alpha, x, incx, y, incy, a)
  character*1 :: t
  integer :: n, incx, incy
  real(4), device, dimension(*) :: a, x, y
  real(4), device :: alpha ! device or host variable
integer(4) function cublasSspr2_v2(h, t, n, alpha, x, incx, y, incy, a)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy
  real(4), device, dimension(*) :: a, x, y
  real(4), device :: alpha ! device or host variable

2.2.21. ssymv

SSYMV 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是 n 元素向量,A 是 n x n 对称矩阵。

subroutine ssymv(uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: n, lda, incx, incy
  real(4), device, dimension(lda, *) :: a ! device or host variable
  real(4), device, dimension(*) :: x, y ! device or host variable
  real(4), device :: alpha, beta ! device or host variable
subroutine cublasSsymv(uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: n, lda, incx, incy
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x, y
  real(4), device :: alpha, beta ! device or host variable
integer(4) function cublasSsymv_v2(h, uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: n, lda, incx, incy
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x, y
  real(4), device :: alpha, beta ! device or host variable

2.2.22. ssyr

SSYR 执行对称秩 1 运算 A := alpha*x*x**T + A,其中 alpha 是实标量,x 是 n 元素向量,A 是 n x n 对称矩阵。

subroutine ssyr(t, n, alpha, x, incx, a, lda)
  character*1 :: t
  integer :: n, incx, lda
  real(4), device, dimension(lda, *) :: a ! device or host variable
  real(4), device, dimension(*) :: x ! device or host variable
  real(4), device :: alpha ! device or host variable
subroutine cublasSsyr(t, n, alpha, x, incx, a, lda)
  character*1 :: t
  integer :: n, incx, lda
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x
  real(4), device :: alpha ! device or host variable
integer(4) function cublasSsyr_v2(h, t, n, alpha, x, incx, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, lda
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x
  real(4), device :: alpha ! device or host variable

2.2.23. ssyr2

SSYR2 执行对称秩 2 运算 A := alpha*x*y**T + alpha*y*x**T + A,其中 alpha 是标量,x 和 y 是 n 元素向量,A 是 n x n 对称矩阵。

subroutine ssyr2(t, n, alpha, x, incx, y, incy, a, lda)
  character*1 :: t
  integer :: n, incx, incy, lda
  real(4), device, dimension(lda, *) :: a ! device or host variable
  real(4), device, dimension(*) :: x, y ! device or host variable
  real(4), device :: alpha ! device or host variable
subroutine cublasSsyr2(t, n, alpha, x, incx, y, incy, a, lda)
  character*1 :: t
  integer :: n, incx, incy, lda
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x, y
  real(4), device :: alpha ! device or host variable
integer(4) function cublasSsyr2_v2(h, t, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy, lda
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x, y
  real(4), device :: alpha ! device or host variable

2.2.24. stbmv

STBMV 执行矩阵-向量运算 x := A*x 或 x := A**T*x 之一,其中 x 是 n 元素向量,A 是具有 ( k + 1 ) 条对角线的 n x n 单位或非单位上或下三角带状矩阵。

subroutine stbmv(u, t, d, n, k, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, k, incx, lda
  real(4), device, dimension(lda, *) :: a ! device or host variable
  real(4), device, dimension(*) :: x ! device or host variable
subroutine cublasStbmv(u, t, d, n, k, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, k, incx, lda
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x
integer(4) function cublasStbmv_v2(h, u, t, d, n, k, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, k, incx, lda
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x

2.2.25. stbsv

STBSV 求解方程组 A*x = b 或 A**T*x = b 之一,其中 b 和 x 是 n 元素向量,A 是具有 ( k + 1 ) 条对角线的 n x n 单位或非单位上或下三角带状矩阵。此例程中不包含奇异性或接近奇异性的测试。此类测试必须在此例程调用之前执行。

subroutine stbsv(u, t, d, n, k, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, k, incx, lda
  real(4), device, dimension(lda, *) :: a ! device or host variable
  real(4), device, dimension(*) :: x ! device or host variable
subroutine cublasStbsv(u, t, d, n, k, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, k, incx, lda
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x
integer(4) function cublasStbsv_v2(h, u, t, d, n, k, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, k, incx, lda
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x

2.2.26. stpmv

STPMV 执行矩阵-向量运算 x := A*x 或 x := A**T*x 之一,其中 x 是 n 元素向量,A 是以压缩形式提供的 n x n 单位或非单位上或下三角矩阵。

subroutine stpmv(u, t, d, n, a, x, incx)
  character*1 :: u, t, d
  integer :: n, incx
  real(4), device, dimension(*) :: a, x ! device or host variable
subroutine cublasStpmv(u, t, d, n, a, x, incx)
  character*1 :: u, t, d
  integer :: n, incx
  real(4), device, dimension(*) :: a, x
integer(4) function cublasStpmv_v2(h, u, t, d, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx
  real(4), device, dimension(*) :: a, x

2.2.27. stpsv

STPSV 求解方程组 A*x = b 或 A**T*x = b 之一,其中 b 和 x 是 n 元素向量,A 是以压缩形式提供的 n x n 单位或非单位上或下三角矩阵。此例程中不包含奇异性或接近奇异性的测试。此类测试必须在此例程调用之前执行。

subroutine stpsv(u, t, d, n, a, x, incx)
  character*1 :: u, t, d
  integer :: n, incx
  real(4), device, dimension(*) :: a, x ! device or host variable
subroutine cublasStpsv(u, t, d, n, a, x, incx)
  character*1 :: u, t, d
  integer :: n, incx
  real(4), device, dimension(*) :: a, x
integer(4) function cublasStpsv_v2(h, u, t, d, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx
  real(4), device, dimension(*) :: a, x

2.2.28. strmv

STRMV 执行矩阵-向量运算 x := A*x 或 x := A**T*x 之一,其中 x 是 n 元素向量,A 是 n x n 单位或非单位上或下三角矩阵。

subroutine strmv(u, t, d, n, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, incx, lda
  real(4), device, dimension(lda, *) :: a ! device or host variable
  real(4), device, dimension(*) :: x ! device or host variable
subroutine cublasStrmv(u, t, d, n, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, incx, lda
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x
integer(4) function cublasStrmv_v2(h, u, t, d, n, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx, lda
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x

2.2.29. strsv

STRSV 求解方程组 A*x = b 或 A**T*x = b 之一,其中 b 和 x 是 n 元素向量,A 是 n x n 单位或非单位上或下三角矩阵。此例程中不包含奇异性或接近奇异性的测试。此类测试必须在此例程调用之前执行。

subroutine strsv(u, t, d, n, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, incx, lda
  real(4), device, dimension(lda, *) :: a ! device or host variable
  real(4), device, dimension(*) :: x ! device or host variable
subroutine cublasStrsv(u, t, d, n, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, incx, lda
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x
integer(4) function cublasStrsv_v2(h, u, t, d, n, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx, lda
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x

2.2.30. sgemm

SGEMM 执行矩阵-矩阵运算 C := alpha*op( A )*op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量,A、B 和 C 是矩阵,其中 op( A ) 是 m x k 矩阵,op( B ) 是 k x n 矩阵,C 是 m x n 矩阵。

subroutine sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: transa, transb
  integer :: m, n, k, lda, ldb, ldc
  real(4), device, dimension(lda, *) :: a ! device or host variable
  real(4), device, dimension(ldb, *) :: b ! device or host variable
  real(4), device, dimension(ldc, *) :: c ! device or host variable
  real(4), device :: alpha, beta ! device or host variable
subroutine cublasSgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: transa, transb
  integer :: m, n, k, lda, ldb, ldc
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldb, *) :: b
  real(4), device, dimension(ldc, *) :: c
  real(4), device :: alpha, beta ! device or host variable
integer(4) function cublasSgemm_v2(h, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: transa, transb
  integer :: m, n, k, lda, ldb, ldc
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldb, *) :: b
  real(4), device, dimension(ldc, *) :: c
  real(4), device :: alpha, beta ! device or host variable

2.2.31. ssymm

SSYMM 执行矩阵-矩阵运算 C := alpha*A*B + beta*C 或 C := alpha*B*A + beta*C 之一,其中 alpha 和 beta 是标量,A 是对称矩阵,B 和 C 是 m x n 矩阵。

subroutine ssymm(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: side, uplo
  integer :: m, n, lda, ldb, ldc
  real(4), device, dimension(lda, *) :: a ! device or host variable
  real(4), device, dimension(ldb, *) :: b ! device or host variable
  real(4), device, dimension(ldc, *) :: c ! device or host variable
  real(4), device :: alpha, beta ! device or host variable
subroutine cublasSsymm(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: side, uplo
  integer :: m, n, lda, ldb, ldc
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldb, *) :: b
  real(4), device, dimension(ldc, *) :: c
  real(4), device :: alpha, beta ! device or host variable
integer(4) function cublasSsymm_v2(h, side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo
  integer :: m, n, lda, ldb, ldc
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldb, *) :: b
  real(4), device, dimension(ldc, *) :: c
  real(4), device :: alpha, beta ! device or host variable

2.2.32. ssyrk

SSYRK 执行对称秩 k 运算 C := alpha*A*A**T + beta*C 或 C := alpha*A**T*A + beta*C 之一,其中 alpha 和 beta 是标量,C 是 n x n 对称矩阵,A 在第一种情况下是 n x k 矩阵,在第二种情况下是 k x n 矩阵。

subroutine ssyrk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldc
  real(4), device, dimension(lda, *) :: a ! device or host variable
  real(4), device, dimension(ldc, *) :: c ! device or host variable
  real(4), device :: alpha, beta ! device or host variable
subroutine cublasSsyrk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldc
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldc, *) :: c
  real(4), device :: alpha, beta ! device or host variable
integer(4) function cublasSsyrk_v2(h, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldc
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldc, *) :: c
  real(4), device :: alpha, beta ! device or host variable

2.2.33. ssyr2k

SSYR2K 执行对称秩 2k 运算 C := alpha*A*B**T + alpha*B*A**T + beta*C 或 C := alpha*A**T*B + alpha*B**T*A + beta*C 之一,其中 alpha 和 beta 是标量,C 是 n x n 对称矩阵,A 和 B 在第一种情况下是 n x k 矩阵,在第二种情况下是 k x n 矩阵。

subroutine ssyr2k(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  real(4), device, dimension(lda, *) :: a ! device or host variable
  real(4), device, dimension(ldb, *) :: b ! device or host variable
  real(4), device, dimension(ldc, *) :: c ! device or host variable
  real(4), device :: alpha, beta ! device or host variable
subroutine cublasSsyr2k(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldb, *) :: b
  real(4), device, dimension(ldc, *) :: c
  real(4), device :: alpha, beta ! device or host variable
integer(4) function cublasSsyr2k_v2(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldb, *) :: b
  real(4), device, dimension(ldc, *) :: c
  real(4), device :: alpha, beta ! device or host variable

2.2.34. ssyrkx

SSYRKX 执行对称秩 k 更新 C := alpha*A*B**T + beta*C 的变体,其中 alpha 和 beta 是标量,C 是以下三角或上三角模式存储的 n x n 对称矩阵,A 和 B 是 n x k 矩阵。当 B 以某种方式使得结果保证对称时,可以使用此例程。有关更多详细信息,请参阅 CUBLAS 文档。

subroutine ssyrkx(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  real(4), device, dimension(lda, *) :: a ! device or host variable
  real(4), device, dimension(ldb, *) :: b ! device or host variable
  real(4), device, dimension(ldc, *) :: c ! device or host variable
  real(4), device :: alpha, beta ! device or host variable
subroutine cublasSsyrkx(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldb, *) :: b
  real(4), device, dimension(ldc, *) :: c

  real(4), device :: alpha, beta ! device or host variable
integer(4) function cublasSsyrkx_v2(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldb, *) :: b
  real(4), device, dimension(ldc, *) :: c
  real(4), device :: alpha, beta ! device or host variable

2.2.35. strmm

STRMM 执行矩阵-矩阵运算 B := alpha*op( A )*B 或 B := alpha*B*op( A ) 之一,其中 alpha 是标量,B 是 m x n 矩阵,A 是单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一。

subroutine strmm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  character*1 :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  real(4), device, dimension(lda, *) :: a ! device or host variable
  real(4), device, dimension(ldb, *) :: b ! device or host variable
  real(4), device :: alpha ! device or host variable
subroutine cublasStrmm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  character*1 :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldb, *) :: b
  real(4), device :: alpha ! device or host variable
integer(4) function cublasStrmm_v2(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo, transa, diag
  integer :: m, n, lda, ldb, ldc
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldb, *) :: b
  real(4), device, dimension(ldc, *) :: c
  real(4), device :: alpha ! device or host variable

2.2.36. strsm

STRSM 求解矩阵方程 op( A )*X = alpha*B 或 X*op( A ) = alpha*B 之一,其中 alpha 是标量,X 和 B 是 m x n 矩阵,A 是单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一。矩阵 X 在 B 上被覆盖。

subroutine strsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  character*1 :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  real(4), device, dimension(lda, *) :: a ! device or host variable
  real(4), device, dimension(ldb, *) :: b ! device or host variable
  real(4), device :: alpha ! device or host variable
subroutine cublasStrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  character*1 :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldb, *) :: b
  real(4), device :: alpha ! device or host variable
integer(4) function cublasStrsm_v2(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  type(cublasHandle) :: h
  integer :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldb, *) :: b
  real(4), device :: alpha ! device or host variable

2.2.37. cublasSgemvBatched

SGEMV 执行批量矩阵-向量运算 Y := alpha*op( A ) * X + beta*Y,其中 op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一,alpha 和 beta 是标量,A 是 m x n 矩阵,X 和 Y 是向量。

integer(4) function cublasSgemvBatched(h, trans, m, n, alpha, &
      Aarray, lda, xarray, incx, beta, yarray, incy, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: m, n
  real(4), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: xarray(*)
  integer :: incx
  real(4), device :: beta ! device or host variable
  type(c_devptr), device :: yarray(*)
  integer :: incy
  integer :: batchCount
integer(4) function cublasSgemvBatched_v2(h, trans, m, n, alpha, &
      Aarray, lda, xarray, incx, beta, yarray, incy, batchCount)
  type(cublasHandle) :: h
  integer :: trans
  integer :: m, n
  real(4), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: xarray(*)
  integer :: incx
  real(4), device :: beta ! device or host variable
  type(c_devptr), device :: yarray(*)
  integer :: incy
  integer :: batchCount

2.2.38. cublasSgemmBatched

SGEMM 执行矩阵-矩阵运算 C := alpha*op( A )*op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量,A、B 和 C 是矩阵,其中 op( A ) 是 m x k 矩阵,op( B ) 是 k x n 矩阵,C 是 m x n 矩阵。

integer(4) function cublasSgemmBatched(h, transa, transb, m, n, k, alpha, Aarray, lda, Barray, ldb, beta, Carray, ldc, batchCount)
  type(cublasHandle) :: h
  integer :: transa ! integer or character(1) variable
  integer :: transb ! integer or character(1) variable
  integer :: m, n, k
  real(4), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Barray(*)
  integer :: ldb
  real(4), device :: beta ! device or host variable
  type(c_devptr), device :: Carray(*)
  integer :: ldc
  integer :: batchCount
integer(4) function cublasSgemmBatched_v2(h, transa, transb, m, n, k, alpha, &
           Aarray, lda, Barray, ldb, beta, Carray, ldc, batchCount)
  type(cublasHandle) :: h
  integer :: transa
  integer :: transb
  integer :: m, n, k
  real(4), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Barray(*)
  integer :: ldb
  real(4), device :: beta ! device or host variable
  type(c_devptr), device :: Carray(*)
  integer :: ldc
  integer :: batchCount

2.2.39. cublasSgelsBatched

SGELS 使用 A 的 QR 或 LQ 分解求解涉及 M×N 矩阵 A 或其转置的超定或欠定实线性系统。假设 A 具有满秩。提供以下选项:1. 如果 TRANS = ‘N’ 且 m >= n:找到超定系统的最小二乘解,即求解最小二乘问题 minimize || B - A*X ||。2. 如果 TRANS = ‘N’ 且 m < n:找到欠定系统 A * X = B 的最小范数解。3. 如果 TRANS = ‘T’ 且 m >= n:找到欠定系统 A**T * X = B 的最小范数解。4. 如果 TRANS = ‘T’ 且 m < n:找到超定系统的最小二乘解,即求解最小二乘问题 minimize || B - A**T * X ||。可以在单个调用中处理多个右手边向量 b 和解向量 x;它们存储为 M×NRHS 右手边矩阵 B 和 N×NRHS 解矩阵 X 的列。

integer(4) function cublasSgelsBatched(h, trans, m, n, nrhs, Aarray, lda, Carray, ldc, info, devinfo, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: m, n, nrhs
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Carray(*)
  integer :: ldc
  integer :: info(*)
  integer, device :: devinfo(*)
  integer :: batchCount

2.2.40. cublasSgeqrfBatched

SGEQRF 计算实数 M×N 矩阵 A 的 QR 分解:A = Q * R。

integer(4) function cublasSgeqrfBatched(h, m, n, Aarray, lda, Tau, info, batchCount)
  type(cublasHandle) :: h
  integer :: m, n
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Tau(*)
  integer :: info(*)
  integer :: batchCount

2.2.41. cublasSgetrfBatched

SGETRF 使用带行交换的部分主元法计算一般 M×N 矩阵 A 的 LU 分解。分解形式为 A = P * L * U,其中 P 是置换矩阵,L 是具有单位对角线元素的下三角矩阵(如果 m > n,则为下梯形),U 是上三角矩阵(如果 m < n,则为上梯形)。这是算法的右视 Level 3 BLAS 版本。

integer(4) function cublasSgetrfBatched(h, n, Aarray, lda, ipvt, info, batchCount)
  type(cublasHandle) :: h
  integer :: n
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  integer, device :: ipvt(*)
  integer, device :: info(*)
  integer :: batchCount

2.2.42. cublasSgetriBatched

SGETRI 使用 SGETRF 计算的 LU 分解计算矩阵的逆。此方法反转 U,然后通过求解系统 inv(A)*L = inv(U) 来计算 inv(A)。

integer(4) function cublasSgetriBatched(h, n, Aarray, lda, ipvt, Carray, ldc, info, batchCount)
  type(cublasHandle) :: h
  integer :: n
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  integer, device :: ipvt(*)
  type(c_devptr), device :: Carray(*)
  integer :: ldc
  integer, device :: info(*)
  integer :: batchCount

2.2.43. cublasSgetrsBatched

SGETRS 使用 SGETRF 计算的 LU 分解求解具有一般 N×N 矩阵 A 的线性方程组 A * X = B 或 A**T * X = B。

integer(4) function cublasSgetrsBatched(h, trans, n, nrhs, Aarray, lda, ipvt, Barray, ldb, info, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: n, nrhs
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  integer, device :: ipvt(*)
  type(c_devptr), device :: Barray(*)
  integer :: ldb
  integer :: info(*)
  integer :: batchCount

2.2.44. cublasSmatinvBatched

cublasSmatinvBatched 是 cublasSgetrfBatched 加 cublasSgetriBatched 的快捷方式。但是,它仅在 n 小于 32 时有效。否则,用户必须通过 cublasSgetrfBatched 和 cublasSgetriBatched。

integer(4) function cublasSmatinvBatched(h, n, Aarray, lda, Ainv, lda_inv, info, batchCount)
  type(cublasHandle) :: h
  integer :: n
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Ainv(*)
  integer :: lda_inv
  integer, device :: info(*)
  integer :: batchCount

2.2.45. cublasStrsmBatched

STRSM 求解矩阵方程 op( A )*X = alpha*B 或 X*op( A ) = alpha*B 之一,其中 alpha 是标量,X 和 B 是 m x n 矩阵,A 是单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一。矩阵 X 在 B 上被覆盖。

integer(4) function cublasStrsmBatched( h, side, uplo, trans, diag, m, n, alpha, A, lda, B, ldb, batchCount)
  type(cublasHandle) :: h
  integer :: side ! integer or character(1) variable
  integer :: uplo ! integer or character(1) variable
  integer :: trans ! integer or character(1) variable
  integer :: diag ! integer or character(1) variable
  integer :: m, n
  real(4), device :: alpha ! device or host variable
  type(c_devptr), device :: A(*)
  integer :: lda
  type(c_devptr), device :: B(*)
  integer :: ldb
  integer :: batchCount
integer(4) function cublasStrsmBatched_v2( h, side, uplo, trans, diag, m, n, alpha, A, lda, B, ldb, batchCount)
  type(cublasHandle) :: h
  integer :: side
  integer :: uplo
  integer :: trans
  integer :: diag
  integer :: m, n
  real(4), device :: alpha ! device or host variable
  type(c_devptr), device :: A(*)
  integer :: lda
  type(c_devptr), device :: B(*)
  integer :: ldb
  integer :: batchCount

2.2.46. cublasSgemvStridedBatched

SGEMV 执行批量矩阵-向量运算 Y := alpha*op( A ) * X + beta*Y,其中 op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一,alpha 和 beta 是标量,A 是 m x n 矩阵,X 和 Y 是向量。

integer(4) function cublasSgemvStridedBatched(h, trans, m, n, alpha, &
      A, lda, strideA, X, incx, strideX, beta, Y, incy, strideY, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: m, n
  real(4), device :: alpha ! device or host variable
  real(4), device :: A(lda,*)
  integer :: lda
  integer(8) :: strideA
  real(4), device :: X(*)
  integer :: incx
  integer(8) :: strideX
  real(4), device :: beta ! device or host variable
  real(4), device :: Y(*)
  integer :: incy
  integer(8) :: strideY
  integer :: batchCount
integer(4) function cublasSgemvStridedBatched_v2(h, trans, m, n, alpha, &
      A, lda, strideA, X, incx, strideX, beta, Y, incy, strideY, batchCount)
  type(cublasHandle) :: h
  integer :: trans
  integer :: m, n
  real(4), device :: alpha ! device or host variable
  real(4), device :: A(lda,*)
  integer :: lda
  integer(8) :: strideA
  real(4), device :: X(*)
  integer :: incx
  integer(8) :: strideX
  real(4), device :: beta ! device or host variable
  real(4), device :: Y(*)
  integer :: incy
  integer(8) :: strideY
  integer :: batchCount

2.2.47. cublasSgemmStridedBatched

SGEMM 执行矩阵-矩阵运算 C := alpha*op( A )*op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量,A、B 和 C 是矩阵,其中 op( A ) 是 m x k 矩阵,op( B ) 是 k x n 矩阵,C 是 m x n 矩阵。

integer(4) function cublasSgemmStridedBatched(h, transa, transb, m, n, k, alpha, Aarray, lda, strideA, Barray, ldb, strideB, beta, Carray, ldc, strideC, batchCount)
  type(cublasHandle) :: h
  integer :: transa ! integer or character(1) variable
  integer :: transb ! integer or character(1) variable
  integer :: m, n, k
  real(4), device :: alpha ! device or host variable
  real(4), device :: Aarray(*)
  integer :: lda
  integer :: strideA
  real(4), device :: Barray(*)
  integer :: ldb
  integer :: strideB
  real(4), device :: beta ! device or host variable
  real(4), device :: Carray(*)
  integer :: ldc
  integer :: strideC
  integer :: batchCount
integer(4) function cublasSgemmStridedBatched_v2(h, transa, transb, m, n, k, alpha, &
           Aarray, lda, strideA, Barray, ldb, strideB, beta, Carray, ldc, strideC, batchCount)
  type(cublasHandle) :: h
  integer :: transa
  integer :: transb
  integer :: m, n, k
  real(4), device :: alpha ! device or host variable
  real(4), device :: Aarray(*)
  integer :: lda
  integer :: strideA
  real(4), device :: Barray(*)
  integer :: ldb
  integer :: strideB
  real(4), device :: beta ! device or host variable
  real(4), device :: Carray(*)
  integer :: ldc
  integer :: strideC
  integer :: batchCount

2.3. 双精度函数和子例程

本节包含双精度 BLAS 和 cuBLAS 函数和子例程的接口。

2.3.1. idamax

IDAMAX 查找具有最大绝对值的元素的索引。

integer(4) function idamax(n, x, incx)
  integer :: n
  real(8), device, dimension(*) :: x ! device or host variable
  integer :: incx
integer(4) function cublasIdamax(n, x, incx)
  integer :: n
  real(8), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasIdamax_v2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  real(8), device, dimension(*) :: x
  integer :: incx
  integer, device :: res ! device or host variable

2.3.2. idamin

IDAMIN 查找具有最小绝对值的元素的索引。

integer(4) function idamin(n, x, incx)
  integer :: n
  real(8), device, dimension(*) :: x ! device or host variable
  integer :: incx
integer(4) function cublasIdamin(n, x, incx)
  integer :: n
  real(8), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasIdamin_v2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  real(8), device, dimension(*) :: x
  integer :: incx
  integer, device :: res ! device or host variable

2.3.3. dasum

DASUM 计算绝对值之和。

real(8) function dasum(n, x, incx)
  integer :: n
  real(8), device, dimension(*) :: x ! device or host variable
  integer :: incx
real(8) function cublasDasum(n, x, incx)
  integer :: n
  real(8), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasDasum_v2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  real(8), device, dimension(*) :: x
  integer :: incx
  real(8), device :: res ! device or host variable

2.3.4. daxpy

DAXPY 常数乘以向量加上向量。

subroutine daxpy(n, a, x, incx, y, incy)
  integer :: n
  real(8), device :: a ! device or host variable
  real(8), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasDaxpy(n, a, x, incx, y, incy)
  integer :: n
  real(8), device :: a ! device or host variable
  real(8), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasDaxpy_v2(h, n, a, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  real(8), device :: a ! device or host variable
  real(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.3.5. dcopy

DCOPY 将向量 x 复制到向量 y。

subroutine dcopy(n, x, incx, y, incy)
  integer :: n
  real(8), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasDcopy(n, x, incx, y, incy)
  integer :: n
  real(8), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasDcopy_v2(h, n, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  real(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.3.6. ddot

DDOT 形成两个向量的点积。

real(8) function ddot(n, x, incx, y, incy)
  integer :: n
  real(8), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
real(8) function cublasDdot(n, x, incx, y, incy)
  integer :: n
  real(8), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasDdot_v2(h, n, x, incx, y, incy, res)
  type(cublasHandle) :: h
  integer :: n
  real(8), device, dimension(*) :: x, y
  integer :: incx, incy
  real(8), device :: res ! device or host variable

2.3.7. dnrm2

DNRM2 通过函数名称返回向量的欧几里得范数,因此 DNRM2 := sqrt( x’*x )

real(8) function dnrm2(n, x, incx)
  integer :: n
  real(8), device, dimension(*) :: x ! device or host variable
  integer :: incx
real(8) function cublasDnrm2(n, x, incx)
  integer :: n
  real(8), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasDnrm2_v2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  real(8), device, dimension(*) :: x
  integer :: incx
  real(8), device :: res ! device or host variable

2.3.8. drot

DROT 应用平面旋转。

subroutine drot(n, x, incx, y, incy, sc, ss)
  integer :: n
  real(8), device :: sc, ss ! device or host variable
  real(8), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasDrot(n, x, incx, y, incy, sc, ss)
  integer :: n
  real(8), device :: sc, ss ! device or host variable
  real(8), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasDrot_v2(h, n, x, incx, y, incy, sc, ss)
  type(cublasHandle) :: h
  integer :: n
  real(8), device :: sc, ss ! device or host variable
  real(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.3.9. drotg

DROTG 构造 Givens 平面旋转。

subroutine drotg(sa, sb, sc, ss)
  real(8), device :: sa, sb, sc, ss ! device or host variable
subroutine cublasDrotg(sa, sb, sc, ss)
  real(8), device :: sa, sb, sc, ss ! device or host variable
integer(4) function cublasDrotg_v2(h, sa, sb, sc, ss)
  type(cublasHandle) :: h
  real(8), device :: sa, sb, sc, ss ! device or host variable

2.3.10. drotm

DROTM 将修改后的 Givens 变换 H 应用于 2 x N 矩阵 (DX**T) ,其中 **T 表示转置。DX 的元素在 (DX**T) DX(LX+I*INCX) 中,I = 0 到 N-1,其中如果 INCX .GE. 0,则 LX = 1,否则 LX = (-INCX)*N,DY 使用 LY 和 INCY 的情况类似。对于 DPARAM(1)=DFLAG,H 具有以下形式之一。DFLAG=-1.D0 DFLAG=0.D0 DFLAG=1.D0 DFLAG=-2.D0 (DH11 DH12) (1.D0 DH12) (DH11 1.D0) (1.D0 0.D0) H=( ) ( ) ( ) ( ) (DH21 DH22), (DH21 1.D0), (-1.D0 DH22), (0.D0 1.D0)。有关 DPARAM 中数据存储的描述,请参阅 DROTMG。

subroutine drotm(n, x, incx, y, incy, param)
  integer :: n
  real(8), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasDrotm(n, x, incx, y, incy, param)
  integer :: n
  real(8), device, dimension(*) :: x, y
  integer :: incx, incy
  real(8), device :: param(*) ! device or host variable
integer(4) function cublasDrotm_v2(h, n, x, incx, y, incy, param)
  type(cublasHandle) :: h
  integer :: n
  real(8), device :: param(*) ! device or host variable
  real(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.3.11. drotmg

DROTMG 构造修改后的 Givens 变换矩阵 H,该矩阵将 2 向量 (SQRT(DD1)*DX1,SQRT(DD2)*DY2)**T 的第二个分量置零。对于 DPARAM(1)=DFLAG,H 具有以下形式之一。DFLAG=-1.D0 DFLAG=0.D0 DFLAG=1.D0 DFLAG=-2.D0 (DH11 DH12) (1.D0 DH12) (DH11 1.D0) (1.D0 0.D0) H=( ) ( ) ( ) ( ) (DH21 DH22), (DH21 1.D0), (-1.D0 DH22), (0.D0 1.D0)。DPARAM 的位置 2-4 分别包含 DH11、DH21、DH12 和 DH22。(DPARAM(1) 的值隐含的 1.D0、-1.D0、0.D0 值不存储在 DPARAM 中。)

subroutine drotmg(d1, d2, x1, y1, param)
  real(8), device :: d1, d2, x1, y1, param(*) ! device or host variable
subroutine cublasDrotmg(d1, d2, x1, y1, param)
  real(8), device :: d1, d2, x1, y1, param(*) ! device or host variable
integer(4) function cublasDrotmg_v2(h, d1, d2, x1, y1, param)
  type(cublasHandle) :: h
  real(8), device :: d1, d2, x1, y1, param(*) ! device or host variable

2.3.12. dscal

DSCAL 用常数缩放向量。

subroutine dscal(n, a, x, incx)
  integer :: n
  real(8), device :: a ! device or host variable
  real(8), device, dimension(*) :: x ! device or host variable
  integer :: incx
subroutine cublasDscal(n, a, x, incx)
  integer :: n
  real(8), device :: a ! device or host variable
  real(8), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasDscal_v2(h, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: n
  real(8), device :: a ! device or host variable
  real(8), device, dimension(*) :: x
  integer :: incx

2.3.13. dswap

交换两个向量。

subroutine dswap(n, x, incx, y, incy)
  integer :: n
  real(8), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasDswap(n, x, incx, y, incy)
  integer :: n
  real(8), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasDswap_v2(h, n, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  real(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.3.14. dgbmv

DGBMV 执行矩阵-向量运算 y := alpha*A*x + beta*y 或 y := alpha*A**T*x + beta*y 之一,其中 alpha 和 beta 是标量,x 和 y 是向量,A 是具有 kl 条子对角线和 ku 条超对角线的 m x n 带状矩阵。

subroutine dgbmv(t, m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: m, n, kl, ku, lda, incx, incy
  real(8), device, dimension(lda, *) :: a ! device or host variable
  real(8), device, dimension(*) :: x, y ! device or host variable
  real(8), device :: alpha, beta ! device or host variable
subroutine cublasDgbmv(t, m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: m, n, kl, ku, lda, incx, incy
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x, y
  real(8), device :: alpha, beta ! device or host variable
integer(4) function cublasDgbmv_v2(h, t, m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: m, n, kl, ku, lda, incx, incy
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x, y
  real(8), device :: alpha, beta ! device or host variable

2.3.15. dgemv

DGEMV 执行矩阵-向量运算 y := alpha*A*x + beta*y 或 y := alpha*A**T*x + beta*y 之一,其中 alpha 和 beta 是标量,x 和 y 是向量,A 是 m x n 矩阵。

subroutine dgemv(t, m, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: m, n, lda, incx, incy
  real(8), device, dimension(lda, *) :: a ! device or host variable
  real(8), device, dimension(*) :: x, y ! device or host variable
  real(8), device :: alpha, beta ! device or host variable
subroutine cublasDgemv(t, m, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: m, n, lda, incx, incy
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x, y
  real(8), device :: alpha, beta ! device or host variable
integer(4) function cublasDgemv_v2(h, t, m, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: m, n, lda, incx, incy
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x, y
  real(8), device :: alpha, beta ! device or host variable

2.3.16. dger

DGER 执行秩 1 运算 A := alpha*x*y**T + A,其中 alpha 是标量,x 是 m 元素向量,y 是 n 元素向量,A 是 m x n 矩阵。

subroutine dger(m, n, alpha, x, incx, y, incy, a, lda)
  integer :: m, n, lda, incx, incy
  real(8), device, dimension(lda, *) :: a ! device or host variable
  real(8), device, dimension(*) :: x, y ! device or host variable
  real(8), device :: alpha ! device or host variable
subroutine cublasDger(m, n, alpha, x, incx, y, incy, a, lda)
  integer :: m, n, lda, incx, incy
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x, y
  real(8), device :: alpha ! device or host variable
integer(4) function cublasDger_v2(h, m, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: m, n, lda, incx, incy
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x, y
  real(8), device :: alpha ! device or host variable

2.3.17. dsbmv

DSBMV 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是 n 元素向量,A 是具有 k 条超对角线的 n x n 对称带状矩阵。

subroutine dsbmv(t, n, k, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: k, n, lda, incx, incy
  real(8), device, dimension(lda, *) :: a ! device or host variable
  real(8), device, dimension(*) :: x, y ! device or host variable
  real(8), device :: alpha, beta ! device or host variable
subroutine cublasDsbmv(t, n, k, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: k, n, lda, incx, incy
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x, y
  real(8), device :: alpha, beta ! device or host variable
integer(4) function cublasDsbmv_v2(h, t, n, k, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: k, n, lda, incx, incy
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x, y
  real(8), device :: alpha, beta ! device or host variable

2.3.18. dspmv

DSPMV 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是 n 元素向量,A 是以压缩形式提供的 n x n 对称矩阵。

subroutine dspmv(t, n, alpha, a, x, incx, beta, y, incy)
  character*1 :: t
  integer :: n, incx, incy
  real(8), device, dimension(*) :: a, x, y ! device or host variable
  real(8), device :: alpha, beta ! device or host variable
subroutine cublasDspmv(t, n, alpha, a, x, incx, beta, y, incy)
  character*1 :: t
  integer :: n, incx, incy
  real(8), device, dimension(*) :: a, x, y
  real(8), device :: alpha, beta ! device or host variable
integer(4) function cublasDspmv_v2(h, t, n, alpha, a, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy
  real(8), device, dimension(*) :: a, x, y
  real(8), device :: alpha, beta ! device or host variable

2.3.19. dspr

DSPR 执行对称秩 1 运算 A := alpha*x*x**T + A,其中 alpha 是实标量,x 是 n 元素向量,A 是以压缩形式提供的 n x n 对称矩阵。

subroutine dspr(t, n, alpha, x, incx, a)
  character*1 :: t
  integer :: n, incx
  real(8), device, dimension(*) :: a, x ! device or host variable
  real(8), device :: alpha ! device or host variable
subroutine cublasDspr(t, n, alpha, x, incx, a)
  character*1 :: t
  integer :: n, incx
  real(8), device, dimension(*) :: a, x
  real(8), device :: alpha ! device or host variable
integer(4) function cublasDspr_v2(h, t, n, alpha, x, incx, a)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx
  real(8), device, dimension(*) :: a, x
  real(8), device :: alpha ! device or host variable

2.3.20. dspr2

DSPR2 执行对称秩 2 运算 A := alpha*x*y**T + alpha*y*x**T + A,其中 alpha 是标量,x 和 y 是 n 元素向量,A 是以压缩形式提供的 n x n 对称矩阵。

subroutine dspr2(t, n, alpha, x, incx, y, incy, a)
  character*1 :: t
  integer :: n, incx, incy
  real(8), device, dimension(*) :: a, x, y ! device or host variable
  real(8), device :: alpha ! device or host variable
subroutine cublasDspr2(t, n, alpha, x, incx, y, incy, a)
  character*1 :: t
  integer :: n, incx, incy
  real(8), device, dimension(*) :: a, x, y
  real(8), device :: alpha ! device or host variable
integer(4) function cublasDspr2_v2(h, t, n, alpha, x, incx, y, incy, a)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy
  real(8), device, dimension(*) :: a, x, y
  real(8), device :: alpha ! device or host variable

2.3.21. dsymv

DSYMV 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是 n 元素向量,A 是 n x n 对称矩阵。

subroutine dsymv(uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: n, lda, incx, incy
  real(8), device, dimension(lda, *) :: a ! device or host variable
  real(8), device, dimension(*) :: x, y ! device or host variable
  real(8), device :: alpha, beta ! device or host variable
subroutine cublasDsymv(uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: n, lda, incx, incy
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x, y
  real(8), device :: alpha, beta ! device or host variable
integer(4) function cublasDsymv_v2(h, uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: n, lda, incx, incy
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x, y
  real(8), device :: alpha, beta ! device or host variable

2.3.22. dsyr

DSYR 执行对称秩 1 运算 A := alpha*x*x**T + A,其中 alpha 是实标量,x 是 n 元素向量,A 是 n x n 对称矩阵。

subroutine dsyr(t, n, alpha, x, incx, a, lda)
  character*1 :: t
  integer :: n, incx, lda
  real(8), device, dimension(lda, *) :: a ! device or host variable
  real(8), device, dimension(*) :: x ! device or host variable
  real(8), device :: alpha ! device or host variable
subroutine cublasDsyr(t, n, alpha, x, incx, a, lda)
  character*1 :: t
  integer :: n, incx, lda
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x
  real(8), device :: alpha ! device or host variable
integer(4) function cublasDsyr_v2(h, t, n, alpha, x, incx, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, lda
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x
  real(8), device :: alpha ! device or host variable

2.3.23. dsyr2

DSYR2 执行对称秩 2 运算 A := alpha*x*y**T + alpha*y*x**T + A,其中 alpha 是标量,x 和 y 是 n 元素向量,A 是 n x n 对称矩阵。

subroutine dsyr2(t, n, alpha, x, incx, y, incy, a, lda)
  character*1 :: t
  integer :: n, incx, incy, lda
  real(8), device, dimension(lda, *) :: a ! device or host variable
  real(8), device, dimension(*) :: x, y ! device or host variable
  real(8), device :: alpha ! device or host variable
subroutine cublasDsyr2(t, n, alpha, x, incx, y, incy, a, lda)
  character*1 :: t
  integer :: n, incx, incy, lda
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x, y
  real(8), device :: alpha ! device or host variable
integer(4) function cublasDsyr2_v2(h, t, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy, lda
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x, y
  real(8), device :: alpha ! device or host variable

2.3.24. dtbmv

DTBMV 执行矩阵-向量运算 x := A*x 或 x := A**T*x 之一,其中 x 是 n 元素向量,A 是具有 ( k + 1 ) 条对角线的 n x n 单位或非单位上或下三角带状矩阵。

subroutine dtbmv(u, t, d, n, k, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, k, incx, lda
  real(8), device, dimension(lda, *) :: a ! device or host variable
  real(8), device, dimension(*) :: x ! device or host variable
subroutine cublasDtbmv(u, t, d, n, k, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, k, incx, lda
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x
integer(4) function cublasDtbmv_v2(h, u, t, d, n, k, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, k, incx, lda
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x

2.3.25. dtbsv

DTBSV 求解方程组 A*x = b 或 A**T*x = b 之一,其中 b 和 x 是 n 元素向量,A 是具有 ( k + 1 ) 条对角线的 n x n 单位或非单位上或下三角带状矩阵。此例程中不包含奇异性或接近奇异性的测试。此类测试必须在此例程调用之前执行。

subroutine dtbsv(u, t, d, n, k, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, k, incx, lda
  real(8), device, dimension(lda, *) :: a ! device or host variable
  real(8), device, dimension(*) :: x ! device or host variable
subroutine cublasDtbsv(u, t, d, n, k, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, k, incx, lda
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x
integer(4) function cublasDtbsv_v2(h, u, t, d, n, k, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, k, incx, lda
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x

2.3.26. dtpmv

DTPMV 执行矩阵-向量运算 x := A*x 或 x := A**T*x 之一,其中 x 是 n 元素向量,A 是以压缩形式提供的 n x n 单位或非单位上或下三角矩阵。

subroutine dtpmv(u, t, d, n, a, x, incx)
  character*1 :: u, t, d
  integer :: n, incx
  real(8), device, dimension(*) :: a, x ! device or host variable
subroutine cublasDtpmv(u, t, d, n, a, x, incx)
  character*1 :: u, t, d
  integer :: n, incx
  real(8), device, dimension(*) :: a, x
integer(4) function cublasDtpmv_v2(h, u, t, d, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx
  real(8), device, dimension(*) :: a, x

2.3.27. dtpsv

DTPSV 求解方程组 A*x = b 或 A**T*x = b 之一,其中 b 和 x 是 n 元素向量,A 是以压缩形式提供的 n x n 单位或非单位上或下三角矩阵。此例程中不包含奇异性或接近奇异性的测试。此类测试必须在此例程调用之前执行。

subroutine dtpsv(u, t, d, n, a, x, incx)
  character*1 :: u, t, d
  integer :: n, incx
  real(8), device, dimension(*) :: a, x ! device or host variable
subroutine cublasDtpsv(u, t, d, n, a, x, incx)
  character*1 :: u, t, d
  integer :: n, incx
  real(8), device, dimension(*) :: a, x
integer(4) function cublasDtpsv_v2(h, u, t, d, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx
  real(8), device, dimension(*) :: a, x

2.3.28. dtrmv

DTRMV 执行矩阵-向量运算 x := A*x 或 x := A**T*x 之一,其中 x 是 n 元素向量,A 是 n x n 单位或非单位上或下三角矩阵。

subroutine dtrmv(u, t, d, n, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, incx, lda
  real(8), device, dimension(lda, *) :: a ! device or host variable
  real(8), device, dimension(*) :: x ! device or host variable
subroutine cublasDtrmv(u, t, d, n, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, incx, lda
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x
integer(4) function cublasDtrmv_v2(h, u, t, d, n, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx, lda
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x

2.3.29. dtrsv

DTRSV 求解方程组 A*x = b 或 A**T*x = b 之一,其中 b 和 x 是 n 元素向量,A 是 n x n 单位或非单位上或下三角矩阵。此例程中不包含奇异性或接近奇异性的测试。此类测试必须在此例程调用之前执行。

subroutine dtrsv(u, t, d, n, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, incx, lda
  real(8), device, dimension(lda, *) :: a ! device or host variable
  real(8), device, dimension(*) :: x ! device or host variable
subroutine cublasDtrsv(u, t, d, n, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, incx, lda
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x
integer(4) function cublasDtrsv_v2(h, u, t, d, n, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx, lda
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x

2.3.30. dgemm

DGEMM 执行矩阵-矩阵运算 C := alpha*op( A )*op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量,A、B 和 C 是矩阵,其中 op( A ) 是 m x k 矩阵,op( B ) 是 k x n 矩阵,C 是 m x n 矩阵。

subroutine dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: transa, transb
  integer :: m, n, k, lda, ldb, ldc
  real(8), device, dimension(lda, *) :: a ! device or host variable
  real(8), device, dimension(ldb, *) :: b ! device or host variable
  real(8), device, dimension(ldc, *) :: c ! device or host variable
  real(8), device :: alpha, beta ! device or host variable
subroutine cublasDgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: transa, transb
  integer :: m, n, k, lda, ldb, ldc
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldb, *) :: b
  real(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha, beta ! device or host variable
integer(4) function cublasDgemm_v2(h, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: transa, transb
  integer :: m, n, k, lda, ldb, ldc
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldb, *) :: b
  real(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha, beta ! device or host variable

2.3.31. dsymm

DSYMM 执行矩阵-矩阵运算 C := alpha*A*B + beta*C 或 C := alpha*B*A + beta*C 之一,其中 alpha 和 beta 是标量,A 是对称矩阵,B 和 C 是 m x n 矩阵。

subroutine dsymm(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: side, uplo
  integer :: m, n, lda, ldb, ldc
  real(8), device, dimension(lda, *) :: a ! device or host variable
  real(8), device, dimension(ldb, *) :: b ! device or host variable
  real(8), device, dimension(ldc, *) :: c ! device or host variable
  real(8), device :: alpha, beta ! device or host variable
subroutine cublasDsymm(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: side, uplo
  integer :: m, n, lda, ldb, ldc
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldb, *) :: b
  real(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha, beta ! device or host variable
integer(4) function cublasDsymm_v2(h, side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo
  integer :: m, n, lda, ldb, ldc
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldb, *) :: b
  real(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha, beta ! device or host variable

2.3.32. dsyrk

DSYRK 执行对称秩 k 运算 C := alpha*A*A**T + beta*C 或 C := alpha*A**T*A + beta*C 之一,其中 alpha 和 beta 是标量,C 是 n x n 对称矩阵,A 在第一种情况下是 n x k 矩阵,在第二种情况下是 k x n 矩阵。

subroutine dsyrk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldc
  real(8), device, dimension(lda, *) :: a ! device or host variable
  real(8), device, dimension(ldc, *) :: c ! device or host variable
  real(8), device :: alpha, beta ! device or host variable
subroutine cublasDsyrk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldc
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha, beta ! device or host variable
integer(4) function cublasDsyrk_v2(h, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldc
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha, beta ! device or host variable

2.3.33. dsyr2k

DSYR2K 执行对称秩 2k 运算 C := alpha*A*B**T + alpha*B*A**T + beta*C 或 C := alpha*A**T*B + alpha*B**T*A + beta*C 之一,其中 alpha 和 beta 是标量,C 是 n x n 对称矩阵,A 和 B 在第一种情况下是 n x k 矩阵,在第二种情况下是 k x n 矩阵。

subroutine dsyr2k(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  real(8), device, dimension(lda, *) :: a ! device or host variable
  real(8), device, dimension(ldb, *) :: b ! device or host variable
  real(8), device, dimension(ldc, *) :: c ! device or host variable
  real(8), device :: alpha, beta ! device or host variable
subroutine cublasDsyr2k(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldb, *) :: b
  real(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha, beta ! device or host variable
integer(4) function cublasDsyr2k_v2(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldb, *) :: b
  real(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha, beta ! device or host variable

2.3.34. dsyrkx

DSYRKX 执行对称秩 k 更新 C := alpha*A*B**T + beta*C 的变体,其中 alpha 和 beta 是标量,C 是以三角下或上三角模式存储的 n x n 对称矩阵,A 和 B 是 n x k 矩阵。当 B 以某种方式使得结果保证对称时,可以使用此例程。有关更多详细信息,请参阅 CUBLAS 文档。

subroutine dsyrkx(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  real(8), device, dimension(lda, *) :: a ! device or host variable
  real(8), device, dimension(ldb, *) :: b ! device or host variable
  real(8), device, dimension(ldc, *) :: c ! device or host variable
  real(8), device :: alpha, beta ! device or host variable
subroutine cublasDsyrkx(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldb, *) :: b
  real(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha, beta ! device or host variable
integer(4) function cublasDsyrkx_v2(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldb, *) :: b
  real(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha, beta ! device or host variable

2.3.35. dtrmm

DTRMM 执行矩阵-矩阵运算 B := alpha*op( A )*B 或 B := alpha*B*op( A ) 之一,其中 alpha 是标量,B 是 m x n 矩阵,A 是单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一。

subroutine dtrmm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  character*1 :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  real(8), device, dimension(lda, *) :: a ! device or host variable
  real(8), device, dimension(ldb, *) :: b ! device or host variable
  real(8), device :: alpha ! device or host variable
subroutine cublasDtrmm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  character*1 :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldb, *) :: b
  real(8), device :: alpha ! device or host variable
integer(4) function cublasDtrmm_v2(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo, transa, diag
  integer :: m, n, lda, ldb, ldc
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldb, *) :: b
  real(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha ! device or host variable

2.3.36. dtrsm

DTRSM 求解矩阵方程 op( A )*X = alpha*B 或 X*op( A ) = alpha*B 之一,其中 alpha 是标量,X 和 B 是 m x n 矩阵,A 是单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一。矩阵 X 在 B 上被覆盖。

subroutine dtrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  character*1 :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  real(8), device, dimension(lda, *) :: a ! device or host variable
  real(8), device, dimension(ldb, *) :: b ! device or host variable
  real(8), device :: alpha ! device or host variable
subroutine cublasDtrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  character*1 :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldb, *) :: b
  real(8), device :: alpha ! device or host variable
integer(4) function cublasDtrsm_v2(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  type(cublasHandle) :: h
  integer :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldb, *) :: b
  real(8), device :: alpha ! device or host variable

2.3.37. cublasDgemvBatched

DGEMV 执行批量矩阵-向量运算 Y := alpha*op( A ) * X + beta*Y,其中 op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一,alpha 和 beta 是标量,A 是 m x n 矩阵,X 和 Y 是向量。

integer(4) function cublasDgemvBatched(h, trans, m, n, alpha, &
      Aarray, lda, xarray, incx, beta, yarray, incy, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: m, n
  real(8), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: xarray(*)
  integer :: incx
  real(8), device :: beta ! device or host variable
  type(c_devptr), device :: yarray(*)
  integer :: incy
  integer :: batchCount
integer(4) function cublasDgemvBatched_v2(h, trans, m, n, alpha, &
      Aarray, lda, xarray, incx, beta, yarray, incy, batchCount)
  type(cublasHandle) :: h
  integer :: trans
  integer :: m, n
  real(8), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: xarray(*)
  integer :: incx
  real(8), device :: beta ! device or host variable
  type(c_devptr), device :: yarray(*)
  integer :: incy
  integer :: batchCount

2.3.38. cublasDgemmBatched

DGEMM 执行矩阵-矩阵运算 C := alpha*op( A )*op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量,A、B 和 C 是矩阵,其中 op( A ) 是 m x k 矩阵,op( B ) 是 k x n 矩阵,C 是 m x n 矩阵。

integer(4) function cublasDgemmBatched(h, transa, transb, m, n, k, alpha, Aarray, lda, Barray, ldb, beta, Carray, ldc, batchCount)
  type(cublasHandle) :: h
  integer :: transa ! integer or character(1) variable
  integer :: transb ! integer or character(1) variable
  integer :: m, n, k
  real(8), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Barray(*)
  integer :: ldb
  real(8), device :: beta ! device or host variable
  type(c_devptr), device :: Carray(*)
  integer :: ldc
  integer :: batchCount
integer(4) function cublasDgemmBatched_v2(h, transa, transb, m, n, k, alpha, &
           Aarray, lda, Barray, ldb, beta, Carray, ldc, batchCount)
  type(cublasHandle) :: h
  integer :: transa
  integer :: transb
  integer :: m, n, k
  real(8), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Barray(*)
  integer :: ldb
  real(8), device :: beta ! device or host variable
  type(c_devptr), device :: Carray(*)
  integer :: ldc
  integer :: batchCount

2.3.39. cublasDgelsBatched

DGELS 使用 A 的 QR 或 LQ 分解求解涉及 M×N 矩阵 A 或其转置的超定或欠定实线性系统。假设 A 具有满秩。提供以下选项:1. 如果 TRANS = ‘N’ 且 m >= n:找到超定系统的最小二乘解,即求解最小二乘问题 minimize || B - A*X ||。2. 如果 TRANS = ‘N’ 且 m < n:找到欠定系统 A * X = B 的最小范数解。3. 如果 TRANS = ‘T’ 且 m >= n:找到欠定系统 A**T * X = B 的最小范数解。4. 如果 TRANS = ‘T’ 且 m < n:找到超定系统的最小二乘解,即求解最小二乘问题 minimize || B - A**T * X ||。可以在单个调用中处理多个右手边向量 b 和解向量 x;它们存储为 M×NRHS 右手边矩阵 B 和 N×NRHS 解矩阵 X 的列。

integer(4) function cublasDgelsBatched(h, trans, m, n, nrhs, Aarray, lda, Carray, ldc, info, devinfo, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: m, n, nrhs
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Carray(*)
  integer :: ldc
  integer :: info(*)
  integer, device :: devinfo(*)
  integer :: batchCount

2.3.40. cublasDgeqrfBatched

DGEQRF 计算实数 M×N 矩阵 A 的 QR 分解:A = Q * R。

integer(4) function cublasDgeqrfBatched(h, m, n, Aarray, lda, Tau, info, batchCount)
  type(cublasHandle) :: h
  integer :: m, n
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Tau(*)
  integer :: info(*)
  integer :: batchCount

2.3.41. cublasDgetrfBatched

DGETRF 使用带行交换的部分主元法计算一般 M×N 矩阵 A 的 LU 分解。分解形式为 A = P * L * U,其中 P 是置换矩阵,L 是具有单位对角线元素的下三角矩阵(如果 m > n,则为下梯形),U 是上三角矩阵(如果 m < n,则为上梯形)。这是算法的右视 Level 3 BLAS 版本。

integer(4) function cublasDgetrfBatched(h, n, Aarray, lda, ipvt, info, batchCount)
  type(cublasHandle) :: h
  integer :: n
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  integer, device :: ipvt(*)
  integer, device :: info(*)
  integer :: batchCount

2.3.42. cublasDgetriBatched

DGETRI 使用 DGETRF 计算的 LU 分解计算矩阵的逆。此方法反转 U,然后通过求解系统 inv(A)*L = inv(U) 来计算 inv(A)。

integer(4) function cublasDgetriBatched(h, n, Aarray, lda, ipvt, Carray, ldc, info, batchCount)
  type(cublasHandle) :: h
  integer :: n
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  integer, device :: ipvt(*)
  type(c_devptr), device :: Carray(*)
  integer :: ldc
  integer, device :: info(*)
  integer :: batchCount

2.3.43. cublasDgetrsBatched

DGETRS 使用 DGETRF 计算的 LU 分解求解具有一般 N×N 矩阵 A 的线性方程组 A * X = B 或 A**T * X = B。

integer(4) function cublasDgetrsBatched(h, trans, n, nrhs, Aarray, lda, ipvt, Barray, ldb, info, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: n, nrhs
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  integer, device :: ipvt(*)
  type(c_devptr), device :: Barray(*)
  integer :: ldb
  integer :: info(*)
  integer :: batchCount

2.3.44. cublasDmatinvBatched

cublasDmatinvBatched 是 cublasDgetrfBatched 加 cublasDgetriBatched 的快捷方式。但是,它仅在 n 小于 32 时有效。否则,用户必须通过 cublasDgetrfBatched 和 cublasDgetriBatched。

integer(4) function cublasDmatinvBatched(h, n, Aarray, lda, Ainv, lda_inv, info, batchCount)
  type(cublasHandle) :: h
  integer :: n
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Ainv(*)
  integer :: lda_inv
  integer, device :: info(*)
  integer :: batchCount

2.3.45. cublasDtrsmBatched

DTRSM 求解矩阵方程 op( A )*X = alpha*B 或 X*op( A ) = alpha*B 之一,其中 alpha 是标量,X 和 B 是 m x n 矩阵,A 是单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一。矩阵 X 在 B 上被覆盖。

integer(4) function cublasDtrsmBatched( h, side, uplo, trans, diag, m, n, alpha, A, lda, B, ldb, batchCount)
  type(cublasHandle) :: h
  integer :: side ! integer or character(1) variable
  integer :: uplo ! integer or character(1) variable
  integer :: trans ! integer or character(1) variable
  integer :: diag ! integer or character(1) variable
  integer :: m, n
  real(8), device :: alpha ! device or host variable
  type(c_devptr), device :: A(*)
  integer :: lda
  type(c_devptr), device :: B(*)
  integer :: ldb
  integer :: batchCount
integer(4) function cublasDtrsmBatched_v2( h, side, uplo, trans, diag, m, n, alpha, A, lda, B, ldb, batchCount)
  type(cublasHandle) :: h
  integer :: side
  integer :: uplo
  integer :: trans
  integer :: diag
  integer :: m, n
  real(8), device :: alpha ! device or host variable
  type(c_devptr), device :: A(*)
  integer :: lda
  type(c_devptr), device :: B(*)
  integer :: ldb
  integer :: batchCount

2.3.46. cublasDgemvStridedBatched

DGEMV 执行批量矩阵-向量运算 Y := alpha*op( A ) * X + beta*Y,其中 op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一,alpha 和 beta 是标量,A 是 m x n 矩阵,X 和 Y 是向量。

integer(4) function cublasDgemvStridedBatched(h, trans, m, n, alpha, &
      A, lda, strideA, X, incx, strideX, beta, Y, incy, strideY, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: m, n
  real(8), device :: alpha ! device or host variable
  real(8), device :: A(lda,*)
  integer :: lda
  integer(8) :: strideA
  real(8), device :: X(*)
  integer :: incx
  integer(8) :: strideX
  real(8), device :: beta ! device or host variable
  real(8), device :: Y(*)
  integer :: incy
  integer(8) :: strideY
  integer :: batchCount
integer(4) function cublasDgemvStridedBatched_v2(h, trans, m, n, alpha, &
      A, lda, strideA, X, incx, strideX, beta, Y, incy, strideY, batchCount)
  type(cublasHandle) :: h
  integer :: trans
  integer :: m, n
  real(8), device :: alpha ! device or host variable
  real(8), device :: A(lda,*)
  integer :: lda
  integer(8) :: strideA
  real(8), device :: X(*)
  integer :: incx
  integer(8) :: strideX
  real(8), device :: beta ! device or host variable
  real(8), device :: Y(*)
  integer :: incy
  integer(8) :: strideY
  integer :: batchCount

2.3.47. cublasDgemmStridedBatched

DGEMM 执行矩阵-矩阵运算 C := alpha*op( A )*op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量,A、B 和 C 是矩阵,其中 op( A ) 是 m x k 矩阵,op( B ) 是 k x n 矩阵,C 是 m x n 矩阵。

integer(4) function cublasDgemmStridedBatched(h, transa, transb, m, n, k, alpha, Aarray, lda, strideA, Barray, ldb, strideB, beta, Carray, ldc, strideC, batchCount)
  type(cublasHandle) :: h
  integer :: transa ! integer or character(1) variable
  integer :: transb ! integer or character(1) variable
  integer :: m, n, k
  real(8), device :: alpha ! device or host variable
  real(8), device :: Aarray(*)
  integer :: lda
  integer :: strideA
  real(8), device :: Barray(*)
  integer :: ldb
  integer :: strideB
  real(8), device :: beta ! device or host variable
  real(8), device :: Carray(*)
  integer :: ldc
  integer :: strideC
  integer :: batchCount
integer(4) function cublasDgemmStridedBatched_v2(h, transa, transb, m, n, k, alpha, &
           Aarray, lda, strideA, Barray, ldb, strideB, beta, Carray, ldc, strideC, batchCount)
  type(cublasHandle) :: h
  integer :: transa
  integer :: transb
  integer :: m, n, k
  real(8), device :: alpha ! device or host variable
  real(8), device :: Aarray(*)
  integer :: lda
  integer :: strideA
  real(8), device :: Barray(*)
  integer :: ldb
  integer :: strideB
  real(8), device :: beta ! device or host variable
  real(8), device :: Carray(*)
  integer :: ldc
  integer :: strideC
  integer :: batchCount

2.4. 单精度复数函数和子例程

本节包含单精度复数 BLAS 和 cuBLAS 函数和子例程的接口。

2.4.1. icamax

ICAMAX 查找具有最大绝对值的元素的索引。

integer(4) function icamax(n, x, incx)
  integer :: n
  complex(4), device, dimension(*) :: x ! device or host variable
  integer :: incx
integer(4) function cublasIcamax(n, x, incx)
  integer :: n
  complex(4), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasIcamax_v2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device, dimension(*) :: x
  integer :: incx
  integer, device :: res ! device or host variable

2.4.2. icamin

ICAMIN 查找具有最小绝对值的元素的索引。

integer(4) function icamin(n, x, incx)
  integer :: n
  complex(4), device, dimension(*) :: x ! device or host variable
  integer :: incx
integer(4) function cublasIcamin(n, x, incx)
  integer :: n
  complex(4), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasIcamin_v2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device, dimension(*) :: x
  integer :: incx
  integer, device :: res ! device or host variable

2.4.3. scasum

SCASUM 计算复数向量的绝对值之和,并返回单精度结果。

real(4) function scasum(n, x, incx)
  integer :: n
  complex(4), device, dimension(*) :: x ! device or host variable
  integer :: incx
real(4) function cublasScasum(n, x, incx)
  integer :: n
  complex(4), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasScasum_v2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device, dimension(*) :: x
  integer :: incx
  real(4), device :: res ! device or host variable

2.4.4. caxpy

CAXPY 常数乘以向量加上向量。

subroutine caxpy(n, a, x, incx, y, incy)
  integer :: n
  complex(4), device :: a ! device or host variable
  complex(4), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasCaxpy(n, a, x, incx, y, incy)
  integer :: n
  complex(4), device :: a ! device or host variable
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasCaxpy_v2(h, n, a, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device :: a ! device or host variable
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.4.5. ccopy

CCOPY 将向量 x 复制到向量 y。

subroutine ccopy(n, x, incx, y, incy)
  integer :: n
  complex(4), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasCcopy(n, x, incx, y, incy)
  integer :: n
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasCcopy_v2(h, n, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.4.6. cdotc

形成两个向量的点积,共轭第一个向量。

complex(4) function cdotc(n, x, incx, y, incy)
  integer :: n
  complex(4), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
complex(4) function cublasCdotc(n, x, incx, y, incy)
  integer :: n
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasCdotc_v2(h, n, x, incx, y, incy, res)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy
  complex(4), device :: res ! device or host variable

2.4.7. cdotu

CDOTU 形成两个向量的点积。

complex(4) function cdotu(n, x, incx, y, incy)
  integer :: n
  complex(4), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
complex(4) function cublasCdotu(n, x, incx, y, incy)
  integer :: n
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasCdotu_v2(h, n, x, incx, y, incy, res)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy
  complex(4), device :: res ! device or host variable

2.4.8. scnrm2

SCNRM2 通过函数名称返回向量的欧几里得范数,因此 SCNRM2 := sqrt( x**H*x )

real(4) function scnrm2(n, x, incx)
  integer :: n
  complex(4), device, dimension(*) :: x ! device or host variable
  integer :: incx
real(4) function cublasScnrm2(n, x, incx)
  integer :: n
  complex(4), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasScnrm2_v2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device, dimension(*) :: x
  integer :: incx
  real(4), device :: res ! device or host variable

2.4.9. crot

CROT 应用平面旋转,其中余弦 (C) 为实数,正弦 (S) 为复数,向量 CX 和 CY 为复数。

subroutine crot(n, x, incx, y, incy, sc, ss)
  integer :: n
  real(4), device :: sc ! device or host variable
  complex(4), device :: ss ! device or host variable
  complex(4), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasCrot(n, x, incx, y, incy, sc, ss)
  integer :: n
  real(4), device :: sc ! device or host variable
  complex(4), device :: ss ! device or host variable
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasCrot_v2(h, n, x, incx, y, incy, sc, ss)
  type(cublasHandle) :: h
  integer :: n
  real(4), device :: sc ! device or host variable
  complex(4), device :: ss ! device or host variable
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.4.10. csrot

CSROT 应用平面旋转,其中余弦和正弦(c 和 s)为实数,向量 cx 和 cy 为复数。

subroutine csrot(n, x, incx, y, incy, sc, ss)
  integer :: n
  real(4), device :: sc, ss ! device or host variable
  complex(4), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasCsrot(n, x, incx, y, incy, sc, ss)
  integer :: n
  real(4), device :: sc, ss ! device or host variable
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasCsrot_v2(h, n, x, incx, y, incy, sc, ss)
  type(cublasHandle) :: h
  integer :: n
  real(4), device :: sc, ss ! device or host variable
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.4.11. crotg

CROTG 确定复数 Givens 旋转。

subroutine crotg(sa, sb, sc, ss)
  complex(4), device :: sa, sb, ss ! device or host variable
  real(4), device :: sc ! device or host variable
subroutine cublasCrotg(sa, sb, sc, ss)
  complex(4), device :: sa, sb, ss ! device or host variable
  real(4), device :: sc ! device or host variable
integer(4) function cublasCrotg_v2(h, sa, sb, sc, ss)
  type(cublasHandle) :: h
  complex(4), device :: sa, sb, ss ! device or host variable
  real(4), device :: sc ! device or host variable

2.4.12. cscal

CSCAL 用常数缩放向量。

subroutine cscal(n, a, x, incx)
  integer :: n
  complex(4), device :: a ! device or host variable
  complex(4), device, dimension(*) :: x ! device or host variable
  integer :: incx
subroutine cublasCscal(n, a, x, incx)
  integer :: n
  complex(4), device :: a ! device or host variable
  complex(4), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasCscal_v2(h, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device :: a ! device or host variable
  complex(4), device, dimension(*) :: x
  integer :: incx

2.4.13. csscal

CSSCAL 用实数常数缩放复数向量。

subroutine csscal(n, a, x, incx)
  integer :: n
  real(4), device :: a ! device or host variable
  complex(4), device, dimension(*) :: x ! device or host variable
  integer :: incx
subroutine cublasCsscal(n, a, x, incx)
  integer :: n
  real(4), device :: a ! device or host variable
  complex(4), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasCsscal_v2(h, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: n
  real(4), device :: a ! device or host variable
  complex(4), device, dimension(*) :: x
  integer :: incx

2.4.14. cswap

CSWAP 交换两个向量。

subroutine cswap(n, x, incx, y, incy)
  integer :: n
  complex(4), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasCswap(n, x, incx, y, incy)
  integer :: n
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasCswap_v2(h, n, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.4.15. cgbmv

CGBMV 执行矩阵-向量运算 y := alpha*A*x + beta*y 或 y := alpha*A**T*x + beta*y 或 y := alpha*A**H*x + beta*y 之一,其中 alpha 和 beta 是标量,x 和 y 是向量,A 是具有 kl 条子对角线和 ku 条超对角线的 m x n 带状矩阵。

subroutine cgbmv(t, m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: m, n, kl, ku, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(*) :: x, y ! device or host variable
  complex(4), device :: alpha, beta ! device or host variable
subroutine cublasCgbmv(t, m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: m, n, kl, ku, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha, beta ! device or host variable
integer(4) function cublasCgbmv_v2(h, t, m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: m, n, kl, ku, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha, beta ! device or host variable

2.4.16. cgemv

CGEMV 执行矩阵-向量运算 y := alpha*A*x + beta*y 或 y := alpha*A**T*x + beta*y 或 y := alpha*A**H*x + beta*y 之一,其中 alpha 和 beta 是标量,x 和 y 是向量,A 是 m x n 矩阵。

subroutine cgemv(t, m, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: m, n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(*) :: x, y ! device or host variable
  complex(4), device :: alpha, beta ! device or host variable
subroutine cublasCgemv(t, m, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: m, n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha, beta ! device or host variable
integer(4) function cublasCgemv_v2(h, t, m, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: m, n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha, beta ! device or host variable

2.4.17. cgerc

CGERC 执行秩 1 运算 A := alpha*x*y**H + A,其中 alpha 是标量,x 是 m 元素向量,y 是 n 元素向量,A 是 m x n 矩阵。

subroutine cgerc(m, n, alpha, x, incx, y, incy, a, lda)
  integer :: m, n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(*) :: x, y ! device or host variable
  complex(4), device :: alpha ! device or host variable
subroutine cublasCgerc(m, n, alpha, x, incx, y, incy, a, lda)
  integer :: m, n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha ! device or host variable
integer(4) function cublasCgerc_v2(h, m, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: m, n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha ! device or host variable

2.4.18. cgeru

CGERU 执行秩 1 运算 A := alpha*x*y**T + A,其中 alpha 是标量,x 是 m 元素向量,y 是 n 元素向量,A 是 m x n 矩阵。

subroutine cgeru(m, n, alpha, x, incx, y, incy, a, lda)
  integer :: m, n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(*) :: x, y ! device or host variable
  complex(4), device :: alpha ! device or host variable
subroutine cublasCgeru(m, n, alpha, x, incx, y, incy, a, lda)
  integer :: m, n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha ! device or host variable
integer(4) function cublasCgeru_v2(h, m, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: m, n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha ! device or host variable

2.4.19. csymv

CSYMV 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是 n 元素向量,A 是 n x n 对称矩阵。

subroutine csymv(uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(*) :: x, y ! device or host variable
  complex(4), device :: alpha, beta ! device or host variable
subroutine cublasCsymv(uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha, beta ! device or host variable
integer(4) function cublasCsymv_v2(h, uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha, beta ! device or host variable

2.4.20. csyr

CSYR 执行对称秩 1 运算 A := alpha*x*x**H + A,其中 alpha 是复数标量,x 是 n 元素向量,A 是 n x n 对称矩阵。

subroutine csyr(t, n, alpha, x, incx, a, lda)
  character*1 :: t
  integer :: n, incx, lda
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(*) :: x ! device or host variable
  complex(4), device :: alpha ! device or host variable
subroutine cublasCsyr(t, n, alpha, x, incx, a, lda)
  character*1 :: t
  integer :: n, incx, lda
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x
  complex(4), device :: alpha ! device or host variable
integer(4) function cublasCsyr_v2(h, t, n, alpha, x, incx, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, lda
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x
  complex(4), device :: alpha ! device or host variable

2.4.21. csyr2

CSYR2 执行对称秩 2 运算 A := alpha*x*y’ + alpha*y*x’ + A,其中 alpha 是复数标量,x 和 y 是 n 元素向量,A 是 n x n SY 矩阵。

subroutine csyr2(t, n, alpha, x, incx, y, incy, a, lda)
  character*1 :: t
  integer :: n, incx, incy, lda
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(*) :: x, y ! device or host variable
  complex(4), device :: alpha ! device or host variable
subroutine cublasCsyr2(t, n, alpha, x, incx, y, incy, a, lda)
  character*1 :: t
  integer :: n, incx, incy, lda
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha ! device or host variable
integer(4) function cublasCsyr2_v2(h, t, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy, lda
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha ! device or host variable

2.4.22. ctbmv

CTBMV 执行矩阵-向量运算 x := A*x, 或 x := A**T*x, 或 x := A**H*x 之一,其中 x 是一个 n 元素向量,A 是一个 n 乘 n 单位或非单位上或下三角带状矩阵,具有 ( k + 1 ) 条对角线。

subroutine ctbmv(u, t, d, n, k, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, k, incx, lda
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(*) :: x ! device or host variable
subroutine cublasCtbmv(u, t, d, n, k, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, k, incx, lda
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x
integer(4) function cublasCtbmv_v2(h, u, t, d, n, k, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, k, incx, lda
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x

2.4.23. ctbsv

CTBSV 求解线性方程组 A*x = b, 或 A**T*x = b, 或 A**H*x = b 之一,其中 b 和 x 是 n 元素向量,A 是一个 n 乘 n 单位或非单位上或下三角带状矩阵,具有 ( k + 1 ) 条对角线。此例程中不包含奇异性或近奇异性测试。此类测试必须在调用此例程之前执行。

subroutine ctbsv(u, t, d, n, k, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, k, incx, lda
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(*) :: x ! device or host variable
subroutine cublasCtbsv(u, t, d, n, k, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, k, incx, lda
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x
integer(4) function cublasCtbsv_v2(h, u, t, d, n, k, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, k, incx, lda
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x

2.4.24. ctpmv

CTPMV 执行矩阵-向量运算 x := A*x, 或 x := A**T*x, 或 x := A**H*x 之一,其中 x 是一个 n 元素向量,A 是一个 n 乘 n 单位或非单位上或下三角矩阵,以压缩形式提供。

subroutine ctpmv(u, t, d, n, a, x, incx)
  character*1 :: u, t, d
  integer :: n, incx
  complex(4), device, dimension(*) :: a, x ! device or host variable
subroutine cublasCtpmv(u, t, d, n, a, x, incx)
  character*1 :: u, t, d
  integer :: n, incx
  complex(4), device, dimension(*) :: a, x
integer(4) function cublasCtpmv_v2(h, u, t, d, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx
  complex(4), device, dimension(*) :: a, x

2.4.25. ctpsv

CTPSV 求解线性方程组 A*x = b, 或 A**T*x = b, 或 A**H*x = b 之一,其中 b 和 x 是 n 元素向量,A 是一个 n 乘 n 单位或非单位上或下三角矩阵,以压缩形式提供。此例程中不包含奇异性或近奇异性测试。此类测试必须在调用此例程之前执行。

subroutine ctpsv(u, t, d, n, a, x, incx)
  character*1 :: u, t, d
  integer :: n, incx
  complex(4), device, dimension(*) :: a, x ! device or host variable
subroutine cublasCtpsv(u, t, d, n, a, x, incx)
  character*1 :: u, t, d
  integer :: n, incx
  complex(4), device, dimension(*) :: a, x
integer(4) function cublasCtpsv_v2(h, u, t, d, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx
  complex(4), device, dimension(*) :: a, x

2.4.26. ctrmv

CTRMV 执行矩阵-向量运算 x := A*x, 或 x := A**T*x, 或 x := A**H*x 之一,其中 x 是一个 n 元素向量,A 是一个 n 乘 n 单位或非单位上或下三角矩阵。

subroutine ctrmv(u, t, d, n, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, incx, lda
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(*) :: x ! device or host variable
subroutine cublasCtrmv(u, t, d, n, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, incx, lda
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x
integer(4) function cublasCtrmv_v2(h, u, t, d, n, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx, lda
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x

2.4.27. ctrsv

CTRSV 求解线性方程组 A*x = b, 或 A**T*x = b, 或 A**H*x = b 之一,其中 b 和 x 是 n 元素向量,A 是一个 n 乘 n 单位或非单位上或下三角矩阵。此例程中不包含奇异性或近奇异性测试。此类测试必须在调用此例程之前执行。

subroutine ctrsv(u, t, d, n, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, incx, lda
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(*) :: x ! device or host variable
subroutine cublasCtrsv(u, t, d, n, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, incx, lda
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x
integer(4) function cublasCtrsv_v2(h, u, t, d, n, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx, lda
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x

2.4.28. chbmv

CHBMV 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是 n 元素向量,A 是一个 n 乘 n 埃尔米特带状矩阵,具有 k 条超对角线。

subroutine chbmv(uplo, n, k, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: k, n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(*) :: x, y ! device or host variable
  complex(4), device :: alpha, beta ! device or host variable
subroutine cublasChbmv(uplo, n, k, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: k, n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha, beta ! device or host variable
integer(4) function cublasChbmv_v2(h, uplo, n, k, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: k, n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha, beta ! device or host variable

2.4.29. chemv

CHEMV 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是 n 元素向量,A 是一个 n 乘 n 埃尔米特矩阵。

subroutine chemv(uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(*) :: x, y ! device or host variable
  complex(4), device :: alpha, beta ! device or host variable
subroutine cublasChemv(uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha, beta ! device or host variable
integer(4) function cublasChemv_v2(h, uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha, beta ! device or host variable

2.4.30. chpmv

CHPMV 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是 n 元素向量,A 是一个 n 乘 n 埃尔米特矩阵,以压缩形式提供。

subroutine chpmv(uplo, n, alpha, a, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: n, incx, incy
  complex(4), device, dimension(*) :: a, x, y ! device or host variable
  complex(4), device :: alpha, beta ! device or host variable
subroutine cublasChpmv(uplo, n, alpha, a, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: n, incx, incy
  complex(4), device, dimension(*) :: a, x, y
  complex(4), device :: alpha, beta ! device or host variable
integer(4) function cublasChpmv_v2(h, uplo, n, alpha, a, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: n, incx, incy
  complex(4), device, dimension(*) :: a, x, y
  complex(4), device :: alpha, beta ! device or host variable

2.4.31. cher

CHER 执行埃尔米特秩 1 运算 A := alpha*x*x**H + A,其中 alpha 是一个实标量,x 是一个 n 元素向量,A 是一个 n 乘 n 埃尔米特矩阵。

subroutine cher(t, n, alpha, x, incx, a, lda)
  character*1 :: t
  integer :: n, incx, lda
  complex(4), device, dimension(*) :: a, x ! device or host variable
  real(4), device :: alpha ! device or host variable
subroutine cublasCher(t, n, alpha, x, incx, a, lda)
  character*1 :: t
  integer :: n, incx, lda
  complex(4), device, dimension(*) :: a, x
  real(4), device :: alpha ! device or host variable
integer(4) function cublasCher_v2(h, t, n, alpha, x, incx, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, lda
  complex(4), device, dimension(*) :: a, x
  real(4), device :: alpha ! device or host variable

2.4.32. cher2

CHER2 执行埃尔米特秩 2 运算 A := alpha*x*y**H + conjg( alpha )*y*x**H + A,其中 alpha 是一个标量,x 和 y 是 n 元素向量,A 是一个 n 乘 n 埃尔米特矩阵。

subroutine cher2(t, n, alpha, x, incx, y, incy, a, lda)
  character*1 :: t
  integer :: n, incx, incy, lda
  complex(4), device, dimension(*) :: a, x, y ! device or host variable
  complex(4), device :: alpha ! device or host variable
subroutine cublasCher2(t, n, alpha, x, incx, y, incy, a, lda)
  character*1 :: t
  integer :: n, incx, incy, lda
  complex(4), device, dimension(*) :: a, x, y
  complex(4), device :: alpha ! device or host variable
integer(4) function cublasCher2_v2(h, t, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy, lda
  complex(4), device, dimension(*) :: a, x, y
  complex(4), device :: alpha ! device or host variable

2.4.33. chpr

CHPR 执行埃尔米特秩 1 运算 A := alpha*x*x**H + A,其中 alpha 是一个实标量,x 是一个 n 元素向量,A 是一个 n 乘 n 埃尔米特矩阵,以压缩形式提供。

subroutine chpr(t, n, alpha, x, incx, a)
  character*1 :: t
  integer :: n, incx
  complex(4), device, dimension(*) :: a, x ! device or host variable
  real(4), device :: alpha ! device or host variable
subroutine cublasChpr(t, n, alpha, x, incx, a)
  character*1 :: t
  integer :: n, incx
  complex(4), device, dimension(*) :: a, x
  real(4), device :: alpha ! device or host variable
integer(4) function cublasChpr_v2(h, t, n, alpha, x, incx, a)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx
  complex(4), device, dimension(*) :: a, x
  real(4), device :: alpha ! device or host variable

2.4.34. chpr2

CHPR2 执行埃尔米特秩 2 运算 A := alpha*x*y**H + conjg( alpha )*y*x**H + A,其中 alpha 是一个标量,x 和 y 是 n 元素向量,A 是一个 n 乘 n 埃尔米特矩阵,以压缩形式提供。

subroutine chpr2(t, n, alpha, x, incx, y, incy, a)
  character*1 :: t
  integer :: n, incx, incy
  complex(4), device, dimension(*) :: a, x, y ! device or host variable
  complex(4), device :: alpha ! device or host variable
subroutine cublasChpr2(t, n, alpha, x, incx, y, incy, a)
  character*1 :: t
  integer :: n, incx, incy
  complex(4), device, dimension(*) :: a, x, y
  complex(4), device :: alpha ! device or host variable
integer(4) function cublasChpr2_v2(h, t, n, alpha, x, incx, y, incy, a)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy
  complex(4), device, dimension(*) :: a, x, y
  complex(4), device :: alpha ! device or host variable

2.4.35. cgemm

CGEMM 执行矩阵-矩阵运算 C := alpha*op( A )*op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 或 op( X ) = X**H 之一,alpha 和 beta 是标量,A、B 和 C 是矩阵,其中 op( A ) 是一个 m 乘 k 矩阵,op( B ) 是一个 k 乘 n 矩阵,C 是一个 m 乘 n 矩阵。

subroutine cgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: transa, transb
  integer :: m, n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(ldb, *) :: b ! device or host variable
  complex(4), device, dimension(ldc, *) :: c ! device or host variable
  complex(4), device :: alpha, beta ! device or host variable
subroutine cublasCgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: transa, transb
  integer :: m, n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha, beta ! device or host variable
integer(4) function cublasCgemm_v2(h, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: transa, transb
  integer :: m, n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha, beta ! device or host variable

2.4.36. csymm

CSYMM 执行矩阵-矩阵运算 C := alpha*A*B + beta*C 或 C := alpha*B*A + beta*C 之一,其中 alpha 和 beta 是标量,A 是一个对称矩阵,B 和 C 是 m 乘 n 矩阵。

subroutine csymm(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: side, uplo
  integer :: m, n, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(ldb, *) :: b ! device or host variable
  complex(4), device, dimension(ldc, *) :: c ! device or host variable
  complex(4), device :: alpha, beta ! device or host variable
subroutine cublasCsymm(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: side, uplo
  integer :: m, n, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha, beta ! device or host variable
integer(4) function cublasCsymm_v2(h, side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo
  integer :: m, n, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha, beta ! device or host variable

2.4.37. csyrk

CSYRK 执行对称秩 k 运算 C := alpha*A*A**T + beta*C 或 C := alpha*A**T*A + beta*C 之一,其中 alpha 和 beta 是标量,C 是一个 n 乘 n 对称矩阵,A 在第一种情况下是一个 n 乘 k 矩阵,在第二种情况下是一个 k 乘 n 矩阵。

subroutine csyrk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldc
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(ldc, *) :: c ! device or host variable
  complex(4), device :: alpha, beta ! device or host variable
subroutine cublasCsyrk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha, beta ! device or host variable
integer(4) function cublasCsyrk_v2(h, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha, beta ! device or host variable

2.4.38. csyr2k

CSYR2K 执行对称秩 2k 运算 C := alpha*A*B**T + alpha*B*A**T + beta*C 或 C := alpha*A**T*B + alpha*B**T*A + beta*C 之一,其中 alpha 和 beta 是标量,C 是一个 n 乘 n 对称矩阵,A 和 B 在第一种情况下是 n 乘 k 矩阵,在第二种情况下是 k 乘 n 矩阵。

subroutine csyr2k(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(ldb, *) :: b ! device or host variable
  complex(4), device, dimension(ldc, *) :: c ! device or host variable
  complex(4), device :: alpha, beta ! device or host variable
subroutine cublasCsyr2k(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha, beta ! device or host variable
integer(4) function cublasCsyr2k_v2(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha, beta ! device or host variable

2.4.39. csyrkx

CSYRKX 执行对称秩 k 更新 C := alpha*A*B**T + beta*C 的变体,其中 alpha 和 beta 是标量,C 是一个以 lower 或 upper 模式存储的 n 乘 n 对称矩阵,A 和 B 是 n 乘 k 矩阵。当 B 以某种方式使得结果保证对称时,可以使用此例程。有关更多详细信息,请参阅 CUBLAS 文档。

subroutine csyrkx(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(ldb, *) :: b ! device or host variable
  complex(4), device, dimension(ldc, *) :: c ! device or host variable
  complex(4), device :: alpha, beta ! device or host variable
subroutine cublasCsyrkx(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha, beta ! device or host variable
integer(4) function cublasCsyrkx_v2(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha, beta ! device or host variable

2.4.40. ctrmm

CTRMM 执行矩阵-矩阵运算 B := alpha*op( A )*B 或 B := alpha*B*op( A ) 之一,其中 alpha 是一个标量,B 是一个 m 乘 n 矩阵,A 是一个单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 或 op( A ) = A**H 之一。

subroutine ctrmm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  character*1 :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(ldb, *) :: b ! device or host variable
  complex(4), device :: alpha ! device or host variable
subroutine cublasCtrmm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  character*1 :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device :: alpha ! device or host variable
integer(4) function cublasCtrmm_v2(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo, transa, diag
  integer :: m, n, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha ! device or host variable

2.4.41. ctrsm

CTRSM 求解矩阵方程 op( A )*X = alpha*B 或 X*op( A ) = alpha*B 之一,其中 alpha 是一个标量,X 和 B 是 m 乘 n 矩阵,A 是一个单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 或 op( A ) = A**H 之一。矩阵 X 在 B 上被覆盖。

subroutine ctrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  character*1 :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(ldb, *) :: b ! device or host variable
  complex(4), device :: alpha ! device or host variable
subroutine cublasCtrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  character*1 :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device :: alpha ! device or host variable
integer(4) function cublasCtrsm_v2(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  type(cublasHandle) :: h
  integer :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device :: alpha ! device or host variable

2.4.42. chemm

CHEMM 执行矩阵-矩阵运算 C := alpha*A*B + beta*C 或 C := alpha*B*A + beta*C 之一,其中 alpha 和 beta 是标量,A 是一个埃尔米特矩阵,B 和 C 是 m 乘 n 矩阵。

subroutine chemm(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: side, uplo
  integer :: m, n, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(ldb, *) :: b ! device or host variable
  complex(4), device, dimension(ldc, *) :: c ! device or host variable
  complex(4), device :: alpha, beta ! device or host variable
subroutine cublasChemm(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: side, uplo
  integer :: m, n, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha, beta ! device or host variable
integer(4) function cublasChemm_v2(h, side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo
  integer :: m, n, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha, beta ! device or host variable

2.4.43. cherk

CHERK 执行埃尔米特秩 k 运算 C := alpha*A*A**H + beta*C 或 C := alpha*A**H*A + beta*C 之一,其中 alpha 和 beta 是实标量,C 是一个 n 乘 n 埃尔米特矩阵,A 在第一种情况下是一个 n 乘 k 矩阵,在第二种情况下是一个 k 乘 n 矩阵。

subroutine cherk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldc
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(ldc, *) :: c ! device or host variable
  real(4), device :: alpha, beta ! device or host variable
subroutine cublasCherk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldc, *) :: c
  real(4), device :: alpha, beta ! device or host variable
integer(4) function cublasCherk_v2(h, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldc, *) :: c
  real(4), device :: alpha, beta ! device or host variable

2.4.44. cher2k

CHER2K 执行埃尔米特秩 2k 运算 C := alpha*A*B**H + conjg( alpha )*B*A**H + beta*C 或 C := alpha*A**H*B + conjg( alpha )*B**H*A + beta*C 之一,其中 alpha 和 beta 是标量,beta 是实数,C 是一个 n 乘 n 埃尔米特矩阵,A 和 B 在第一种情况下是 n 乘 k 矩阵,在第二种情况下是 k 乘 n 矩阵。

subroutine cher2k(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(ldb, *) :: b ! device or host variable
  complex(4), device, dimension(ldc, *) :: c ! device or host variable
  complex(4), device :: alpha ! device or host variable
  real(4), device :: beta ! device or host variable
subroutine cublasCher2k(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha ! device or host variable
  real(4), device :: beta ! device or host variable
integer(4) function cublasCher2k_v2(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha ! device or host variable
  real(4), device :: beta ! device or host variable

2.4.45. cherkx

CHERKX 执行埃尔米特秩 k 运算 C := alpha*A*B**H + beta*C 的变体,其中 alpha 和 beta 是实标量,C 是一个以 lower 或 upper 模式存储的 n 乘 n 埃尔米特矩阵,A 和 B 是 n 乘 k 矩阵。有关更多详细信息,请参阅 CUBLAS 文档。

subroutine cherkx(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a ! device or host variable
  complex(4), device, dimension(ldb, *) :: b ! device or host variable
  complex(4), device, dimension(ldc, *) :: c ! device or host variable
  complex(4), device :: alpha ! device or host variable
  real(4), device :: beta ! device or host variable
subroutine cublasCherkx(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha ! device or host variable
  real(4), device :: beta ! device or host variable
integer(4) function cublasCherkx_v2(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha ! device or host variable
  real(4), device :: beta ! device or host variable

2.4.46. cublasCgemvBatched

CGEMV 执行批量矩阵-向量运算 Y := alpha*op( A ) * X + beta*Y,其中 op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一,alpha 和 beta 是标量,A 是一个 m 乘 n 矩阵,X 和 Y 是向量。

integer(4) function cublasCgemvBatched(h, trans, m, n, alpha, &
      Aarray, lda, xarray, incx, beta, yarray, incy, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: m, n
  complex(4), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: xarray(*)
  integer :: incx
  complex(4), device :: beta ! device or host variable
  type(c_devptr), device :: yarray(*)
  integer :: incy
  integer :: batchCount
integer(4) function cublasCgemvBatched_v2(h, trans, m, n, alpha, &
      Aarray, lda, xarray, incx, beta, yarray, incy, batchCount)
  type(cublasHandle) :: h
  integer :: trans
  integer :: m, n
  complex(4), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: xarray(*)
  integer :: incx
  complex(4), device :: beta ! device or host variable
  type(c_devptr), device :: yarray(*)
  integer :: incy
  integer :: batchCount

2.4.47. cublasCgemmBatched

CGEMM 执行矩阵-矩阵运算 C := alpha*op( A )*op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 或 op( X ) = X**H 之一,alpha 和 beta 是标量,A、B 和 C 是矩阵,其中 op( A ) 是一个 m 乘 k 矩阵,op( B ) 是一个 k 乘 n 矩阵,C 是一个 m 乘 n 矩阵。

integer(4) function cublasCgemmBatched(h, transa, transb, m, n, k, alpha, Aarray, lda, Barray, ldb, beta, Carray, ldc, batchCount)
  type(cublasHandle) :: h
  integer :: transa ! integer or character(1) variable
  integer :: transb ! integer or character(1) variable
  integer :: m, n, k
  complex(4), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Barray(*)
  integer :: ldb
  complex(4), device :: beta ! device or host variable
  type(c_devptr), device :: Carray(*)
  integer :: ldc
  integer :: batchCount
integer(4) function cublasCgemmBatched_v2(h, transa, transb, m, n, k, alpha, &
           Aarray, lda, Barray, ldb, beta, Carray, ldc, batchCount)
  type(cublasHandle) :: h
  integer :: transa
  integer :: transb
  integer :: m, n, k
  complex(4), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Barray(*)
  integer :: ldb
  complex(4), device :: beta ! device or host variable
  type(c_devptr), device :: Carray(*)
  integer :: ldc
  integer :: batchCount

2.4.48. cublasCgelsBatched

CGELS 使用 A 的 QR 或 LQ 分解,求解涉及 M 乘 N 矩阵 A 或其共轭转置的超定或欠定复线性系统。假设 A 具有满秩。提供以下选项:1. 如果 TRANS = ‘N’ 且 m >= n:找到超定系统的最小二乘解,即,求解最小二乘问题 minimize || B - A*X ||。2. 如果 TRANS = ‘N’ 且 m < n:找到欠定系统 A * X = B 的最小范数解。3. 如果 TRANS = ‘C’ 且 m >= n:找到欠定系统 A**H * X = B 的最小范数解。4. 如果 TRANS = ‘C’ 且 m < n:找到超定系统的最小二乘解,即,求解最小二乘问题 minimize || B - A**H * X ||。可以在单个调用中处理多个右手边向量 b 和解向量 x;它们存储为 M 乘 NRHS 右手边矩阵 B 和 N 乘 NRHS 解矩阵 X 的列。

integer(4) function cublasCgelsBatched(h, trans, m, n, nrhs, Aarray, lda, Carray, ldc, info, devinfo, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: m, n, nrhs
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Carray(*)
  integer :: ldc
  integer :: info(*)
  integer, device :: devinfo(*)
  integer :: batchCount

2.4.49. cublasCgeqrfBatched

CGEQRF 计算复数 M 乘 N 矩阵 A 的 QR 分解:A = Q * R。

integer(4) function cublasCgeqrfBatched(h, m, n, Aarray, lda, Tau, info, batchCount)
  type(cublasHandle) :: h
  integer :: m, n
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Tau(*)
  integer :: info(*)
  integer :: batchCount

2.4.50. cublasCgetrfBatched

CGETRF 使用行交换的部分主元法计算一般 M 乘 N 矩阵 A 的 LU 分解。分解形式为 A = P * L * U,其中 P 是置换矩阵,L 是具有单位对角线元素的下三角矩阵(如果 m > n,则为下梯形矩阵),U 是上三角矩阵(如果 m < n,则为上梯形矩阵)。这是算法的 right-looking Level 3 BLAS 版本。

integer(4) function cublasCgetrfBatched(h, n, Aarray, lda, ipvt, info, batchCount)
  type(cublasHandle) :: h
  integer :: n
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  integer, device :: ipvt(*)
  integer, device :: info(*)
  integer :: batchCount

2.4.51. cublasCgetriBatched

CGETRI 使用 CGETRF 计算的 LU 分解来计算矩阵的逆矩阵。此方法反转 U,然后通过求解方程组 inv(A)*L = inv(U) 来计算 inv(A)。

integer(4) function cublasCgetriBatched(h, n, Aarray, lda, ipvt, Carray, ldc, info, batchCount)
  type(cublasHandle) :: h
  integer :: n
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  integer, device :: ipvt(*)
  type(c_devptr), device :: Carray(*)
  integer :: ldc
  integer, device :: info(*)
  integer :: batchCount

2.4.52. cublasCgetrsBatched

CGETRS 使用 CGETRF 计算的 LU 分解,求解具有一般 N 乘 N 矩阵 A 的线性方程组 A * X = B、A**T * X = B 或 A**H * X = B。

integer(4) function cublasCgetrsBatched(h, trans, n, nrhs, Aarray, lda, ipvt, Barray, ldb, info, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: n, nrhs
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  integer, device :: ipvt(*)
  type(c_devptr), device :: Barray(*)
  integer :: ldb
  integer :: info(*)
  integer :: batchCount

2.4.53. cublasCmatinvBatched

cublasCmatinvBatched 是 cublasCgetrfBatched 加 cublasCgetriBatched 的快捷方式。但是,它仅在 n 小于 32 时有效。否则,用户必须使用 cublasCgetrfBatched 和 cublasCgetriBatched。

integer(4) function cublasCmatinvBatched(h, n, Aarray, lda, Ainv, lda_inv, info, batchCount)
  type(cublasHandle) :: h
  integer :: n
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Ainv(*)
  integer :: lda_inv
  integer, device :: info(*)
  integer :: batchCount

2.4.54. cublasCtrsmBatched

CTRSM 求解矩阵方程 op( A )*X = alpha*B 或 X*op( A ) = alpha*B 之一,其中 alpha 是一个标量,X 和 B 是 m 乘 n 矩阵,A 是一个单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 或 op( A ) = A**H 之一。矩阵 X 在 B 上被覆盖。

integer(4) function cublasCtrsmBatched( h, side, uplo, trans, diag, m, n, alpha, A, lda, B, ldb, batchCount)
  type(cublasHandle) :: h
  integer :: side ! integer or character(1) variable
  integer :: uplo ! integer or character(1) variable
  integer :: trans ! integer or character(1) variable
  integer :: diag ! integer or character(1) variable
  integer :: m, n
  complex(4), device :: alpha ! device or host variable
  type(c_devptr), device :: A(*)
  integer :: lda
  type(c_devptr), device :: B(*)
  integer :: ldb
  integer :: batchCount
integer(4) function cublasCtrsmBatched_v2( h, side, uplo, trans, diag, m, n, alpha, A, lda, B, ldb, batchCount)
  type(cublasHandle) :: h
  integer :: side
  integer :: uplo
  integer :: trans
  integer :: diag
  integer :: m, n
  complex(4), device :: alpha ! device or host variable
  type(c_devptr), device :: A(*)
  integer :: lda
  type(c_devptr), device :: B(*)
  integer :: ldb
  integer :: batchCount

2.4.55. cublasCgemvStridedBatched

CGEMV 执行批量矩阵-向量运算 Y := alpha*op( A ) * X + beta*Y,其中 op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一,alpha 和 beta 是标量,A 是一个 m 乘 n 矩阵,X 和 Y 是向量。

integer(4) function cublasCgemvStridedBatched(h, trans, m, n, alpha, &
      A, lda, strideA, X, incx, strideX, beta, Y, incy, strideY, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: m, n
  complex(4), device :: alpha ! device or host variable
  complex(4), device :: A(lda,*)
  integer :: lda
  integer(8) :: strideA
  complex(4), device :: X(*)
  integer :: incx
  integer(8) :: strideX
  complex(4), device :: beta ! device or host variable
  complex(4), device :: Y(*)
  integer :: incy
  integer(8) :: strideY
  integer :: batchCount
integer(4) function cublasCgemvStridedBatched_v2(h, trans, m, n, alpha, &
      A, lda, strideA, X, incx, strideX, beta, Y, incy, strideY, batchCount)
  type(cublasHandle) :: h
  integer :: trans
  integer :: m, n
  complex(4), device :: alpha ! device or host variable
  complex(4), device :: A(lda,*)
  integer :: lda
  integer(8) :: strideA
  complex(4), device :: X(*)
  integer :: incx
  integer(8) :: strideX
  complex(4), device :: beta ! device or host variable
  complex(4), device :: Y(*)
  integer :: incy
  integer(8) :: strideY
  integer :: batchCount

2.4.56. cublasCgemmStridedBatched

CGEMM 执行矩阵-矩阵运算 C := alpha*op( A )*op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量,A、B 和 C 是矩阵,其中 op( A ) 是一个 m 乘 k 矩阵,op( B ) 是一个 k 乘 n 矩阵,C 是一个 m 乘 n 矩阵。

integer(4) function cublasCgemmStridedBatched(h, transa, transb, m, n, k, alpha, Aarray, lda, strideA, Barray, ldb, strideB, beta, Carray, ldc, strideC, batchCount)
  type(cublasHandle) :: h
  integer :: transa ! integer or character(1) variable
  integer :: transb ! integer or character(1) variable
  integer :: m, n, k
  complex(4), device :: alpha ! device or host variable
  complex(4), device :: Aarray(*)
  integer :: lda
  integer :: strideA
  complex(4), device :: Barray(*)
  integer :: ldb
  integer :: strideB
  complex(4), device :: beta ! device or host variable
  complex(4), device :: Carray(*)
  integer :: ldc
  integer :: strideC
  integer :: batchCount
integer(4) function cublasCgemmStridedBatched_v2(h, transa, transb, m, n, k, alpha, &
           Aarray, lda, strideA, Barray, ldb, strideB, beta, Carray, ldc, strideC, batchCount)
  type(cublasHandle) :: h
  integer :: transa
  integer :: transb
  integer :: m, n, k
  complex(4), device :: alpha ! device or host variable
  complex(4), device :: Aarray(*)
  integer :: lda
  integer :: strideA
  complex(4), device :: Barray(*)
  integer :: ldb
  integer :: strideB
  complex(4), device :: beta ! device or host variable
  complex(4), device :: Carray(*)
  integer :: ldc
  integer :: strideC
  integer :: batchCount

2.5. 双精度复数函数和子程序

本节包含双精度复数 BLAS 和 cuBLAS 函数和子程序的接口。

2.5.1. izamax

IZAMAX 查找具有最大绝对值的元素的索引。

integer(4) function izamax(n, x, incx)
  integer :: n
  complex(8), device, dimension(*) :: x ! device or host variable
  integer :: incx
integer(4) function cublasIzamax(n, x, incx)
  integer :: n
  complex(8), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasIzamax_v2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device, dimension(*) :: x
  integer :: incx
  integer, device :: res ! device or host variable

2.5.2. izamin

IZAMIN 查找具有最小绝对值的元素的索引。

integer(4) function izamin(n, x, incx)
  integer :: n
  complex(8), device, dimension(*) :: x ! device or host variable
  integer :: incx
integer(4) function cublasIzamin(n, x, incx)
  integer :: n
  complex(8), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasIzamin_v2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device, dimension(*) :: x
  integer :: incx
  integer, device :: res ! device or host variable

2.5.3. dzasum

DZASUM 计算绝对值之和。

real(8) function dzasum(n, x, incx)
  integer :: n
  complex(8), device, dimension(*) :: x ! device or host variable
  integer :: incx
real(8) function cublasDzasum(n, x, incx)
  integer :: n
  complex(8), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasDzasum_v2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device, dimension(*) :: x
  integer :: incx
  real(8), device :: res ! device or host variable

2.5.4. zaxpy

ZAXPY 常数乘以向量加上向量。

subroutine zaxpy(n, a, x, incx, y, incy)
  integer :: n
  complex(8), device :: a ! device or host variable
  complex(8), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasZaxpy(n, a, x, incx, y, incy)
  integer :: n
  complex(8), device :: a ! device or host variable
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasZaxpy_v2(h, n, a, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device :: a ! device or host variable
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.5.5. zcopy

ZCOPY 将向量 x 复制到向量 y。

subroutine zcopy(n, x, incx, y, incy)
  integer :: n
  complex(8), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasZcopy(n, x, incx, y, incy)
  integer :: n
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasZcopy_v2(h, n, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.5.6. zdotc

ZDOTC 形成向量的点积。

complex(8) function zdotc(n, x, incx, y, incy)
  integer :: n
  complex(8), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
complex(8) function cublasZdotc(n, x, incx, y, incy)
  integer :: n
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasZdotc_v2(h, n, x, incx, y, incy, res)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy
  complex(8), device :: res ! device or host variable

2.5.7. zdotu

ZDOTU 形成两个向量的点积。

complex(8) function zdotu(n, x, incx, y, incy)
  integer :: n
  complex(8), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
complex(8) function cublasZdotu(n, x, incx, y, incy)
  integer :: n
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasZdotu_v2(h, n, x, incx, y, incy, res)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy
  complex(8), device :: res ! device or host variable

2.5.8. dznrm2

DZNRM2 通过函数名返回向量的欧几里得范数,因此 DZNRM2 := sqrt( x**H*x )

real(8) function dznrm2(n, x, incx)
  integer :: n
  complex(8), device, dimension(*) :: x ! device or host variable
  integer :: incx
real(8) function cublasDznrm2(n, x, incx)
  integer :: n
  complex(8), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasDznrm2_v2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device, dimension(*) :: x
  integer :: incx
  real(8), device :: res ! device or host variable

2.5.9. zrot

ZROT 应用平面旋转,其中 cos (C) 是实数,sin (S) 是复数,向量 CX 和 CY 是复数。

subroutine zrot(n, x, incx, y, incy, sc, ss)
  integer :: n
  real(8), device :: sc ! device or host variable
  complex(8), device :: ss ! device or host variable
  complex(8), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasZrot(n, x, incx, y, incy, sc, ss)
  integer :: n
  real(8), device :: sc ! device or host variable
  complex(8), device :: ss ! device or host variable
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasZrot_v2(h, n, x, incx, y, incy, sc, ss)
  type(cublasHandle) :: h
  integer :: n
  real(8), device :: sc ! device or host variable
  complex(8), device :: ss ! device or host variable
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.5.10. zsrot

ZSROT 应用平面旋转,其中 cos 和 sin (c 和 s) 是实数,向量 cx 和 cy 是复数。

subroutine zsrot(n, x, incx, y, incy, sc, ss)
  integer :: n
  real(8), device :: sc, ss ! device or host variable
  complex(8), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasZsrot(n, x, incx, y, incy, sc, ss)
  integer :: n
  real(8), device :: sc, ss ! device or host variable
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasZsrot_v2(h, n, x, incx, y, incy, sc, ss)
  type(cublasHandle) :: h
  integer :: n
  real(8), device :: sc, ss ! device or host variable
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.5.11. zrotg

ZROTG 确定双精度复数吉文斯旋转。

subroutine zrotg(sa, sb, sc, ss)
  complex(8), device :: sa, sb, ss ! device or host variable
  real(8), device :: sc ! device or host variable
subroutine cublasZrotg(sa, sb, sc, ss)
  complex(8), device :: sa, sb, ss ! device or host variable
  real(8), device :: sc ! device or host variable
integer(4) function cublasZrotg_v2(h, sa, sb, sc, ss)
  type(cublasHandle) :: h
  complex(8), device :: sa, sb, ss ! device or host variable
  real(8), device :: sc ! device or host variable

2.5.12. zscal

ZSCAL 用常数缩放向量。

subroutine zscal(n, a, x, incx)
  integer :: n
  complex(8), device :: a ! device or host variable
  complex(8), device, dimension(*) :: x ! device or host variable
  integer :: incx
subroutine cublasZscal(n, a, x, incx)
  integer :: n
  complex(8), device :: a ! device or host variable
  complex(8), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasZscal_v2(h, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device :: a ! device or host variable
  complex(8), device, dimension(*) :: x
  integer :: incx

2.5.13. zdscal

ZDSCAL 用常数缩放向量。

subroutine zdscal(n, a, x, incx)
  integer :: n
  real(8), device :: a ! device or host variable
  complex(8), device, dimension(*) :: x ! device or host variable
  integer :: incx
subroutine cublasZdscal(n, a, x, incx)
  integer :: n
  real(8), device :: a ! device or host variable
  complex(8), device, dimension(*) :: x
  integer :: incx
integer(4) function cublasZdscal_v2(h, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: n
  real(8), device :: a ! device or host variable
  complex(8), device, dimension(*) :: x
  integer :: incx

2.5.14. zswap

ZSWAP 交换两个向量。

subroutine zswap(n, x, incx, y, incy)
  integer :: n
  complex(8), device, dimension(*) :: x, y ! device or host variable
  integer :: incx, incy
subroutine cublasZswap(n, x, incx, y, incy)
  integer :: n
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy
integer(4) function cublasZswap_v2(h, n, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.5.15. zgbmv

ZGBMV 执行矩阵-向量运算 y := alpha*A*x + beta*y, 或 y := alpha*A**T*x + beta*y, 或 y := alpha*A**H*x + beta*y 之一,其中 alpha 和 beta 是标量,x 和 y 是向量,A 是一个 m 乘 n 带状矩阵,具有 kl 条子对角线和 ku 条超对角线。

subroutine zgbmv(t, m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: m, n, kl, ku, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(*) :: x, y ! device or host variable
  complex(8), device :: alpha, beta ! device or host variable
subroutine cublasZgbmv(t, m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: m, n, kl, ku, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha, beta ! device or host variable
integer(4) function cublasZgbmv_v2(h, t, m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: m, n, kl, ku, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha, beta ! device or host variable

2.5.16. zgemv

ZGEMV 执行矩阵-向量运算 y := alpha*A*x + beta*y, 或 y := alpha*A**T*x + beta*y, 或 y := alpha*A**H*x + beta*y 之一,其中 alpha 和 beta 是标量,x 和 y 是向量,A 是一个 m 乘 n 矩阵。

subroutine zgemv(t, m, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: m, n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(*) :: x, y ! device or host variable
  complex(8), device :: alpha, beta ! device or host variable
subroutine cublasZgemv(t, m, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: t
  integer :: m, n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha, beta ! device or host variable
integer(4) function cublasZgemv_v2(h, t, m, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: m, n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha, beta ! device or host variable

2.5.17. zgerc

ZGERC 执行秩 1 运算 A := alpha*x*y**H + A,其中 alpha 是一个标量,x 是一个 m 元素向量,y 是一个 n 元素向量,A 是一个 m 乘 n 矩阵。

subroutine zgerc(m, n, alpha, x, incx, y, incy, a, lda)
  integer :: m, n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(*) :: x, y ! device or host variable
  complex(8), device :: alpha ! device or host variable
subroutine cublasZgerc(m, n, alpha, x, incx, y, incy, a, lda)
  integer :: m, n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha ! device or host variable
integer(4) function cublasZgerc_v2(h, m, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: m, n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha ! device or host variable

2.5.18. zgeru

ZGERU 执行秩 1 运算 A := alpha*x*y**T + A,其中 alpha 是一个标量,x 是一个 m 元素向量,y 是一个 n 元素向量,A 是一个 m 乘 n 矩阵。

subroutine zgeru(m, n, alpha, x, incx, y, incy, a, lda)
  integer :: m, n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(*) :: x, y ! device or host variable
  complex(8), device :: alpha ! device or host variable
subroutine cublasZgeru(m, n, alpha, x, incx, y, incy, a, lda)
  integer :: m, n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha ! device or host variable
integer(4) function cublasZgeru_v2(h, m, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: m, n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha ! device or host variable

2.5.19. zsymv

ZSYMV 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是 n 元素向量,A 是一个 n 乘 n 对称矩阵。

subroutine zsymv(uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(*) :: x, y ! device or host variable
  complex(8), device :: alpha, beta ! device or host variable
subroutine cublasZsymv(uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha, beta ! device or host variable
integer(4) function cublasZsymv_v2(h, uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha, beta ! device or host variable

2.5.20. zsyr

ZSYR 执行对称秩 1 运算 A := alpha*x*x**H + A,其中 alpha 是一个复数标量,x 是一个 n 元素向量,A 是一个 n 乘 n 对称矩阵。

subroutine zsyr(t, n, alpha, x, incx, a, lda)
  character*1 :: t
  integer :: n, incx, lda
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(*) :: x ! device or host variable
  complex(8), device :: alpha ! device or host variable
subroutine cublasZsyr(t, n, alpha, x, incx, a, lda)
  character*1 :: t
  integer :: n, incx, lda
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x
  complex(8), device :: alpha ! device or host variable
integer(4) function cublasZsyr_v2(h, t, n, alpha, x, incx, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, lda
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x
  complex(8), device :: alpha ! device or host variable

2.5.21. zsyr2

ZSYR2 执行对称秩 2 运算 A := alpha*x*y’ + alpha*y*x’ + A,其中 alpha 是一个复数标量,x 和 y 是 n 元素向量,A 是一个 n 乘 n SY 矩阵。

subroutine zsyr2(t, n, alpha, x, incx, y, incy, a, lda)
  character*1 :: t
  integer :: n, incx, incy, lda
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(*) :: x, y ! device or host variable
  complex(8), device :: alpha ! device or host variable
subroutine cublasZsyr2(t, n, alpha, x, incx, y, incy, a, lda)
  character*1 :: t
  integer :: n, incx, incy, lda
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha ! device or host variable
integer(4) function cublasZsyr2_v2(h, t, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy, lda
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha ! device or host variable

2.5.22. ztbmv

ZTBMV 执行矩阵-向量运算 x := A*x, 或 x := A**T*x, 或 x := A**H*x 之一,其中 x 是一个 n 元素向量,A 是一个 n 乘 n 单位或非单位上或下三角带状矩阵,具有 ( k + 1 ) 条对角线。

subroutine ztbmv(u, t, d, n, k, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, k, incx, lda
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(*) :: x ! device or host variable
subroutine cublasZtbmv(u, t, d, n, k, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, k, incx, lda
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x
integer(4) function cublasZtbmv_v2(h, u, t, d, n, k, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, k, incx, lda
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x

2.5.23. ztbsv

ZTBSV 求解线性方程组 A*x = b, 或 A**T*x = b, 或 A**H*x = b 之一,其中 b 和 x 是 n 元素向量,A 是一个 n 乘 n 单位或非单位上或下三角带状矩阵,具有 ( k + 1 ) 条对角线。此例程中不包含奇异性或近奇异性测试。此类测试必须在调用此例程之前执行。

subroutine ztbsv(u, t, d, n, k, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, k, incx, lda
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(*) :: x ! device or host variable
subroutine cublasZtbsv(u, t, d, n, k, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, k, incx, lda
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x
integer(4) function cublasZtbsv_v2(h, u, t, d, n, k, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, k, incx, lda
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x

2.5.24. ztpmv

ZTPMV 执行矩阵-向量运算 x := A*x, 或 x := A**T*x, 或 x := A**H*x 之一,其中 x 是一个 n 元素向量,A 是一个 n 乘 n 单位或非单位上或下三角矩阵,以压缩形式提供。

subroutine ztpmv(u, t, d, n, a, x, incx)
  character*1 :: u, t, d
  integer :: n, incx
  complex(8), device, dimension(*) :: a, x ! device or host variable
subroutine cublasZtpmv(u, t, d, n, a, x, incx)
  character*1 :: u, t, d
  integer :: n, incx
  complex(8), device, dimension(*) :: a, x
integer(4) function cublasZtpmv_v2(h, u, t, d, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx
  complex(8), device, dimension(*) :: a, x

2.5.25. ztpsv

ZTPSV 求解线性方程组 A*x = b, 或 A**T*x = b, 或 A**H*x = b 之一,其中 b 和 x 是 n 元素向量,A 是一个 n 乘 n 单位或非单位上或下三角矩阵,以压缩形式提供。此例程中不包含奇异性或近奇异性测试。此类测试必须在调用此例程之前执行。

subroutine ztpsv(u, t, d, n, a, x, incx)
  character*1 :: u, t, d
  integer :: n, incx
  complex(8), device, dimension(*) :: a, x ! device or host variable
subroutine cublasZtpsv(u, t, d, n, a, x, incx)
  character*1 :: u, t, d
  integer :: n, incx
  complex(8), device, dimension(*) :: a, x
integer(4) function cublasZtpsv_v2(h, u, t, d, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx
  complex(8), device, dimension(*) :: a, x

2.5.26. ztrmv

ZTRMV 执行矩阵-向量运算 x := A*x, 或 x := A**T*x, 或 x := A**H*x 之一,其中 x 是一个 n 元素向量,A 是一个 n 乘 n 单位或非单位上或下三角矩阵。

subroutine ztrmv(u, t, d, n, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, incx, lda
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(*) :: x ! device or host variable
subroutine cublasZtrmv(u, t, d, n, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, incx, lda
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x
integer(4) function cublasZtrmv_v2(h, u, t, d, n, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx, lda
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x

2.5.27. ztrsv

ZTRSV 求解线性方程组 A*x = b, 或 A**T*x = b, 或 A**H*x = b 之一,其中 b 和 x 是 n 元素向量,A 是一个 n 乘 n 单位或非单位上或下三角矩阵。此例程中不包含奇异性或近奇异性测试。此类测试必须在调用此例程之前执行。

subroutine ztrsv(u, t, d, n, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, incx, lda
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(*) :: x ! device or host variable
subroutine cublasZtrsv(u, t, d, n, a, lda, x, incx)
  character*1 :: u, t, d
  integer :: n, incx, lda
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x
integer(4) function cublasZtrsv_v2(h, u, t, d, n, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx, lda
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x

2.5.28. zhbmv

ZHBMV 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是 n 元素向量,A 是一个 n 乘 n 埃尔米特带状矩阵,具有 k 条超对角线。

subroutine zhbmv(uplo, n, k, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: k, n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(*) :: x, y ! device or host variable
  complex(8), device :: alpha, beta ! device or host variable
subroutine cublasZhbmv(uplo, n, k, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: k, n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha, beta ! device or host variable
integer(4) function cublasZhbmv_v2(h, uplo, n, k, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: k, n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha, beta ! device or host variable

2.5.29. zhemv

ZHEMV 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是 n 元素向量,A 是一个 n 乘 n 埃尔米特矩阵。

subroutine zhemv(uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(*) :: x, y ! device or host variable
  complex(8), device :: alpha, beta ! device or host variable
subroutine cublasZhemv(uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha, beta ! device or host variable
integer(4) function cublasZhemv_v2(h, uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha, beta ! device or host variable

2.5.30. zhpmv

ZHPMV 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是 n 元素向量,A 是一个 n 乘 n 埃尔米特矩阵,以压缩形式提供。

subroutine zhpmv(uplo, n, alpha, a, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: n, incx, incy
  complex(8), device, dimension(*) :: a, x, y ! device or host variable
  complex(8), device :: alpha, beta ! device or host variable
subroutine cublasZhpmv(uplo, n, alpha, a, x, incx, beta, y, incy)
  character*1 :: uplo
  integer :: n, incx, incy
  complex(8), device, dimension(*) :: a, x, y
  complex(8), device :: alpha, beta ! device or host variable
integer(4) function cublasZhpmv_v2(h, uplo, n, alpha, a, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: n, incx, incy
  complex(8), device, dimension(*) :: a, x, y
  complex(8), device :: alpha, beta ! device or host variable

2.5.31. zher

ZHER 执行埃尔米特秩 1 运算 A := alpha*x*x**H + A,其中 alpha 是一个实标量,x 是一个 n 元素向量,A 是一个 n 乘 n 埃尔米特矩阵。

subroutine zher(t, n, alpha, x, incx, a, lda)
  character*1 :: t
  integer :: n, incx, lda
  complex(8), device, dimension(*) :: a, x ! device or host variable
  real(8), device :: alpha ! device or host variable
subroutine cublasZher(t, n, alpha, x, incx, a, lda)
  character*1 :: t
  integer :: n, incx, lda
  complex(8), device, dimension(*) :: a, x
  real(8), device :: alpha ! device or host variable
integer(4) function cublasZher_v2(h, t, n, alpha, x, incx, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, lda
  complex(8), device, dimension(*) :: a, x
  real(8), device :: alpha ! device or host variable

2.5.32. zher2

ZHER2 执行埃尔米特秩 2 运算 A := alpha*x*y**H + conjg( alpha )*y*x**H + A,其中 alpha 是一个标量,x 和 y 是 n 元素向量,A 是一个 n 乘 n 埃尔米特矩阵。

subroutine zher2(t, n, alpha, x, incx, y, incy, a, lda)
  character*1 :: t
  integer :: n, incx, incy
  complex(8), device, dimension(*) :: a, x, y ! device or host variable
  complex(8), device :: alpha ! device or host variable
subroutine cublasZher2(t, n, alpha, x, incx, y, incy, a, lda)
  character*1 :: t
  integer :: n, incx, incy, lda
  complex(8), device, dimension(*) :: a, x, y
  complex(8), device :: alpha ! device or host variable
integer(4) function cublasZher2_v2(h, t, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy, lda
  complex(8), device, dimension(*) :: a, x, y
  complex(8), device :: alpha ! device or host variable

2.5.33. zhpr

ZHPR 执行埃尔米特秩 1 运算 A := alpha*x*x**H + A,其中 alpha 是一个实标量,x 是一个 n 元素向量,A 是一个 n 乘 n 埃尔米特矩阵,以压缩形式提供。

subroutine zhpr(t, n, alpha, x, incx, a)
  character*1 :: t
  integer :: n, incx
  complex(8), device, dimension(*) :: a, x ! device or host variable
  real(8), device :: alpha ! device or host variable
subroutine cublasZhpr(t, n, alpha, x, incx, a)
  character*1 :: t
  integer :: n, incx
  complex(8), device, dimension(*) :: a, x
  real(8), device :: alpha ! device or host variable
integer(4) function cublasZhpr_v2(h, t, n, alpha, x, incx, a)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx
  complex(8), device, dimension(*) :: a, x
  real(8), device :: alpha ! device or host variable

2.5.34. zhpr2

ZHPR2 执行埃尔米特秩 2 运算 A := alpha*x*y**H + conjg( alpha )*y*x**H + A,其中 alpha 是一个标量,x 和 y 是 n 元素向量,A 是一个 n 乘 n 埃尔米特矩阵,以压缩形式提供。

subroutine zhpr2(t, n, alpha, x, incx, y, incy, a)
  character*1 :: t
  integer :: n, incx, incy
  complex(8), device, dimension(*) :: a, x, y ! device or host variable
  complex(8), device :: alpha ! device or host variable
subroutine cublasZhpr2(t, n, alpha, x, incx, y, incy, a)
  character*1 :: t
  integer :: n, incx, incy
  complex(8), device, dimension(*) :: a, x, y
  complex(8), device :: alpha ! device or host variable
integer(4) function cublasZhpr2_v2(h, t, n, alpha, x, incx, y, incy, a)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy
  complex(8), device, dimension(*) :: a, x, y
  complex(8), device :: alpha ! device or host variable

2.5.35. zgemm

ZGEMM 执行矩阵-矩阵运算 C := alpha*op( A )*op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 或 op( X ) = X**H 之一,alpha 和 beta 是标量,A、B 和 C 是矩阵,其中 op( A ) 是一个 m 乘 k 矩阵,op( B ) 是一个 k 乘 n 矩阵,C 是一个 m 乘 n 矩阵。

subroutine zgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: transa, transb
  integer :: m, n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(ldb, *) :: b ! device or host variable
  complex(8), device, dimension(ldc, *) :: c ! device or host variable
  complex(8), device :: alpha, beta ! device or host variable
subroutine cublasZgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: transa, transb
  integer :: m, n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha, beta ! device or host variable
integer(4) function cublasZgemm_v2(h, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: transa, transb
  integer :: m, n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha, beta ! device or host variable

2.5.36. zsymm

ZSYMM 执行矩阵-矩阵运算 C := alpha*A*B + beta*C 或 C := alpha*B*A + beta*C 之一,其中 alpha 和 beta 是标量,A 是一个对称矩阵,B 和 C 是 m 乘 n 矩阵。

subroutine zsymm(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: side, uplo
  integer :: m, n, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(ldb, *) :: b ! device or host variable
  complex(8), device, dimension(ldc, *) :: c ! device or host variable
  complex(8), device :: alpha, beta ! device or host variable
subroutine cublasZsymm(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: side, uplo
  integer :: m, n, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha, beta ! device or host variable
integer(4) function cublasZsymm_v2(h, side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo
  integer :: m, n, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha, beta ! device or host variable

2.5.37. zsyrk

ZSYRK 执行对称秩 k 运算 C := alpha*A*A**T + beta*C 或 C := alpha*A**T*A + beta*C 之一,其中 alpha 和 beta 是标量,C 是一个 n 乘 n 对称矩阵,A 在第一种情况下是一个 n 乘 k 矩阵,在第二种情况下是一个 k 乘 n 矩阵。

subroutine zsyrk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldc
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(ldc, *) :: c ! device or host variable
  complex(8), device :: alpha, beta ! device or host variable
subroutine cublasZsyrk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha, beta ! device or host variable
integer(4) function cublasZsyrk_v2(h, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha, beta ! device or host variable

2.5.38. zsyr2k

ZSYR2K 执行对称秩 2k 运算 C := alpha*A*B**T + alpha*B*A**T + beta*C 或 C := alpha*A**T*B + alpha*B**T*A + beta*C 之一,其中 alpha 和 beta 是标量,C 是一个 n 乘 n 对称矩阵,A 和 B 在第一种情况下是 n 乘 k 矩阵,在第二种情况下是 k 乘 n 矩阵。

subroutine zsyr2k(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(ldb, *) :: b ! device or host variable
  complex(8), device, dimension(ldc, *) :: c ! device or host variable
  complex(8), device :: alpha, beta ! device or host variable
subroutine cublasZsyr2k(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha, beta ! device or host variable
integer(4) function cublasZsyr2k_v2(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha, beta ! device or host variable

2.5.39. zsyrkx

ZSYRKX 执行对称秩 k 更新 C := alpha*A*B**T + beta*C 的变体,其中 alpha 和 beta 是标量,C 是一个以 lower 或 upper 模式存储的 n 乘 n 对称矩阵,A 和 B 是 n 乘 k 矩阵。当 B 以某种方式使得结果保证对称时,可以使用此例程。有关更多详细信息,请参阅 CUBLAS 文档。

subroutine zsyrkx(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(ldb, *) :: b ! device or host variable
  complex(8), device, dimension(ldc, *) :: c ! device or host variable
  complex(8), device :: alpha, beta ! device or host variable
subroutine cublasZsyrkx(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha, beta ! device or host variable
integer(4) function cublasZsyrkx_v2(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha, beta ! device or host variable

2.5.40. ztrmm

ZTRMM 执行矩阵-矩阵运算 B := alpha*op( A )*B 或 B := alpha*B*op( A ) 之一,其中 alpha 是一个标量,B 是一个 m 乘 n 矩阵,A 是一个单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 或 op( A ) = A**H 之一。

subroutine ztrmm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  character*1 :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(ldb, *) :: b ! device or host variable
  complex(8), device :: alpha ! device or host variable
subroutine cublasZtrmm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  character*1 :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device :: alpha ! device or host variable
integer(4) function cublasZtrmm_v2(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo, transa, diag
  integer :: m, n, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha ! device or host variable

2.5.41. ztrsm

ZTRSM 求解矩阵方程 op( A )*X = alpha*B 或 X*op( A ) = alpha*B 之一,其中 alpha 是一个标量,X 和 B 是 m 乘 n 矩阵,A 是一个单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 或 op( A ) = A**H 之一。矩阵 X 在 B 上被覆盖。

subroutine ztrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  character*1 :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(ldb, *) :: b ! device or host variable
  complex(8), device :: alpha ! device or host variable
subroutine cublasZtrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  character*1 :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device :: alpha ! device or host variable
integer(4) function cublasZtrsm_v2(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  type(cublasHandle) :: h
  integer :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device :: alpha ! device or host variable

2.5.42. zhemm

ZHEMM 执行矩阵-矩阵运算 C := alpha*A*B + beta*C 或 C := alpha*B*A + beta*C 之一,其中 alpha 和 beta 是标量,A 是一个埃尔米特矩阵,B 和 C 是 m 乘 n 矩阵。

subroutine zhemm(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: side, uplo
  integer :: m, n, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(ldb, *) :: b ! device or host variable
  complex(8), device, dimension(ldc, *) :: c ! device or host variable
  complex(8), device :: alpha, beta ! device or host variable
subroutine cublasZhemm(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: side, uplo
  integer :: m, n, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha, beta ! device or host variable
integer(4) function cublasZhemm_v2(h, side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo
  integer :: m, n, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha, beta ! device or host variable

2.5.43. zherk

ZHERK 执行埃尔米特秩 k 运算 C := alpha*A*A**H + beta*C 或 C := alpha*A**H*A + beta*C 之一,其中 alpha 和 beta 是实标量,C 是一个 n 乘 n 埃尔米特矩阵,A 在第一种情况下是一个 n 乘 k 矩阵,在第二种情况下是一个 k 乘 n 矩阵。

subroutine zherk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldc
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(ldc, *) :: c ! device or host variable
  real(8), device :: alpha, beta ! device or host variable
subroutine cublasZherk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha, beta ! device or host variable
integer(4) function cublasZherk_v2(h, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha, beta ! device or host variable

2.5.44. zher2k

ZHER2K 执行埃尔米特秩 2k 运算 C := alpha*A*B**H + conjg( alpha )*B*A**H + beta*C 或 C := alpha*A**H*B + conjg( alpha )*B**H*A + beta*C 之一,其中 alpha 和 beta 是标量,beta 是实数,C 是一个 n 乘 n 埃尔米特矩阵,A 和 B 在第一种情况下是 n 乘 k 矩阵,在第二种情况下是 k 乘 n 矩阵。

subroutine zher2k(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(ldb, *) :: b ! device or host variable
  complex(8), device, dimension(ldc, *) :: c ! device or host variable
  complex(8), device :: alpha ! device or host variable
  real(8), device :: beta ! device or host variable
subroutine cublasZher2k(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha ! device or host variable
  real(8), device :: beta ! device or host variable
integer(4) function cublasZher2k_v2(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha ! device or host variable
  real(8), device :: beta ! device or host variable

2.5.45. zherkx

ZHERKX 执行埃尔米特秩 k 运算 C := alpha*A*B**H + beta*C 的变体,其中 alpha 和 beta 是实标量,C 是一个以 lower 或 upper 模式存储的 n 乘 n 埃尔米特矩阵,A 和 B 是 n 乘 k 矩阵。有关更多详细信息,请参阅 CUBLAS 文档。

subroutine zherkx(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a ! device or host variable
  complex(8), device, dimension(ldb, *) :: b ! device or host variable
  complex(8), device, dimension(ldc, *) :: c ! device or host variable
  complex(8), device :: alpha ! device or host variable
  real(8), device :: beta ! device or host variable
subroutine cublasZherkx(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  character*1 :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha ! device or host variable
  real(8), device :: beta ! device or host variable
integer(4) function cublasZherkx_v2(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha ! device or host variable
  real(8), device :: beta ! device or host variable

2.5.46. cublasZgemvBatched

ZGEMV 执行批量矩阵-向量运算 Y := alpha*op( A ) * X + beta*Y,其中 op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一,alpha 和 beta 是标量,A 是一个 m 乘 n 矩阵,X 和 Y 是向量。

integer(4) function cublasZgemvBatched(h, trans, m, n, alpha, &
      Aarray, lda, xarray, incx, beta, yarray, incy, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: m, n
  complex(8), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: xarray(*)
  integer :: incx
  complex(8), device :: beta ! device or host variable
  type(c_devptr), device :: yarray(*)
  integer :: incy
  integer :: batchCount
integer(4) function cublasZgemvBatched_v2(h, trans, m, n, alpha, &
      Aarray, lda, xarray, incx, beta, yarray, incy, batchCount)
  type(cublasHandle) :: h
  integer :: trans
  integer :: m, n
  complex(8), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: xarray(*)
  integer :: incx
  complex(8), device :: beta ! device or host variable
  type(c_devptr), device :: yarray(*)
  integer :: incy
  integer :: batchCount

2.5.47. cublasZgemmBatched

ZGEMM 执行矩阵-矩阵运算 C := alpha*op( A )*op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 或 op( X ) = X**H 之一,alpha 和 beta 是标量,A、B 和 C 是矩阵,其中 op( A ) 是一个 m 乘 k 矩阵,op( B ) 是一个 k 乘 n 矩阵,C 是一个 m 乘 n 矩阵。

integer(4) function cublasZgemmBatched(h, transa, transb, m, n, k, alpha, Aarray, lda, Barray, ldb, beta, Carray, ldc, batchCount)
  type(cublasHandle) :: h
  integer :: transa ! integer or character(1) variable
  integer :: transb ! integer or character(1) variable
  integer :: m, n, k
  complex(8), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Barray(*)
  integer :: ldb
  complex(8), device :: beta ! device or host variable
  type(c_devptr), device :: Carray(*)
  integer :: ldc
  integer :: batchCount
integer(4) function cublasZgemmBatched_v2(h, transa, transb, m, n, k, alpha, &
           Aarray, lda, Barray, ldb, beta, Carray, ldc, batchCount)
  type(cublasHandle) :: h
  integer :: transa
  integer :: transb
  integer :: m, n, k
  complex(8), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Barray(*)
  integer :: ldb
  complex(8), device :: beta ! device or host variable
  type(c_devptr), device :: Carray(*)
  integer :: ldc
  integer :: batchCount

2.5.48. cublasZgelsBatched

ZGELS 使用 A 的 QR 或 LQ 分解,求解涉及 M 乘 N 矩阵 A 或其共轭转置的超定或欠定复线性系统。假设 A 具有满秩。提供以下选项:1. 如果 TRANS = ‘N’ 且 m >= n:找到超定系统的最小二乘解,即,求解最小二乘问题 minimize || B - A*X ||。2. 如果 TRANS = ‘N’ 且 m < n:找到欠定系统 A * X = B 的最小范数解。3. 如果 TRANS = ‘C’ 且 m >= n:找到欠定系统 A**H * X = B 的最小范数解。4. 如果 TRANS = ‘C’ 且 m < n:找到超定系统的最小二乘解,即,求解最小二乘问题 minimize || B - A**H * X ||。可以在单个调用中处理多个右手边向量 b 和解向量 x;它们存储为 M 乘 NRHS 右手边矩阵 B 和 N 乘 NRHS 解矩阵 X 的列。

integer(4) function cublasZgelsBatched(h, trans, m, n, nrhs, Aarray, lda, Carray, ldc, info, devinfo, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: m, n, nrhs
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Carray(*)
  integer :: ldc
  integer :: info(*)
  integer, device :: devinfo(*)
  integer :: batchCount

2.5.49. cublasZgeqrfBatched

ZGEQRF 计算复数 M 乘 N 矩阵 A 的 QR 分解:A = Q * R。

integer(4) function cublasZgeqrfBatched(h, m, n, Aarray, lda, Tau, info, batchCount)
  type(cublasHandle) :: h
  integer :: m, n
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Tau(*)
  integer :: info(*)
  integer :: batchCount

2.5.50. cublasZgetrfBatched

ZGETRF 使用行交换的部分主元法计算一般 M 乘 N 矩阵 A 的 LU 分解。分解形式为 A = P * L * U,其中 P 是置换矩阵,L 是具有单位对角线元素的下三角矩阵(如果 m > n,则为下梯形矩阵),U 是上三角矩阵(如果 m < n,则为上梯形矩阵)。这是算法的 right-looking Level 3 BLAS 版本。

integer(4) function cublasZgetrfBatched(h, n, Aarray, lda, ipvt, info, batchCount)
  type(cublasHandle) :: h
  integer :: n
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  integer, device :: ipvt(*)
  integer, device :: info(*)
  integer :: batchCount

2.5.51. cublasZgetriBatched

ZGETRI 使用 ZGETRF 计算的 LU 分解来计算矩阵的逆矩阵。此方法反转 U,然后通过求解方程组 inv(A)*L = inv(U) 来计算 inv(A)。

integer(4) function cublasZgetriBatched(h, n, Aarray, lda, ipvt, Carray, ldc, info, batchCount)
  type(cublasHandle) :: h
  integer :: n
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  integer, device :: ipvt(*)
  type(c_devptr), device :: Carray(*)
  integer :: ldc
  integer, device :: info(*)
  integer :: batchCount

2.5.52. cublasZgetrsBatched

ZGETRS 使用 ZGETRF 计算的 LU 分解,求解具有一般 N 乘 N 矩阵 A 的线性方程组 A * X = B、A**T * X = B 或 A**H * X = B。

integer(4) function cublasZgetrsBatched(h, trans, n, nrhs, Aarray, lda, ipvt, Barray, ldb, info, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: n, nrhs
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  integer, device :: ipvt(*)
  type(c_devptr), device :: Barray(*)
  integer :: ldb
  integer :: info(*)
  integer :: batchCount

2.5.53. cublasZmatinvBatched

cublasZmatinvBatched 是 cublasZgetrfBatched 加 cublasZgetriBatched 的快捷方式。但是,它仅在 n 小于 32 时有效。否则,用户必须使用 cublasZgetrfBatched 和 cublasZgetriBatched。

integer(4) function cublasZmatinvBatched(h, n, Aarray, lda, Ainv, lda_inv, info, batchCount)
  type(cublasHandle) :: h
  integer :: n
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Ainv(*)
  integer :: lda_inv
  integer, device :: info(*)
  integer :: batchCount

2.5.54. cublasZtrsmBatched

ZTRSM 求解矩阵方程 op( A )*X = alpha*B 或 X*op( A ) = alpha*B 之一,其中 alpha 是一个标量,X 和 B 是 m 乘 n 矩阵,A 是一个单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 或 op( A ) = A**H 之一。矩阵 X 在 B 上被覆盖。

integer(4) function cublasZtrsmBatched( h, side, uplo, trans, diag, m, n, alpha, A, lda, B, ldb, batchCount)
  type(cublasHandle) :: h
  integer :: side ! integer or character(1) variable
  integer :: uplo ! integer or character(1) variable
  integer :: trans ! integer or character(1) variable
  integer :: diag ! integer or character(1) variable
  integer :: m, n
  complex(8), device :: alpha ! device or host variable
  type(c_devptr), device :: A(*)
  integer :: lda
  type(c_devptr), device :: B(*)
  integer :: ldb
  integer :: batchCount
integer(4) function cublasZtrsmBatched_v2( h, side, uplo, trans, diag, m, n, alpha, A, lda, B, ldb, batchCount)
  type(cublasHandle) :: h
  integer :: side
  integer :: uplo
  integer :: trans
  integer :: diag
  integer :: m, n
  complex(8), device :: alpha ! device or host variable
  type(c_devptr), device :: A(*)
  integer :: lda
  type(c_devptr), device :: B(*)
  integer :: ldb
  integer :: batchCount

2.5.55. cublasZgemvStridedBatched

ZGEMV 执行批量矩阵-向量运算 Y := alpha*op( A ) * X + beta*Y,其中 op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一,alpha 和 beta 是标量,A 是一个 m 乘 n 矩阵,X 和 Y 是向量。

integer(4) function cublasZgemvStridedBatched(h, trans, m, n, alpha, &
      A, lda, strideA, X, incx, strideX, beta, Y, incy, strideY, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: m, n
  complex(8), device :: alpha ! device or host variable
  complex(8), device :: A(lda,*)
  integer :: lda
  integer(8) :: strideA
  complex(8), device :: X(*)
  integer :: incx
  integer(8) :: strideX
  complex(8), device :: beta ! device or host variable
  complex(8), device :: Y(*)
  integer :: incy
  integer(8) :: strideY
  integer :: batchCount
integer(4) function cublasZgemvStridedBatched_v2(h, trans, m, n, alpha, &
      A, lda, strideA, X, incx, strideX, beta, Y, incy, strideY, batchCount)
  type(cublasHandle) :: h
  integer :: trans
  integer :: m, n
  complex(8), device :: alpha ! device or host variable
  complex(8), device :: A(lda,*)
  integer :: lda
  integer(8) :: strideA
  complex(8), device :: X(*)
  integer :: incx
  integer(8) :: strideX
  complex(8), device :: beta ! device or host variable
  complex(8), device :: Y(*)
  integer :: incy
  integer(8) :: strideY
  integer :: batchCount

2.5.56. cublasZgemmStridedBatched

ZGEMM 执行矩阵-矩阵运算 C := alpha*op( A )*op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量,而 A、B 和 C 是矩阵,其中 op( A ) 是 m 乘 k 矩阵,op( B ) 是 k 乘 n 矩阵,C 是 m 乘 n 矩阵。

integer(4) function cublasZgemmStridedBatched(h, transa, transb, m, n, k, alpha, Aarray, lda, strideA, Barray, ldb, strideB, beta, Carray, ldc, strideC, batchCount)
  type(cublasHandle) :: h
  integer :: transa ! integer or character(1) variable
  integer :: transb ! integer or character(1) variable
  integer :: m, n, k
  complex(8), device :: alpha ! device or host variable
  complex(8), device :: Aarray(*)
  integer :: lda
  integer :: strideA
  complex(8), device :: Barray(*)
  integer :: ldb
  integer :: strideB
  complex(8), device :: beta ! device or host variable
  complex(8), device :: Carray(*)
  integer :: ldc
  integer :: strideC
  integer :: batchCount
integer(4) function cublasZgemmStridedBatched_v2(h, transa, transb, m, n, k, alpha, &
           Aarray, lda, strideA, Barray, ldb, strideB, beta, Carray, ldc, strideC, batchCount)
  type(cublasHandle) :: h
  integer :: transa
  integer :: transb
  integer :: m, n, k
  complex(8), device :: alpha ! device or host variable
  complex(8), device :: Aarray(*)
  integer :: lda
  integer :: strideA
  complex(8), device :: Barray(*)
  integer :: ldb
  integer :: strideB
  complex(8), device :: beta ! device or host variable
  complex(8), device :: Carray(*)
  integer :: ldc
  integer :: strideC
  integer :: batchCount

2.6. 半精度函数和扩展函数

本节包含半精度 cuBLAS 函数和 BLAS 扩展函数的接口,这些接口允许用户单独指定数组和计算的类型(其中许多或全部支持半精度)。

扩展函数可以接受多种支持的数据类型之一。用户应始终查看最新的 cuBLAS 文档以了解支持的组合。在本文档中,我们将使用 real(2) 数据类型,因为这些函数不受库中 S, D, C,Z 变体的其他支持。此外,用户有责任通过调用 cublasSetPointerMode 为所有扩展函数正确设置指针模式。

type(cudaDataType) 现在是本文档中介绍的几个较新的库函数通用的。尽管某些函数会接受适当值的整数,但现在建议将来使用 type(cudaDataType)

2.6.1. cublasHgemvBatched

HGEMV 执行批量矩阵-向量运算 Y := alpha*op( A ) * X + beta*Y,其中 op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一,alpha 和 beta 是标量,A 是 m 乘 n 矩阵,而 X 和 Y 是向量。

在 HSH 版本中,alpha, beta 是 real(4),并且指向的数组都应包含 real(2) 数据。

integer(4) function cublasHSHgemvBatched(h, trans, m, n, alpha, &
      Aarray, lda, xarray, incx, beta, yarray, incy, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: m, n
  real(4), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: xarray(*)
  integer :: incx
  real(4), device :: beta ! device or host variable
  type(c_devptr), device :: yarray(*)
  integer :: incy
  integer :: batchCount
integer(4) function cublasHSHgemvBatched_v2(h, trans, m, n, alpha, &
      Aarray, lda, xarray, incx, beta, yarray, incy, batchCount)
  type(cublasHandle) :: h
  integer :: trans
  integer :: m, n
  real(4), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: xarray(*)
  integer :: incx
  real(4), device :: beta ! device or host variable
  type(c_devptr), device :: yarray(*)
  integer :: incy
  integer :: batchCount

在 HSS 版本中,alpha, beta 是 real(4),指向的 Aarray, xarray 数组应包含 real(2) 数据,而 yarray 应包含 real(4) 数据。

integer(4) function cublasHSSgemvBatched(h, trans, m, n, alpha, &
      Aarray, lda, xarray, incx, beta, yarray, incy, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: m, n
  real(4), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: xarray(*)
  integer :: incx
  real(4), device :: beta ! device or host variable
  type(c_devptr), device :: yarray(*)
  integer :: incy
  integer :: batchCount
integer(4) function cublasHSSgemvBatched_v2(h, trans, m, n, alpha, &
      Aarray, lda, xarray, incx, beta, yarray, incy, batchCount)
  type(cublasHandle) :: h
  integer :: trans
  integer :: m, n
  real(4), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: xarray(*)
  integer :: incx
  real(4), device :: beta ! device or host variable
  type(c_devptr), device :: yarray(*)
  integer :: incy
  integer :: batchCount

2.6.2. cublasHgemvStridedBatched

HGEMV 执行批量矩阵-向量运算 Y := alpha*op( A ) * X + beta*Y,其中 op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一,alpha 和 beta 是标量,A 是 m 乘 n 矩阵,而 X 和 Y 是向量。

在 HSH 版本中,alpha, beta 是 real(4),并且数组 A, X, Y 都是 real(2) 数据。

integer(4) function cublasHSHgemvStridedBatched(h, trans, m, n, alpha, &
      A, lda, strideA, X, incx, strideX, beta, Y, incy, strideY, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: m, n
  real(4), device :: alpha ! device or host variable
  real(2), device :: A(lda,*)
  integer :: lda
  integer(8) :: strideA
  real(2), device :: X(*)
  integer :: incx
  integer(8) :: strideX
  real(4), device :: beta ! device or host variable
  real(2), device :: Y(*)
  integer :: incy
  integer(8) :: strideY
  integer :: batchCount
integer(4) function cublasHSHgemvStridedBatched_v2(h, trans, m, n, alpha, &
      A, lda, strideA, X, incx, strideX, beta, Y, incy, strideY, batchCount)
  type(cublasHandle) :: h
  integer :: trans
  integer :: m, n
  real(4), device :: alpha ! device or host variable
  real(2), device :: A(lda,*)
  integer :: lda
  integer(8) :: strideA
  real(2), device :: X(*)
  integer :: incx
  integer(8) :: strideX
  real(4), device :: beta ! device or host variable
  real(2), device :: Y(*)
  integer :: incy
  integer(8) :: strideY
  integer :: batchCount

在 HSS 版本中,alpha, beta 是 real(4),A, X 数组包含 real(2) 数据,而 Y 数组包含 real(4) 数据。

integer(4) function cublasHSSgemvStridedBatched(h, trans, m, n, alpha, &
      A, lda, strideA, X, incx, strideX, beta, Y, incy, strideY, batchCount)
  type(cublasHandle) :: h
  integer :: trans ! integer or character(1) variable
  integer :: m, n
  real(4), device :: alpha ! device or host variable
  real(2), device :: A(lda,*)
  integer :: lda
  integer(8) :: strideA
  real(2), device :: X(*)
  integer :: incx
  integer(8) :: strideX
  real(4), device :: beta ! device or host variable
  real(4), device :: Y(*)
  integer :: incy
  integer(8) :: strideY
  integer :: batchCount
integer(4) function cublasHSSgemvStridedBatched_v2(h, trans, m, n, alpha, &
      A, lda, strideA, X, incx, strideX, beta, Y, incy, strideY, batchCount)
  type(cublasHandle) :: h
  integer :: trans
  integer :: m, n
  real(4), device :: alpha ! device or host variable
  real(2), device :: A(lda,*)
  integer :: lda
  integer(8) :: strideA
  real(2), device :: X(*)
  integer :: incx
  integer(8) :: strideX
  real(4), device :: beta ! device or host variable
  real(4), device :: Y(*)
  integer :: incy
  integer(8) :: strideY
  integer :: batchCount

2.6.3. cublasHgemm

HGEMM 执行矩阵-矩阵运算 C := alpha*op( A )*op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量,而 A、B 和 C 是矩阵,其中 op( A ) 是 m 乘 k 矩阵,op( B ) 是 k 乘 n 矩阵,C 是 m 乘 n 矩阵。

subroutine cublasHgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, &
      beta, c, ldc)
  integer :: transa  ! integer or character(1) variable
  integer :: transb  ! integer or character(1) variable
  integer :: m, n, k, lda, ldb, ldc
  real(2), device, dimension(lda, *) :: a
  real(2), device, dimension(ldb, *) :: b
  real(2), device, dimension(ldc, *) :: c
  real(2), device :: alpha, beta ! device or host variable

在 v2 版本中,用户有责任为 alpha, beta 参数设置指针模式。

integer(4) function cublasHgemm_v2(h, transa, transb, m, n, k, alpha, &
      a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: transa, transb
  integer :: m, n, k, lda, ldb, ldc
  real(2), device, dimension(lda, *) :: a
  real(2), device, dimension(ldb, *) :: b
  real(2), device, dimension(ldc, *) :: c
  real(2), device :: alpha, beta ! device or host variable

2.6.4. cublasHgemmBatched

HGEMM 执行矩阵-矩阵运算 C := alpha*op( A )*op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量,而 A、B 和 C 是矩阵,其中 op( A ) 是 m 乘 k 矩阵,op( B ) 是 k 乘 n 矩阵,C 是 m 乘 n 矩阵。

integer(4) function cublasHgemmBatched(h, transa, transb, m, n, k, &
      alpha, Aarray, lda, Barray, ldb, beta, Carray, ldc, batchCount)
  type(cublasHandle) :: h
  integer :: transa ! integer or character(1) variable
  integer :: transb ! integer or character(1) variable
  integer :: m, n, k
  real(2), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Barray(*)
  integer :: ldb
  real(2), device :: beta ! device or host variable
  type(c_devptr), device :: Carray(*)
  integer :: ldc
  integer :: batchCount
integer(4) function cublasHgemmBatched_v2(h, transa, transb, m, n, k, &
      alpha, Aarray, lda, Barray, ldb, beta, Carray, ldc, batchCount)
  type(cublasHandle) :: h
  integer :: transa
  integer :: transb
  integer :: m, n, k
  real(2), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  integer :: lda
  type(c_devptr), device :: Barray(*)
  integer :: ldb
  real(2), device :: beta ! device or host variable
  type(c_devptr), device :: Carray(*)
  integer :: ldc
  integer :: batchCount

2.6.5. cublasHgemmStridedBatched

HGEMM 执行一组矩阵-矩阵运算 C := alpha*op( A )*op( B ) + beta*C,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量,而 A、B 和 C 是矩阵,其中 op( A ) 是 m 乘 k 矩阵,op( B ) 是 k 乘 n 矩阵,C 是 m 乘 n 矩阵。

integer(4) function cublasHgemmStridedBatched(h, transa, transb, m, n, k, &
    alpha, A, lda, strideA, B, ldb, strideB, beta, C, ldc, strideC, batchCount)
  type(cublasHandle) :: h
  integer :: transa ! integer or character(1) variable
  integer :: transb ! integer or character(1) variable
  integer :: m, n, k
  real(2), device :: alpha ! device or host variable
  real(2), device :: A(lda,*)
  integer :: lda
  integer(8) :: strideA
  real(2), device :: B(ldb,*)
  integer :: ldb
  integer(8) :: strideB
  real(2), device :: beta ! device or host variable
  real(2), device :: C(ldc,*)
  integer :: ldc
  integer(8) :: strideC
  integer :: batchCount
integer(4) function cublasHgemmStridedBatched_v2(h, transa, transb, m, n, k, &
    alpha, A, lda, strideA, B, ldb, strideB, beta, C, ldc, strideC, batchCount)
  type(cublasHandle) :: h
  integer :: transa
  integer :: transb
  integer :: m, n, k
  real(2), device :: alpha ! device or host variable
  real(2), device :: A(lda,*)
  integer :: lda
  integer(8) :: strideA
  real(2), device :: B(ldb,*)
  integer :: ldb
  integer(8) :: strideB
  real(2), device :: beta ! device or host variable
  real(2), device :: C(ldc,*)
  integer :: ldc
  integer(8) :: strideC
  integer :: batchCount

2.6.6. cublasIamaxEx

IAMAX 查找具有最大绝对值的元素的索引。

integer(4) function cublasIamaxEx(h, n, x, xtype, incx, res)
  type(cublasHandle) :: h
  integer :: n
  real(2), device, dimension(*) :: x  ! Type and kind as specified by xtype
  type(cudaDataType) :: xtype
  integer :: incx
  integer, device :: res ! device or host variable

2.6.7. cublasIaminEx

IAMIN 查找具有最小绝对值的元素的索引。

integer(4) function cublasIaminEx(h, n, x, xtype, incx, res)
  type(cublasHandle) :: h
  integer :: n
  real(2), device, dimension(*) :: x  ! Type and kind as specified by xtype
  type(cudaDataType) :: xtype
  integer :: incx
  integer, device :: res ! device or host variable

2.6.8. cublasAsumEx

ASUM 计算绝对值的总和。

integer(4) function cublasAsumEx(h, n, x, xtype, incx, res, &
      restype, extype)
  type(cublasHandle) :: h
  integer :: n
  real(2), device, dimension(*) :: x  ! Type and kind as specified by xtype
  type(cudaDataType) :: xtype
  integer :: incx
  real(2), device :: res ! device or host variable
  type(cudaDataType) :: restype
  type(cudaDataType) :: extype

2.6.9. cublasAxpyEx

AXPY 计算常数乘以向量加上向量。

integer(4) function cublasAxpyEx(h, n, alpha, alphatype, &
      x, xtype, incx, y, ytype, incy, extype)
  type(cublasHandle) :: h
  integer :: n
  real(2), device :: alpha
  type(cudaDataType) :: alphatype
  real(2), device, dimension(*) :: x
  type(cudaDataType) :: xtype
  integer :: incx
  real(2), device, dimension(*) :: y
  type(cudaDataType) :: ytype
  integer :: incy
  type(cudaDataType) :: extype

2.6.10. cublasCopyEx

COPY 将向量 x 复制到向量 y。

integer(4) function cublasCopyEx(h, n, x, xtype, incx, &
      y, ytype, incy)
  type(cublasHandle) :: h
  integer :: n
  real(2), device, dimension(*) :: x
  type(cudaDataType) :: xtype
  integer :: incx
  real(2), device, dimension(*) :: y
  type(cudaDataType) :: ytype
  integer :: incy

2.6.11. cublasDotEx

DOT 形成两个向量的点积。

integer(4) function cublasDotEx(h, n, x, xtype, incx, &
      y, ytype, incy, res, restype, extype)
  type(cublasHandle) :: h
  integer :: n
  real(2), device, dimension(*) :: x  ! Type and kind as specified by xtype
  type(cudaDataType) :: xtype
  integer :: incx
  real(2), device, dimension(*) :: y  ! Type and kind as specified by ytype
  type(cudaDataType) :: ytype
  integer :: incy
  real(2), device :: res ! device or host variable
  type(cudaDataType) :: restype
  type(cudaDataType) :: extype

2.6.12. cublasDotcEx

DOTC 形成两个向量的共轭点积。

integer(4) function cublasDotcEx(h, n, x, xtype, incx, &
      y, ytype, incy, res, restype, extype)
  type(cublasHandle) :: h
  integer :: n
  real(2), device, dimension(*) :: x  ! Type and kind as specified by xtype
  type(cudaDataType) :: xtype
  integer :: incx
  real(2), device, dimension(*) :: y  ! Type and kind as specified by ytype
  type(cudaDataType) :: ytype
  integer :: incy
  real(2), device :: res ! device or host variable
  type(cudaDataType) :: restype
  type(cudaDataType) :: extype

2.6.13. cublasNrm2Ex

NRM2 生成向量的欧几里得范数。

integer(4) function cublasNrm2Ex(h, n, x, xtype, incx, res, &
      restype, extype)
  type(cublasHandle) :: h
  integer :: n
  real(2), device, dimension(*) :: x  ! Type and kind as specified by xtype
  type(cudaDataType) :: xtype
  integer :: incx
  real(2), device :: res ! device or host variable
  type(cudaDataType) :: restype
  type(cudaDataType) :: extype

2.6.14. cublasRotEx

ROT 应用平面旋转。

integer(4) function cublasRotEx(h, n, x, xtype, incx, &
      y, ytype, incy, c, s, cstype, extype)
  type(cublasHandle) :: h
  integer :: n
  real(2), device, dimension(*) :: x  ! Type and kind as specified by xtype
  type(cudaDataType) :: xtype
  integer :: incx
  real(2), device, dimension(*) :: y  ! Type and kind as specified by ytype
  type(cudaDataType) :: ytype
  integer :: incy
  real(2), device :: c, s ! device or host variable
  type(cudaDataType) :: cstype
  type(cudaDataType) :: extype

2.6.15. cublasRotgEx

ROTG 构建 Givens 平面旋转

integer(4) function cublasRotgEx(h, a, b, abtype, &
      c, s, cstype, extype)
  type(cublasHandle) :: h
  real(2), device :: a, b  ! Type and kind as specified by abtype
  type(cudaDataType) :: abtype
  real(2), device :: c, s ! device or host variable
  type(cudaDataType) :: cstype
  type(cudaDataType) :: extype

2.6.16. cublasRotmEx

ROTM 应用修改后的 Givens 变换。

integer(4) function cublasRotmEx(h, n, x, xtype, incx, &
      y, ytype, incy, param, paramtype, extype)
  type(cublasHandle) :: h
  integer :: n
  real(2), device, dimension(*) :: x  ! Type and kind as specified by xtype
  type(cudaDataType) :: xtype
  integer :: incx
  real(2), device, dimension(*) :: y  ! Type and kind as specified by ytype
  type(cudaDataType) :: ytype
  integer :: incy
  real(2), device, dimension(*) :: param
  type(cudaDataType) :: paramtype
  type(cudaDataType) :: extype

2.6.17. cublasRotmgEx

ROTMG 构建修改后的 Givens 变换矩阵。

integer(4) function cublasRotmgEx(h, d1, d1type, d2, d2type, &
      x1, x1type, y1, y1type, param, paramtype, extype)
  type(cublasHandle) :: h
  real(2), device :: d1  ! Type and kind as specified by d1type
  type(cudaDataType) :: d1type
  real(2), device :: d2  ! Type and kind as specified by d2type
  type(cudaDataType) :: d2type
  real(2), device :: x1  ! Type and kind as specified by x1type
  type(cudaDataType) :: x1type
  real(2), device :: y1  ! Type and kind as specified by y1type
  type(cudaDataType) :: y1type
  real(2), device, dimension(*) :: param
  type(cudaDataType) :: paramtype
  type(cudaDataType) :: extype

2.6.18. cublasScalEx

SCAL 按常数缩放向量。

integer(4) function cublasScalEx(h, n, alpha, alphatype, &
      x, xtype, incx, extype)
  type(cublasHandle) :: h
  integer :: n
  real(2), device :: alpha
  type(cudaDataType) :: alphatype
  real(2), device, dimension(*) :: x
  type(cudaDataType) :: xtype
  integer :: incx
  type(cudaDataType) :: extype

2.6.19. cublasSwapEx

SWAP 交换两个向量。

integer(4) function cublasSwapEx(h, n, x, xtype, incx, &
      y, ytype, incy)
  type(cublasHandle) :: h
  integer :: n
  real(2), device, dimension(*) :: x
  type(cudaDataType) :: xtype
  integer :: incx
  real(2), device, dimension(*) :: y
  type(cudaDataType) :: ytype
  integer :: incy

2.6.20. cublasGemmEx

GEMM 执行矩阵-矩阵乘法运算 C := alpha*op( A )*op( B ) + beta*C,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量,而 A、B 和 C 是矩阵,其中 op( A ) 是 m 乘 k 矩阵,op( B ) 是 k 乘 n 矩阵,C 是 m 乘 n 矩阵。

alpha, beta 的数据类型主要遵循 computeType 参数。有关当前支持的数据类型组合,请参阅 cuBLAS 文档。

integer(4) function cublasGemmEx(h, transa, transb, m, n, k, alpha, &
      A, atype, lda, B, btype, ldb, beta, C, ctype, ldc, computeType, algo)
  type(cublasHandle) :: h
  integer :: transa, transb
  integer :: m, n, k
  real(2), device :: alpha ! device or host variable
  real(2), device :: A(lda,*)
  type(cudaDataType) :: atype
  integer :: lda
  real(2), device :: B(ldb,*)
  type(cudaDataType) :: btype
  integer :: ldb
  real(2), device :: beta ! device or host variable
  real(2), device :: C(ldc,*)
  type(cudaDataType) :: ctype
  integer :: ldc
  type(cublasComputeType) :: computeType  ! also accept integer
  type(cublasGemmAlgoType) :: algo        ! also accept integer

2.6.21. cublasGemmBatchedEx

GEMM 执行批量矩阵-矩阵乘法运算 C := alpha*op( A )*op( B ) + beta*C,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量,而 A、B 和 C 是矩阵,其中 op( A ) 是 m 乘 k 矩阵,op( B ) 是 k 乘 n 矩阵,C 是 m 乘 n 矩阵。

alpha, beta 的数据类型主要遵循 computeType 参数。有关当前支持的数据类型组合,请参阅 cuBLAS 文档。

integer(4) function cublasGemmBatchedEx(h, transa, transb, m, n, k, &
      alpha, Aarray, atype, lda, Barray, btype, ldb, beta, &
      Carray, ctype, ldc, batchCount, computeType, algo)
  type(cublasHandle) :: h
  integer :: transa, transb
  integer :: m, n, k
  real(2), device :: alpha ! device or host variable
  type(c_devptr), device :: Aarray(*)
  type(cudaDataType) :: atype
  integer :: lda
  type(c_devptr), device :: Barray(*)
  type(cudaDataType) :: btype
  integer :: ldb
  real(2), device :: beta ! device or host variable
  type(c_devptr), device :: Carray(*)
  type(cudaDataType) :: ctype
  integer :: ldc
  integer :: batchCount
  type(cublasComputeType) :: computeType  ! also accept integer
  type(cublasGemmAlgoType) :: algo        ! also accept integer

2.6.22. cublasGemmStridedBatchedEx

GEMM 执行批量矩阵-矩阵乘法运算 C := alpha*op( A )*op( B ) + beta*C,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量,而 A、B 和 C 是矩阵,其中 op( A ) 是 m 乘 k 矩阵,op( B ) 是 k 乘 n 矩阵,C 是 m 乘 n 矩阵。

alpha, beta 的数据类型主要遵循 computeType 参数。有关当前支持的数据类型组合,请参阅 cuBLAS 文档。

integer(4) function cublasGemmStridedBatchedEx(h, transa, transb, m, n, k, &
      alpha, A, atype, lda, strideA, B, btype, ldb, strideB, beta, &
      C, ctype, ldc, strideC, batchCount, computeType, algo)
  type(cublasHandle) :: h
  integer :: transa, transb
  integer :: m, n, k
  real(2), device :: alpha ! device or host variable
  real(2), device :: A(lda,*)
  type(cudaDataType) :: atype
  integer :: lda
  integer(8) :: strideA
  real(2), device :: B(ldb,*)
  type(cudaDataType) :: btype
  integer :: ldb
  integer(8) :: strideB
  real(2), device :: beta ! device or host variable
  real(2), device :: C(ldc,*)
  type(cudaDataType) :: ctype
  integer :: ldc
  integer(8) :: strideC
  integer :: batchCount
  type(cublasComputeType) :: computeType  ! also accept integer
  type(cublasGemmAlgoType) :: algo        ! also accept integer

2.7. CUBLAS V2 模块函数

本节包含 cuBLAS V2 模块函数的接口。用户可以通过在程序单元中插入行 use cublas_v2 来访问此模块。cublas_v2cublas 模块的主要区别之一是 cublas 入口点,例如 cublasIsamax 已更改为将句柄作为第一个参数。 cublas_v2 模块中的第二个区别是 v2 入口点,例如 cublasIsamax_v2 不会隐式处理用户的指针模式。程序员有责任调用 cublasSetPointerMode 来告知库标量参数是驻留在主机上还是设备上。v2 入口点的实际接口没有更改,并且未在本节中列出。

2.7.1. 单精度函数和子例程

本节包含单精度 BLAS 和 cuBLAS 函数和子例程的 V2 接口。

2.7.1.1. isamax

如果您使用 cublas_v2 模块,则 cublasIsamax 的接口将更改为以下内容

integer(4) function cublasIsamax(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  real(4), device, dimension(*) :: x
  integer :: incx
  integer, device :: res ! device or host variable

2.7.1.2. isamin

如果您使用 cublas_v2 模块,则 cublasIsamin 的接口将更改为以下内容

integer(4) function cublasIsamin(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  real(4), device, dimension(*) :: x
  integer :: incx
  integer, device :: res ! device or host variable

2.7.1.3. sasum

如果您使用 cublas_v2 模块,则 cublasSasum 的接口将更改为以下内容

integer(4) function cublasSasum(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  real(4), device, dimension(*) :: x
  integer :: incx
  real(4), device :: res ! device or host variable

2.7.1.4. saxpy

如果您使用 cublas_v2 模块,则 cublasSaxpy 的接口将更改为以下内容

integer(4) function cublasSaxpy(h, n, a, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  real(4), device :: a ! device or host variable
  real(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.1.5. scopy

如果您使用 cublas_v2 模块,则 cublasScopy 的接口将更改为以下内容

integer(4) function cublasScopy(h, n, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  real(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.1.6. sdot

如果您使用 cublas_v2 模块,则 cublasSdot 的接口将更改为以下内容

integer(4) function cublasSdot(h, n, x, incx, y, incy, res)
  type(cublasHandle) :: h
  integer :: n
  real(4), device, dimension(*) :: x, y
  integer :: incx, incy
  real(4), device :: res ! device or host variable

2.7.1.7. snrm2

如果您使用 cublas_v2 模块,则 cublasSnrm2 的接口将更改为以下内容

integer(4) function cublasSnrm2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  real(4), device, dimension(*) :: x
  integer :: incx
  real(4), device :: res ! device or host variable

2.7.1.8. srot

如果您使用 cublas_v2 模块,则 cublasSrot 的接口将更改为以下内容

integer(4) function cublasSrot(h, n, x, incx, y, incy, sc, ss)
  type(cublasHandle) :: h
  integer :: n
  real(4), device :: sc, ss ! device or host variable
  real(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.1.9. srotg

如果您使用 cublas_v2 模块,则 cublasSrotg 的接口将更改为以下内容

integer(4) function cublasSrotg(h, sa, sb, sc, ss)
  type(cublasHandle) :: h
  real(4), device :: sa, sb, sc, ss ! device or host variable

2.7.1.10. srotm

如果您使用 cublas_v2 模块,则 cublasSrotm 的接口将更改为以下内容

integer(4) function cublasSrotm(h, n, x, incx, y, incy, param)
  type(cublasHandle) :: h
  integer :: n
  real(4), device :: param(*) ! device or host variable
  real(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.1.11. srotmg

如果您使用 cublas_v2 模块,则 cublasSrotmg 的接口将更改为以下内容

integer(4) function cublasSrotmg(h, d1, d2, x1, y1, param)
  type(cublasHandle) :: h
  real(4), device :: d1, d2, x1, y1, param(*) ! device or host variable

2.7.1.12. sscal

如果您使用 cublas_v2 模块,则 cublasSscal 的接口将更改为以下内容

integer(4) function cublasSscal(h, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: n
  real(4), device :: a ! device or host variable
  real(4), device, dimension(*) :: x
  integer :: incx

2.7.1.13. sswap

如果您使用 cublas_v2 模块,则 cublasSswap 的接口将更改为以下内容

integer(4) function cublasSswap(h, n, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  real(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.1.14. sgbmv

如果您使用 cublas_v2 模块,则 cublasSgbmv 的接口将更改为以下内容

integer(4) function cublasSgbmv(h, t, m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: m, n, kl, ku, lda, incx, incy
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x, y
  real(4), device :: alpha, beta ! device or host variable

2.7.1.15. sgemv

如果您使用 cublas_v2 模块,则 cublasSgemv 的接口将更改为以下内容

integer(4) function cublasSgemv(h, t, m, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: m, n, lda, incx, incy
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x, y
  real(4), device :: alpha, beta ! device or host variable

2.7.1.16. sger

如果您使用 cublas_v2 模块,则 cublasSger 的接口将更改为以下内容

integer(4) function cublasSger(h, m, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: m, n, lda, incx, incy
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x, y
  real(4), device :: alpha ! device or host variable

2.7.1.17. ssbmv

如果您使用 cublas_v2 模块,则 cublasSsbmv 的接口将更改为以下内容

integer(4) function cublasSsbmv(h, t, n, k, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: k, n, lda, incx, incy
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x, y
  real(4), device :: alpha, beta ! device or host variable

2.7.1.18. sspmv

如果您使用 cublas_v2 模块,则 cublasSspmv 的接口将更改为以下内容

integer(4) function cublasSspmv(h, t, n, alpha, a, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy
  real(4), device, dimension(*) :: a, x, y
  real(4), device :: alpha, beta ! device or host variable

2.7.1.19. sspr

如果您使用 cublas_v2 模块,则 cublasSspr 的接口将更改为以下内容

integer(4) function cublasSspr(h, t, n, alpha, x, incx, a)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx
  real(4), device, dimension(*) :: a, x
  real(4), device :: alpha ! device or host variable

2.7.1.20. sspr2

如果您使用 cublas_v2 模块,则 cublasSspr2 的接口将更改为以下内容

integer(4) function cublasSspr2(h, t, n, alpha, x, incx, y, incy, a)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy
  real(4), device, dimension(*) :: a, x, y
  real(4), device :: alpha ! device or host variable

2.7.1.21. ssymv

如果您使用 cublas_v2 模块,则 cublasSsymv 的接口将更改为以下内容

integer(4) function cublasSsymv(h, uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: n, lda, incx, incy
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x, y
  real(4), device :: alpha, beta ! device or host variable

2.7.1.22. ssyr

如果您使用 cublas_v2 模块,则 cublasSsyr 的接口将更改为以下内容

integer(4) function cublasSsyr(h, t, n, alpha, x, incx, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, lda
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x
  real(4), device :: alpha ! device or host variable

2.7.1.23. ssyr2

如果您使用 cublas_v2 模块,则 cublasSsyr2 的接口将更改为以下内容

integer(4) function cublasSsyr2(h, t, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy, lda
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x, y
  real(4), device :: alpha ! device or host variable

2.7.1.24. stbmv

如果您使用 cublas_v2 模块,则 cublasStbmv 的接口将更改为以下内容

integer(4) function cublasStbmv(h, u, t, d, n, k, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, k, incx, lda
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x

2.7.1.25. stbsv

如果您使用 cublas_v2 模块,则 cublasStbsv 的接口将更改为以下内容

integer(4) function cublasStbsv(h, u, t, d, n, k, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, k, incx, lda
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x

2.7.1.26. stpmv

如果您使用 cublas_v2 模块,则 cublasStpmv 的接口将更改为以下内容

integer(4) function cublasStpmv(h, u, t, d, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx
  real(4), device, dimension(*) :: a, x

2.7.1.27. stpsv

如果您使用 cublas_v2 模块,则 cublasStpsv 的接口将更改为以下内容

integer(4) function cublasStpsv(h, u, t, d, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx
  real(4), device, dimension(*) :: a, x

2.7.1.28. strmv

如果您使用 cublas_v2 模块,则 cublasStrmv 的接口将更改为以下内容

integer(4) function cublasStrmv(h, u, t, d, n, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx, lda
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x

2.7.1.29. strsv

如果您使用 cublas_v2 模块,则 cublasStrsv 的接口将更改为以下内容

integer(4) function cublasStrsv(h, u, t, d, n, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx, lda
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(*) :: x

2.7.1.30. sgemm

如果您使用 cublas_v2 模块,则 cublasSgemm 的接口将更改为以下内容

integer(4) function cublasSgemm(h, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: transa, transb
  integer :: m, n, k, lda, ldb, ldc
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldb, *) :: b
  real(4), device, dimension(ldc, *) :: c
  real(4), device :: alpha, beta ! device or host variable

2.7.1.31. ssymm

如果您使用 cublas_v2 模块,则 cublasSsymm 的接口将更改为以下内容

integer(4) function cublasSsymm(h, side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo
  integer :: m, n, lda, ldb, ldc
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldb, *) :: b
  real(4), device, dimension(ldc, *) :: c
  real(4), device :: alpha, beta ! device or host variable

2.7.1.32. ssyrk

如果您使用 cublas_v2 模块,则 cublasSsyrk 的接口将更改为以下内容

integer(4) function cublasSsyrk(h, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldc
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldc, *) :: c
  real(4), device :: alpha, beta ! device or host variable

2.7.1.33. ssyr2k

如果您使用 cublas_v2 模块,则 cublasSsyr2k 的接口将更改为以下内容

integer(4) function cublasSsyr2k(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldb, *) :: b
  real(4), device, dimension(ldc, *) :: c
  real(4), device :: alpha, beta ! device or host variable

2.7.1.34. ssyrkx

如果您使用 cublas_v2 模块,则 cublasSsyrkx 的接口将更改为以下内容

integer(4) function cublasSsyrkx(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldb, *) :: b
  real(4), device, dimension(ldc, *) :: c
  real(4), device :: alpha, beta ! device or host variable

2.7.1.35. strmm

如果您使用 cublas_v2 模块,则 cublasStrmm 的接口将更改为以下内容

integer(4) function cublasStrmm(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo, transa, diag
  integer :: m, n, lda, ldb, ldc
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldb, *) :: b
  real(4), device, dimension(ldc, *) :: c
  real(4), device :: alpha ! device or host variable

2.7.1.36. strsm

如果您使用 cublas_v2 模块,则 cublasStrsm 的接口将更改为以下内容

integer(4) function cublasStrsm(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  type(cublasHandle) :: h
  integer :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  real(4), device, dimension(lda, *) :: a
  real(4), device, dimension(ldb, *) :: b
  real(4), device :: alpha ! device or host variable

2.7.2. 双精度函数和子例程

本节包含双精度 BLAS 和 cuBLAS 函数和子例程的 V2 接口。

2.7.2.1. idamax

如果您使用 cublas_v2 模块,则 cublasIdamax 的接口将更改为以下内容

integer(4) function cublasIdamax(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  real(8), device, dimension(*) :: x
  integer :: incx
  integer, device :: res ! device or host variable

2.7.2.2. idamin

如果您使用 cublas_v2 模块,则 cublasIdamin 的接口将更改为以下内容

integer(4) function cublasIdamin(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  real(8), device, dimension(*) :: x
  integer :: incx
  integer, device :: res ! device or host variable

2.7.2.3. dasum

如果您使用 cublas_v2 模块,则 cublasDasum 的接口将更改为以下内容

integer(4) function cublasDasum(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  real(8), device, dimension(*) :: x
  integer :: incx
  real(8), device :: res ! device or host variable

2.7.2.4. daxpy

如果您使用 cublas_v2 模块,则 cublasDaxpy 的接口将更改为以下内容

integer(4) function cublasDaxpy(h, n, a, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  real(8), device :: a ! device or host variable
  real(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.2.5. dcopy

如果您使用 cublas_v2 模块,则 cublasDcopy 的接口将更改为以下内容

integer(4) function cublasDcopy(h, n, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  real(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.2.6. ddot

如果您使用 cublas_v2 模块,则 cublasDdot 的接口将更改为以下内容

integer(4) function cublasDdot(h, n, x, incx, y, incy, res)
  type(cublasHandle) :: h
  integer :: n
  real(8), device, dimension(*) :: x, y
  integer :: incx, incy
  real(8), device :: res ! device or host variable

2.7.2.7. dnrm2

如果您使用 cublas_v2 模块,则 cublasDnrm2 的接口将更改为以下内容

integer(4) function cublasDnrm2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  real(8), device, dimension(*) :: x
  integer :: incx
  real(8), device :: res ! device or host variable

2.7.2.8. drot

如果您使用 cublas_v2 模块,则 cublasDrot 的接口将更改为以下内容

integer(4) function cublasDrot(h, n, x, incx, y, incy, sc, ss)
  type(cublasHandle) :: h
  integer :: n
  real(8), device :: sc, ss ! device or host variable
  real(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.2.9. drotg

如果您使用 cublas_v2 模块,则 cublasDrotg 的接口将更改为以下内容

integer(4) function cublasDrotg(h, sa, sb, sc, ss)
  type(cublasHandle) :: h
  real(8), device :: sa, sb, sc, ss ! device or host variable

2.7.2.10. drotm

如果您使用 cublas_v2 模块,则 cublasDrotm 的接口将更改为以下内容

integer(4) function cublasDrotm(h, n, x, incx, y, incy, param)
  type(cublasHandle) :: h
  integer :: n
  real(8), device :: param(*) ! device or host variable
  real(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.2.11. drotmg

如果您使用 cublas_v2 模块,则 cublasDrotmg 的接口将更改为以下内容

integer(4) function cublasDrotmg(h, d1, d2, x1, y1, param)
  type(cublasHandle) :: h
  real(8), device :: d1, d2, x1, y1, param(*) ! device or host variable

2.7.2.12. dscal

如果您使用 cublas_v2 模块,则 cublasDscal 的接口将更改为以下内容

integer(4) function cublasDscal(h, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: n
  real(8), device :: a ! device or host variable
  real(8), device, dimension(*) :: x
  integer :: incx

2.7.2.13. dswap

如果您使用 cublas_v2 模块,则 cublasDswap 的接口将更改为以下内容

integer(4) function cublasDswap(h, n, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  real(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.2.14. dgbmv

如果您使用 cublas_v2 模块,则 cublasDgbmv 的接口将更改为以下内容

integer(4) function cublasDgbmv(h, t, m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: m, n, kl, ku, lda, incx, incy
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x, y
  real(8), device :: alpha, beta ! device or host variable

2.7.2.15. dgemv

如果您使用 cublas_v2 模块,则 cublasDgemv 的接口将更改为以下内容

integer(4) function cublasDgemv(h, t, m, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: m, n, lda, incx, incy
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x, y
  real(8), device :: alpha, beta ! device or host variable

2.7.2.16. dger

如果您使用 cublas_v2 模块,则 cublasDger 的接口将更改为以下内容

integer(4) function cublasDger(h, m, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: m, n, lda, incx, incy
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x, y
  real(8), device :: alpha ! device or host variable

2.7.2.17. dsbmv

如果您使用 cublas_v2 模块,则 cublasDsbmv 的接口将更改为以下内容

integer(4) function cublasDsbmv(h, t, n, k, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: k, n, lda, incx, incy
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x, y
  real(8), device :: alpha, beta ! device or host variable

2.7.2.18. dspmv

如果您使用 cublas_v2 模块,则 cublasDspmv 的接口将更改为以下内容

integer(4) function cublasDspmv(h, t, n, alpha, a, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy
  real(8), device, dimension(*) :: a, x, y
  real(8), device :: alpha, beta ! device or host variable

2.7.2.19. dspr

如果您使用 cublas_v2 模块,则 cublasDspr 的接口将更改为以下内容

integer(4) function cublasDspr(h, t, n, alpha, x, incx, a)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx
  real(8), device, dimension(*) :: a, x
  real(8), device :: alpha ! device or host variable

2.7.2.20. dspr2

如果您使用 cublas_v2 模块,则 cublasDspr2 的接口将更改为以下内容

integer(4) function cublasDspr2(h, t, n, alpha, x, incx, y, incy, a)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy
  real(8), device, dimension(*) :: a, x, y
  real(8), device :: alpha ! device or host variable

2.7.2.21. dsymv

如果您使用 cublas_v2 模块,则 cublasDsymv 的接口将更改为以下内容

integer(4) function cublasDsymv(h, uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: n, lda, incx, incy
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x, y
  real(8), device :: alpha, beta ! device or host variable

2.7.2.22. dsyr

如果您使用 cublas_v2 模块,则 cublasDsyr 的接口将更改为以下内容

integer(4) function cublasDsyr(h, t, n, alpha, x, incx, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, lda
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x
  real(8), device :: alpha ! device or host variable

2.7.2.23. dsyr2

如果您使用 cublas_v2 模块,则 cublasDsyr2 的接口将更改为以下内容

integer(4) function cublasDsyr2(h, t, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy, lda
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x, y
  real(8), device :: alpha ! device or host variable

2.7.2.24. dtbmv

如果您使用 cublas_v2 模块,则 cublasDtbmv 的接口将更改为以下内容

integer(4) function cublasDtbmv(h, u, t, d, n, k, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, k, incx, lda
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x

2.7.2.25. dtbsv

如果您使用 cublas_v2 模块,则 cublasDtbsv 的接口将更改为以下内容

integer(4) function cublasDtbsv(h, u, t, d, n, k, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, k, incx, lda
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x

2.7.2.26. dtpmv

如果您使用 cublas_v2 模块,则 cublasDtpmv 的接口将更改为以下内容

integer(4) function cublasDtpmv(h, u, t, d, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx
  real(8), device, dimension(*) :: a, x

2.7.2.27. dtpsv

如果您使用 cublas_v2 模块,则 cublasDtpsv 的接口将更改为以下内容

integer(4) function cublasDtpsv(h, u, t, d, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx
  real(8), device, dimension(*) :: a, x

2.7.2.28. dtrmv

如果您使用 cublas_v2 模块,则 cublasDtrmv 的接口将更改为以下内容

integer(4) function cublasDtrmv(h, u, t, d, n, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx, lda
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x

2.7.2.29. dtrsv

如果您使用 cublas_v2 模块,则 cublasDtrsv 的接口将更改为以下内容

integer(4) function cublasDtrsv(h, u, t, d, n, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx, lda
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(*) :: x

2.7.2.30. dgemm

如果您使用 cublas_v2 模块,则 cublasDgemm 的接口将更改为以下内容

integer(4) function cublasDgemm(h, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: transa, transb
  integer :: m, n, k, lda, ldb, ldc
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldb, *) :: b
  real(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha, beta ! device or host variable

2.7.2.31. dsymm

如果您使用 cublas_v2 模块,则 cublasDsymm 的接口将更改为以下内容

integer(4) function cublasDsymm(h, side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo
  integer :: m, n, lda, ldb, ldc
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldb, *) :: b
  real(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha, beta ! device or host variable

2.7.2.32. dsyrk

如果您使用 cublas_v2 模块,则 cublasDsyrk 的接口将更改为以下内容

integer(4) function cublasDsyrk(h, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldc
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha, beta ! device or host variable

2.7.2.33. dsyr2k

如果您使用 cublas_v2 模块,则 cublasDsyr2k 的接口将更改为以下内容

integer(4) function cublasDsyr2k(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldb, *) :: b
  real(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha, beta ! device or host variable

2.7.2.34. dsyrkx

如果您使用 cublas_v2 模块,则 cublasDsyrkx 的接口将更改为以下内容

integer(4) function cublasDsyrkx(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldb, *) :: b
  real(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha, beta ! device or host variable

2.7.2.35. dtrmm

如果您使用 cublas_v2 模块,则 cublasDtrmm 的接口将更改为以下内容

integer(4) function cublasDtrmm(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo, transa, diag
  integer :: m, n, lda, ldb, ldc
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldb, *) :: b
  real(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha ! device or host variable

2.7.2.36. dtrsm

如果您使用 cublas_v2 模块,则 cublasDtrsm 的接口将更改为以下内容

integer(4) function cublasDtrsm(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  type(cublasHandle) :: h
  integer :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  real(8), device, dimension(lda, *) :: a
  real(8), device, dimension(ldb, *) :: b
  real(8), device :: alpha ! device or host variable

2.7.3. 单精度复数函数和子例程

本节包含单精度复数 BLAS 和 cuBLAS 函数和子例程的 V2 接口。

2.7.3.1. icamax

如果您使用 cublas_v2 模块,则 cublasIcamax 的接口将更改为以下内容

integer(4) function cublasIcamax(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device, dimension(*) :: x
  integer :: incx
  integer, device :: res ! device or host variable

2.7.3.2. icamin

如果您使用 cublas_v2 模块,则 cublasIcamin 的接口将更改为以下内容

integer(4) function cublasIcamin(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device, dimension(*) :: x
  integer :: incx
  integer, device :: res ! device or host variable

2.7.3.3. scasum

如果您使用 cublas_v2 模块,则 cublasScasum 的接口将更改为以下内容

integer(4) function cublasScasum(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device, dimension(*) :: x
  integer :: incx
  real(4), device :: res ! device or host variable

2.7.3.4. caxpy

如果您使用 cublas_v2 模块,则 cublasCaxpy 的接口将更改为以下内容

integer(4) function cublasCaxpy(h, n, a, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device :: a ! device or host variable
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.3.5. ccopy

如果您使用 cublas_v2 模块,则 cublasCcopy 的接口将更改为以下内容

integer(4) function cublasCcopy(h, n, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.3.6. cdotc

如果您使用 cublas_v2 模块,则 cublasCdotc 的接口将更改为以下内容

integer(4) function cublasCdotc(h, n, x, incx, y, incy, res)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy
  complex(4), device :: res ! device or host variable

2.7.3.7. cdotu

如果您使用 cublas_v2 模块,则 cublasCdotu 的接口将更改为以下内容

integer(4) function cublasCdotu(h, n, x, incx, y, incy, res)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy
  complex(4), device :: res ! device or host variable

2.7.3.8. scnrm2

如果您使用 cublas_v2 模块,则 cublasScnrm2 的接口将更改为以下内容

integer(4) function cublasScnrm2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device, dimension(*) :: x
  integer :: incx
  real(4), device :: res ! device or host variable

2.7.3.9. crot

如果您使用 cublas_v2 模块,则 cublasCrot 的接口将更改为以下内容

integer(4) function cublasCrot(h, n, x, incx, y, incy, sc, ss)
  type(cublasHandle) :: h
  integer :: n
  real(4), device :: sc ! device or host variable
  complex(4), device :: ss ! device or host variable
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.3.10. csrot

如果您使用 cublas_v2 模块,则 cublasCsrot 的接口将更改为以下内容

integer(4) function cublasCsrot(h, n, x, incx, y, incy, sc, ss)
  type(cublasHandle) :: h
  integer :: n
  real(4), device :: sc, ss ! device or host variable
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.3.11. crotg

如果您使用 cublas_v2 模块,则 cublasCrotg 的接口将更改为以下内容

integer(4) function cublasCrotg(h, sa, sb, sc, ss)
  type(cublasHandle) :: h
  complex(4), device :: sa, sb, ss ! device or host variable
  real(4), device :: sc ! device or host variable

2.7.3.12. cscal

如果您使用 cublas_v2 模块,则 cublasCscal 的接口将更改为以下内容

integer(4) function cublasCscal(h, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device :: a ! device or host variable
  complex(4), device, dimension(*) :: x
  integer :: incx

2.7.3.13. csscal

如果您使用 cublas_v2 模块,则 cublasCsscal 的接口将更改为以下内容

integer(4) function cublasCsscal(h, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: n
  real(4), device :: a ! device or host variable
  complex(4), device, dimension(*) :: x
  integer :: incx

2.7.3.14. cswap

如果您使用 cublas_v2 模块,则 cublasCswap 的接口将更改为以下内容

integer(4) function cublasCswap(h, n, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  complex(4), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.3.15. cgbmv

如果您使用 cublas_v2 模块,则 cublasCgbmv 的接口将更改为以下内容

integer(4) function cublasCgbmv(h, t, m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: m, n, kl, ku, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha, beta ! device or host variable

2.7.3.16. cgemv

如果您使用 cublas_v2 模块,则 cublasCgemv 的接口将更改为以下内容

integer(4) function cublasCgemv(h, t, m, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: m, n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha, beta ! device or host variable

2.7.3.17. cgerc

如果您使用 cublas_v2 模块,则 cublasCgerc 的接口将更改为以下内容

integer(4) function cublasCgerc(h, m, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: m, n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha ! device or host variable

2.7.3.18. cgeru

如果您使用 cublas_v2 模块,则 cublasCgeru 的接口将更改为以下内容

integer(4) function cublasCgeru(h, m, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: m, n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha ! device or host variable

2.7.3.19. csymv

如果您使用 cublas_v2 模块,则 cublasCsymv 的接口将更改为以下内容

integer(4) function cublasCsymv(h, uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha, beta ! device or host variable

2.7.3.20. csyr

如果您使用 cublas_v2 模块,则 cublasCsyr 的接口将更改为以下内容

integer(4) function cublasCsyr(h, t, n, alpha, x, incx, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, lda
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x
  complex(4), device :: alpha ! device or host variable

2.7.3.21. csyr2

如果您使用 cublas_v2 模块,则 cublasCsyr2 的接口将更改为以下内容

integer(4) function cublasCsyr2(h, t, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy, lda
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha ! device or host variable

2.7.3.22. ctbmv

如果您使用 cublas_v2 模块,则 cublasCtbmv 的接口将更改为以下内容

integer(4) function cublasCtbmv(h, u, t, d, n, k, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, k, incx, lda
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x

2.7.3.23. ctbsv

如果您使用 cublas_v2 模块,则 cublasCtbsv 的接口将更改为以下内容

integer(4) function cublasCtbsv(h, u, t, d, n, k, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, k, incx, lda
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x

2.7.3.24. ctpmv

如果您使用 cublas_v2 模块,则 cublasCtpmv 的接口将更改为以下内容

integer(4) function cublasCtpmv(h, u, t, d, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx
  complex(4), device, dimension(*) :: a, x

2.7.3.25. ctpsv

如果您使用 cublas_v2 模块,则 cublasCtpsv 的接口将更改为以下内容

integer(4) function cublasCtpsv(h, u, t, d, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx
  complex(4), device, dimension(*) :: a, x

2.7.3.26. ctrmv

如果您使用 cublas_v2 模块,则 cublasCtrmv 的接口将更改为以下内容

integer(4) function cublasCtrmv(h, u, t, d, n, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx, lda
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x

2.7.3.27. ctrsv

如果您使用 cublas_v2 模块,则 cublasCtrsv 的接口将更改为以下内容

integer(4) function cublasCtrsv(h, u, t, d, n, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx, lda
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x

2.7.3.28. chbmv

如果您使用 cublas_v2 模块,则 cublasChbmv 的接口将更改为以下内容

integer(4) function cublasChbmv(h, uplo, n, k, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: k, n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha, beta ! device or host variable

2.7.3.29. chemv

如果您使用 cublas_v2 模块,则 cublasChemv 的接口将更改为以下内容

integer(4) function cublasChemv(h, uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: n, lda, incx, incy
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(*) :: x, y
  complex(4), device :: alpha, beta ! device or host variable

2.7.3.30. chpmv

如果您使用 cublas_v2 模块,则 cublasChpmv 的接口将更改为以下内容

integer(4) function cublasChpmv(h, uplo, n, alpha, a, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: n, incx, incy
  complex(4), device, dimension(*) :: a, x, y
  complex(4), device :: alpha, beta ! device or host variable

2.7.3.31. cher

如果您使用 cublas_v2 模块,则 cublasCher 的接口将更改为以下内容

integer(4) function cublasCher(h, t, n, alpha, x, incx, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, lda
  complex(4), device, dimension(*) :: a, x
  real(4), device :: alpha ! device or host variable

2.7.3.32. cher2

如果您使用 cublas_v2 模块,则 cublasCher2 的接口将更改为以下内容

integer(4) function cublasCher2(h, t, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy, lda
  complex(4), device, dimension(*) :: a, x, y
  complex(4), device :: alpha ! device or host variable

2.7.3.33. chpr

如果您使用 cublas_v2 模块,则 cublasChpr 的接口将更改为以下内容

integer(4) function cublasChpr(h, t, n, alpha, x, incx, a)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx
  complex(4), device, dimension(*) :: a, x
  real(4), device :: alpha ! device or host variable

2.7.3.34. chpr2

如果您使用 cublas_v2 模块,则 cublasChpr2 的接口将更改为以下内容

integer(4) function cublasChpr2(h, t, n, alpha, x, incx, y, incy, a)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy
  complex(4), device, dimension(*) :: a, x, y
  complex(4), device :: alpha ! device or host variable

2.7.3.35. cgemm

如果您使用 cublas_v2 模块,则 cublasCgemm 的接口将更改为以下内容

integer(4) function cublasCgemm(h, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: transa, transb
  integer :: m, n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha, beta ! device or host variable

2.7.3.36. csymm

如果您使用 cublas_v2 模块,则 cublasCsymm 的接口将更改为以下内容

integer(4) function cublasCsymm(h, side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo
  integer :: m, n, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha, beta ! device or host variable

2.7.3.37. csyrk

如果您使用 cublas_v2 模块,则 cublasCsyrk 的接口将更改为以下内容

integer(4) function cublasCsyrk(h, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha, beta ! device or host variable

2.7.3.38. csyr2k

如果您使用 cublas_v2 模块,则 cublasCsyr2k 的接口将更改为以下内容

integer(4) function cublasCsyr2k(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha, beta ! device or host variable

2.7.3.39. csyrkx

如果您使用 cublas_v2 模块,则 cublasCsyrkx 的接口将更改为以下内容

integer(4) function cublasCsyrkx(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha, beta ! device or host variable

2.7.3.40. ctrmm

如果您使用 cublas_v2 模块,则 cublasCtrmm 的接口将更改为以下内容

integer(4) function cublasCtrmm(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo, transa, diag
  integer :: m, n, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha ! device or host variable

2.7.3.41. ctrsm

如果您使用 cublas_v2 模块,则 cublasCtrsm 的接口将更改为以下内容

integer(4) function cublasCtrsm(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  type(cublasHandle) :: h
  integer :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device :: alpha ! device or host variable

2.7.3.42. chemm

如果您使用 cublas_v2 模块,则 cublasChemm 的接口将更改为以下内容

integer(4) function cublasChemm(h, side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo
  integer :: m, n, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha, beta ! device or host variable

2.7.3.43. cherk

如果您使用 cublas_v2 模块,则 cublasCherk 的接口将更改为以下内容

integer(4) function cublasCherk(h, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldc, *) :: c
  real(4), device :: alpha, beta ! device or host variable

2.7.3.44. cher2k

如果您使用 cublas_v2 模块,则 cublasCher2k 的接口将更改为以下内容

integer(4) function cublasCher2k(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha ! device or host variable
  real(4), device :: beta ! device or host variable

2.7.3.45. cherkx

如果您使用 cublas_v2 模块,则 cublasCherkx 的接口将更改为以下内容

integer(4) function cublasCherkx(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(4), device, dimension(lda, *) :: a
  complex(4), device, dimension(ldb, *) :: b
  complex(4), device, dimension(ldc, *) :: c
  complex(4), device :: alpha ! device or host variable
  real(4), device :: beta ! device or host variable

2.7.4. 双精度复数函数和子例程

本节包含双精度复数 BLAS 和 cuBLAS 函数与子例程的 V2 接口。

2.7.4.1. izamax

如果您使用 cublas_v2 模块,则 cublasIzamax 的接口将更改为以下内容

integer(4) function cublasIzamax(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device, dimension(*) :: x
  integer :: incx
  integer, device :: res ! device or host variable

2.7.4.2. izamin

如果您使用 cublas_v2 模块,则 cublasIzamin 的接口将更改为以下内容

integer(4) function cublasIzamin(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device, dimension(*) :: x
  integer :: incx
  integer, device :: res ! device or host variable

2.7.4.3. dzasum

如果您使用 cublas_v2 模块,则 cublasDzasum 的接口将更改为以下内容

integer(4) function cublasDzasum(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device, dimension(*) :: x
  integer :: incx
  real(8), device :: res ! device or host variable

2.7.4.4. zaxpy

如果您使用 cublas_v2 模块,则 cublasZaxpy 的接口将更改为以下内容

integer(4) function cublasZaxpy(h, n, a, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device :: a ! device or host variable
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.4.5. zcopy

如果您使用 cublas_v2 模块,则 cublasZcopy 的接口将更改为以下内容

integer(4) function cublasZcopy(h, n, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.4.6. zdotc

如果您使用 cublas_v2 模块,则 cublasZdotc 的接口将更改为以下内容

integer(4) function cublasZdotc(h, n, x, incx, y, incy, res)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy
  complex(8), device :: res ! device or host variable

2.7.4.7. zdotu

如果您使用 cublas_v2 模块,则 cublasZdotu 的接口将更改为以下内容

integer(4) function cublasZdotu(h, n, x, incx, y, incy, res)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy
  complex(8), device :: res ! device or host variable

2.7.4.8. dznrm2

如果您使用 cublas_v2 模块,则 cublasDznrm2 的接口将更改为以下内容

integer(4) function cublasDznrm2(h, n, x, incx, res)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device, dimension(*) :: x
  integer :: incx
  real(8), device :: res ! device or host variable

2.7.4.9. zrot

如果您使用 cublas_v2 模块,则 cublasZrot 的接口将更改为以下内容

integer(4) function cublasZrot(h, n, x, incx, y, incy, sc, ss)
  type(cublasHandle) :: h
  integer :: n
  real(8), device :: sc ! device or host variable
  complex(8), device :: ss ! device or host variable
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.4.10. zsrot

如果您使用 cublas_v2 模块,则 cublasZsrot 的接口将更改为以下内容

integer(4) function cublasZsrot(h, n, x, incx, y, incy, sc, ss)
  type(cublasHandle) :: h
  integer :: n
  real(8), device :: sc, ss ! device or host variable
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.4.11. zrotg

如果您使用 cublas_v2 模块,则 cublasZrotg 的接口将更改为以下内容

integer(4) function cublasZrotg(h, sa, sb, sc, ss)
  type(cublasHandle) :: h
  complex(8), device :: sa, sb, ss ! device or host variable
  real(8), device :: sc ! device or host variable

2.7.4.12. zscal

如果您使用 cublas_v2 模块,则 cublasZscal 的接口将更改为以下内容

integer(4) function cublasZscal(h, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device :: a ! device or host variable
  complex(8), device, dimension(*) :: x
  integer :: incx

2.7.4.13. zdscal

如果您使用 cublas_v2 模块,则 cublasZdscal 的接口将更改为以下内容

integer(4) function cublasZdscal(h, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: n
  real(8), device :: a ! device or host variable
  complex(8), device, dimension(*) :: x
  integer :: incx

2.7.4.14. zswap

如果您使用 cublas_v2 模块,则 cublasZswap 的接口将更改为以下内容

integer(4) function cublasZswap(h, n, x, incx, y, incy)
  type(cublasHandle) :: h
  integer :: n
  complex(8), device, dimension(*) :: x, y
  integer :: incx, incy

2.7.4.15. zgbmv

如果您使用 cublas_v2 模块,则 cublasZgbmv 的接口将更改为以下内容

integer(4) function cublasZgbmv(h, t, m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: m, n, kl, ku, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha, beta ! device or host variable

2.7.4.16. zgemv

如果您使用 cublas_v2 模块,则 cublasZgemv 的接口将更改为以下内容

integer(4) function cublasZgemv(h, t, m, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: t
  integer :: m, n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha, beta ! device or host variable

2.7.4.17. zgerc

如果您使用 cublas_v2 模块,则 cublasZgerc 的接口将更改为以下内容

integer(4) function cublasZgerc(h, m, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: m, n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha ! device or host variable

2.7.4.18. zgeru

如果您使用 cublas_v2 模块,则 cublasZgeru 的接口将更改为以下内容

integer(4) function cublasZgeru(h, m, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: m, n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha ! device or host variable

2.7.4.19. zsymv

如果您使用 cublas_v2 模块,则 cublasZsymv 的接口将更改为以下内容

integer(4) function cublasZsymv(h, uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha, beta ! device or host variable

2.7.4.20. zsyr

如果您使用 cublas_v2 模块,则 cublasZsyr 的接口将更改为以下内容

integer(4) function cublasZsyr(h, t, n, alpha, x, incx, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, lda
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x
  complex(8), device :: alpha ! device or host variable

2.7.4.21. zsyr2

如果您使用 cublas_v2 模块,则 cublasZsyr2 的接口将更改为以下内容

integer(4) function cublasZsyr2(h, t, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy, lda
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha ! device or host variable

2.7.4.22. ztbmv

如果您使用 cublas_v2 模块,则 cublasZtbmv 的接口将更改为以下内容

integer(4) function cublasZtbmv(h, u, t, d, n, k, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, k, incx, lda
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x

2.7.4.23. ztbsv

如果您使用 cublas_v2 模块,则 cublasZtbsv 的接口将更改为以下内容

integer(4) function cublasZtbsv(h, u, t, d, n, k, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, k, incx, lda
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x

2.7.4.24. ztpmv

如果您使用 cublas_v2 模块,则 cublasZtpmv 的接口将更改为以下内容

integer(4) function cublasZtpmv(h, u, t, d, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx
  complex(8), device, dimension(*) :: a, x

2.7.4.25. ztpsv

如果您使用 cublas_v2 模块,则 cublasZtpsv 的接口将更改为以下内容

integer(4) function cublasZtpsv(h, u, t, d, n, a, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx
  complex(8), device, dimension(*) :: a, x

2.7.4.26. ztrmv

如果您使用 cublas_v2 模块,则 cublasZtrmv 的接口将更改为以下内容

integer(4) function cublasZtrmv(h, u, t, d, n, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx, lda
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x

2.7.4.27. ztrsv

如果您使用 cublas_v2 模块,则 cublasZtrsv 的接口将更改为以下内容

integer(4) function cublasZtrsv(h, u, t, d, n, a, lda, x, incx)
  type(cublasHandle) :: h
  integer :: u, t, d
  integer :: n, incx, lda
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x

2.7.4.28. zhbmv

如果您使用 cublas_v2 模块,则 cublasZhbmv 的接口将更改为以下内容

integer(4) function cublasZhbmv(h, uplo, n, k, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: k, n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha, beta ! device or host variable

2.7.4.29. zhemv

如果您使用 cublas_v2 模块,则 cublasZhemv 的接口将更改为以下内容

integer(4) function cublasZhemv(h, uplo, n, alpha, a, lda, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: n, lda, incx, incy
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(*) :: x, y
  complex(8), device :: alpha, beta ! device or host variable

2.7.4.30. zhpmv

如果您使用 cublas_v2 模块,则 cublasZhpmv 的接口将更改为以下内容

integer(4) function cublasZhpmv(h, uplo, n, alpha, a, x, incx, beta, y, incy)
  type(cublasHandle) :: h
  integer :: uplo
  integer :: n, incx, incy
  complex(8), device, dimension(*) :: a, x, y
  complex(8), device :: alpha, beta ! device or host variable

2.7.4.31. zher

如果您使用 cublas_v2 模块,则 cublasZher 的接口将更改为以下内容

integer(4) function cublasZher(h, t, n, alpha, x, incx, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, lda
  complex(8), device, dimension(*) :: a, x
  real(8), device :: alpha ! device or host variable

2.7.4.32. zher2

如果您使用 cublas_v2 模块,则 cublasZher2 的接口将更改为以下内容

integer(4) function cublasZher2(h, t, n, alpha, x, incx, y, incy, a, lda)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy, lda
  complex(8), device, dimension(*) :: a, x, y
  complex(8), device :: alpha ! device or host variable

2.7.4.33. zhpr

如果您使用 cublas_v2 模块,则 cublasZhpr 的接口将更改为以下内容

integer(4) function cublasZhpr(h, t, n, alpha, x, incx, a)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx
  complex(8), device, dimension(*) :: a, x
  real(8), device :: alpha ! device or host variable

2.7.4.34. zhpr2

如果您使用 cublas_v2 模块,则 cublasZhpr2 的接口将更改为以下内容

integer(4) function cublasZhpr2(h, t, n, alpha, x, incx, y, incy, a)
  type(cublasHandle) :: h
  integer :: t
  integer :: n, incx, incy
  complex(8), device, dimension(*) :: a, x, y
  complex(8), device :: alpha ! device or host variable

2.7.4.35. zgemm

如果您使用 cublas_v2 模块,则 cublasZgemm 的接口将更改为以下内容

integer(4) function cublasZgemm(h, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: transa, transb
  integer :: m, n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha, beta ! device or host variable

2.7.4.36. zsymm

如果您使用 cublas_v2 模块,则 cublasZsymm 的接口将更改为以下内容

integer(4) function cublasZsymm(h, side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo
  integer :: m, n, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha, beta ! device or host variable

2.7.4.37. zsyrk

如果您使用 cublas_v2 模块,则 cublasZsyrk 的接口将更改为以下内容

integer(4) function cublasZsyrk(h, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha, beta ! device or host variable

2.7.4.38. zsyr2k

如果您使用 cublas_v2 模块,则 cublasZsyr2k 的接口将更改为以下内容

integer(4) function cublasZsyr2k(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha, beta ! device or host variable

2.7.4.39. zsyrkx

如果您使用 cublas_v2 模块,则 cublasZsyrkx 的接口将更改为以下内容

integer(4) function cublasZsyrkx(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha, beta ! device or host variable

2.7.4.40. ztrmm

如果您使用 cublas_v2 模块,则 cublasZtrmm 的接口将更改为以下内容

integer(4) function cublasZtrmm(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo, transa, diag
  integer :: m, n, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha ! device or host variable

2.7.4.41. ztrsm

如果您使用 cublas_v2 模块,则 cublasZtrsm 的接口将更改为以下内容

integer(4) function cublasZtrsm(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  type(cublasHandle) :: h
  integer :: side, uplo, transa, diag
  integer :: m, n, lda, ldb
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device :: alpha ! device or host variable

2.7.4.42. zhemm

如果您使用 cublas_v2 模块,则 cublasZhemm 的接口将更改为以下内容

integer(4) function cublasZhemm(h, side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: side, uplo
  integer :: m, n, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha, beta ! device or host variable

2.7.4.43. zherk

如果您使用 cublas_v2 模块,则 cublasZherk 的接口将更改为以下内容

integer(4) function cublasZherk(h, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldc, *) :: c
  real(8), device :: alpha, beta ! device or host variable

2.7.4.44. zher2k

如果您使用 cublas_v2 模块,则 cublasZher2k 的接口将更改为以下内容

integer(4) function cublasZher2k(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha ! device or host variable
  real(8), device :: beta ! device or host variable

2.7.4.45. zherkx

如果您使用 cublas_v2 模块,则 cublasZherkx 的接口将更改为以下内容

integer(4) function cublasZherkx(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasHandle) :: h
  integer :: uplo, trans
  integer :: n, k, lda, ldb, ldc
  complex(8), device, dimension(lda, *) :: a
  complex(8), device, dimension(ldb, *) :: b
  complex(8), device, dimension(ldc, *) :: c
  complex(8), device :: alpha ! device or host variable
  real(8), device :: beta ! device or host variable

2.8. CUBLAS XT 模块函数

本节包含 cuBLAS XT 模块函数的接口。用户可以通过在程序单元中插入代码行 use cublasXt 来访问此模块。cublasXt 库是一个主机端库,支持多个 GPU。这是一个示例

subroutine testxt(n)
use cublasXt
complex*16 :: a(n,n), b(n,n), c(n,n), alpha, beta
type(cublasXtHandle) :: h
integer ndevices(1)
a = cmplx(1.0d0,0.0d0)
b = cmplx(2.0d0,0.0d0)
c = cmplx(-1.0d0,0.0d0)
alpha = cmplx(1.0d0,0.0d0)
beta = cmplx(0.0d0,0.0d0)
istat = cublasXtCreate(h)
if (istat .ne. CUBLAS_STATUS_SUCCESS) print *,istat
ndevices(1) = 0
istat = cublasXtDeviceSelect(h, 1, ndevices)
if (istat .ne. CUBLAS_STATUS_SUCCESS) print *,istat
istat = cublasXtZgemm(h, CUBLAS_OP_N, CUBLAS_OP_N, &
                      n, n, n, &
                      alpha, A, n, B, n, beta, C, n)
if (istat .ne. CUBLAS_STATUS_SUCCESS) print *,istat
istat = cublasXtDestroy(h)
if (istat .ne. CUBLAS_STATUS_SUCCESS) print *,istat
if (all(dble(c).eq.2.0d0*n)) then
    print *,"Test PASSED"
else
    print *,"Test FAILED"
endif
end

cublasXt 模块包含 cublas 模块中的所有类型和定义,以及这些附加类型和枚举

TYPE cublasXtHandle
  TYPE(C_PTR)  :: handle
END TYPE
! Pinned memory mode
enum, bind(c)
    enumerator :: CUBLASXT_PINNING_DISABLED=0
    enumerator :: CUBLASXT_PINNING_ENABLED=1
end enum
! cublasXtOpType
enum, bind(c)
    enumerator :: CUBLASXT_FLOAT=0
    enumerator :: CUBLASXT_DOUBLE=1
    enumerator :: CUBLASXT_COMPLEX=2
    enumerator :: CUBLASXT_DOUBLECOMPLEX=3
end enum
! cublasXtBlasOp
enum, bind(c)
    enumerator :: CUBLASXT_GEMM=0
    enumerator :: CUBLASXT_SYRK=1
    enumerator :: CUBLASXT_HERK=2
    enumerator :: CUBLASXT_SYMM=3
    enumerator :: CUBLASXT_HEMM=4
    enumerator :: CUBLASXT_TRSM=5
    enumerator :: CUBLASXT_SYR2K=6
    enumerator :: CUBLASXT_HER2K=7
    enumerator :: CUBLASXT_SPMM=8
    enumerator :: CUBLASXT_SYRKX=9
    enumerator :: CUBLASXT_HERKX=10
    enumerator :: CUBLASXT_TRMM=11
    enumerator :: CUBLASXT_ROUTINE_MAX=12
end enum

2.8.1. cublasXtCreate

此函数初始化 cublasXt API 并创建一个句柄,指向保存 cublasXT 库上下文的不透明结构。它在主机和设备上分配硬件资源,并且必须在进行任何其他 cublasXt API 库调用之前调用。

integer(4) function cublasXtcreate(h)
  type(cublasXtHandle) :: h

2.8.2. cublasXtDestroy

此函数释放 cublasXt API 上下文使用的硬件资源。此函数通常是使用特定句柄对 cublasXt API 的最后一次调用。

integer(4) function cublasXtdestroy(h)
  type(cublasXtHandle) :: h

2.8.3. cublasXtDeviceSelect

此函数允许用户提供 GPU 设备的数量及其各自的 ID,这些设备将参与后续的 cublasXt API 数学函数调用。此函数将为列表中提供的每个 GPU 创建一个 cuBLAS 上下文。目前,设备配置是静态的,并且不能在数学函数调用之间更改。在这方面,此函数应在 cublasXtCreate 之后仅调用一次。为了能够运行多个配置,应创建多个 cublasXt API 上下文。

integer(4) function cublasXtdeviceselect(h, ndevices, deviceid)
  type(cublasXtHandle) :: h
  integer :: ndevices
  integer, dimension(*) :: deviceid

2.8.4. cublasXtSetBlockDim

此函数允许用户设置用于后续数学函数调用的矩阵平铺的分块维度。矩阵被分割成 blockDim x blockDim 维度的正方形瓦片。可以随时调用此函数,并将对后续的数学函数调用生效。应选择分块维度以优化数学运算,并确保 PCI 传输与计算良好地重叠。

integer(4) function cublasXtsetblockdim(h, blockdim)
  type(cublasXtHandle) :: h
  integer :: blockdim

2.8.5. cublasXtGetBlockDim

此函数允许用户查询用于矩阵平铺的分块维度。

integer(4) function cublasXtgetblockdim(h, blockdim)
  type(cublasXtHandle) :: h
  integer :: blockdim

2.8.6. cublasXtSetCpuRoutine

此函数允许用户提供相应 BLAS 例程的 CPU 实现。此函数可以与函数 cublasXtSetCpuRatio() 一起使用,以定义 CPU 和 GPU 之间的混合计算。目前,混合功能仅支持 xGEMM 例程。

integer(4) function cublasXtsetcpuroutine(h, blasop, blastype)
  type(cublasXtHandle) :: h
  integer :: blasop, blastype

2.8.7. cublasXtSetCpuRatio

此函数允许用户定义在混合计算上下文中应在 CPU 上完成的工作负载百分比。此函数可以与函数 cublasXtSetCpuRoutine() 一起使用,以定义 CPU 和 GPU 之间的混合计算。目前,混合功能仅支持 xGEMM 例程。

integer(4) function cublasXtsetcpuratio(h, blasop, blastype, ratio)
  type(cublasXtHandle) :: h
  integer :: blasop, blastype
  real(4) :: ratio

2.8.8. cublasXtSetPinningMemMode

此函数允许用户启用或禁用固定内存模式。启用后,如果矩阵尚未固定,则在后续 cublasXt API 调用中传递的矩阵将分别使用 CUDART 例程 cudaHostRegister 和 cudaHostUnregister 进行固定/取消固定。如果矩阵碰巧部分固定,它也不会被固定。固定内存可提高 PCI 传输性能,并允许 PCI 内存传输与计算重叠。但是,固定/取消固定内存需要一些时间,这可能无法摊销。建议用户使用 cudaMallocHost 或 cudaHostRegister 自行固定内存,并在计算序列完成后取消固定。默认情况下,固定内存模式处于禁用状态。

integer(4) function cublasXtsetpinningmemmode(h, mode)
  type(cublasXtHandle) :: h
  integer :: mode

2.8.9. cublasXtGetPinningMemMode

此函数允许用户查询固定内存模式。默认情况下,固定内存模式处于禁用状态。

integer(4) function cublasXtgetpinningmemmode(h, mode)
  type(cublasXtHandle) :: h
  integer :: mode

2.8.10. cublasXtSgemm

SGEMM 执行矩阵-矩阵运算 C := alpha*op( A )*op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量,A、B 和 C 是矩阵,其中 op( A ) 是 m x k 矩阵,op( B ) 是 k x n 矩阵,C 是 m x n 矩阵。

integer(4) function cublasXtsgemm(h, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: transa, transb
  integer(kind=c_intptr_t) :: m, n, k, lda, ldb, ldc
  real(4), dimension(lda, *) :: a
  real(4), dimension(ldb, *) :: b
  real(4), dimension(ldc, *) :: c
  real(4) :: alpha, beta

2.8.11. cublasXtSsymm

SSYMM 执行矩阵-矩阵运算 C := alpha*A*B + beta*C 或 C := alpha*B*A + beta*C 之一,其中 alpha 和 beta 是标量,A 是对称矩阵,B 和 C 是 m x n 矩阵。

integer(4) function cublasXtssymm(h, side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: side, uplo
  integer(kind=c_intptr_t) :: m, n, lda, ldb, ldc
  real(4), dimension(lda, *) :: a
  real(4), dimension(ldb, *) :: b
  real(4), dimension(ldc, *) :: c
  real(4) :: alpha, beta

2.8.12. cublasXtSsyrk

SSYRK 执行对称秩 k 运算 C := alpha*A*A**T + beta*C 或 C := alpha*A**T*A + beta*C 之一,其中 alpha 和 beta 是标量,C 是 n x n 对称矩阵,A 在第一种情况下是 n x k 矩阵,在第二种情况下是 k x n 矩阵。

integer(4) function cublasXtssyrk(h, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: uplo, trans
  integer(kind=c_intptr_t) :: n, k, lda, ldc
  real(4), dimension(lda, *) :: a
  real(4), dimension(ldc, *) :: c
  real(4) :: alpha, beta

2.8.13. cublasXtSsyr2k

SSYR2K 执行对称秩 2k 运算 C := alpha*A*B**T + alpha*B*A**T + beta*C 或 C := alpha*A**T*B + alpha*B**T*A + beta*C 之一,其中 alpha 和 beta 是标量,C 是 n x n 对称矩阵,A 和 B 在第一种情况下是 n x k 矩阵,在第二种情况下是 k x n 矩阵。

integer(4) function cublasXtssyr2k(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: uplo, trans
  integer(kind=c_intptr_t) :: n, k, lda, ldb, ldc
  real(4), dimension(lda, *) :: a
  real(4), dimension(ldb, *) :: b
  real(4), dimension(ldc, *) :: c
  real(4) :: alpha, beta

2.8.14. cublasXtSsyrkx

SSYRKX 执行对称秩 k 更新 C := alpha*A*B**T + beta*C 的变体,其中 alpha 和 beta 是标量,C 是以下三角或上三角模式存储的 n x n 对称矩阵,A 和 B 是 n x k 矩阵。当 B 以某种方式使得结果保证对称时,可以使用此例程。有关更多详细信息,请参阅 CUBLAS 文档。

integer(4) function cublasXtssyrkx(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: uplo, trans
  integer(kind=c_intptr_t) :: n, k, lda, ldb, ldc
  real(4), dimension(lda, *) :: a
  real(4), dimension(ldb, *) :: b
  real(4), dimension(ldc, *) :: c
  real(4) :: alpha, beta

2.8.15. cublasXtStrmm

STRMM 执行矩阵-矩阵运算 B := alpha*op( A )*B 或 B := alpha*B*op( A ) 之一,其中 alpha 是标量,B 是 m x n 矩阵,A 是单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一。

integer(4) function cublasXtstrmm(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb, c, ldc)
  type(cublasXtHandle) :: h
  integer :: side, uplo, transa, diag
  integer(kind=c_intptr_t) :: m, n, lda, ldb, ldc
  real(4), dimension(lda, *) :: a
  real(4), dimension(ldb, *) :: b
  real(4), dimension(ldc, *) :: c
  real(4) :: alpha

2.8.16. cublasXtStrsm

STRSM 求解矩阵方程 op( A )*X = alpha*B 或 X*op( A ) = alpha*B 之一,其中 alpha 是标量,X 和 B 是 m x n 矩阵,A 是单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一。矩阵 X 在 B 上被覆盖。

integer(4) function cublasXtstrsm(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  type(cublasXtHandle) :: h
  integer :: side, uplo, transa, diag
  integer(kind=c_intptr_t) :: m, n, lda, ldb
  real(4), dimension(lda, *) :: a
  real(4), dimension(ldb, *) :: b
  real(4) :: alpha

2.8.17. cublasXtSspmm

SSPMM 执行对称压缩矩阵-矩阵运算 C := alpha*A*B + beta*C,或 C := alpha*B*A + beta*C 之一,其中 alpha 和 beta 是标量,A 是以压缩格式存储的 n x n 对称矩阵,B 和 C 是 m x n 矩阵。

integer(4) function cublasXtsspmm(h, side, uplo, m, n, alpha, ap, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: side, uplo
  integer(kind=c_intptr_t) :: m, n, ldb, ldc
  real(4), dimension(*) :: ap
  real(4), dimension(ldb, *) :: b
  real(4), dimension(ldc, *) :: c
  real(4) :: alpha, beta

2.8.18. cublasXtCgemm

CGEMM 执行矩阵-矩阵运算 C := alpha*op( A )*op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 或 op( X ) = X**H 之一,alpha 和 beta 是标量,A、B 和 C 是矩阵,其中 op( A ) 是一个 m 乘 k 矩阵,op( B ) 是一个 k 乘 n 矩阵,C 是一个 m 乘 n 矩阵。

integer(4) function cublasXtcgemm(h, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: transa, transb
  integer(kind=c_intptr_t) :: m, n, k, lda, ldb, ldc
  complex(4), dimension(lda, *) :: a
  complex(4), dimension(ldb, *) :: b
  complex(4), dimension(ldc, *) :: c
  complex(4) :: alpha, beta

2.8.19. cublasXtChemm

CHEMM 执行矩阵-矩阵运算 C := alpha*A*B + beta*C 或 C := alpha*B*A + beta*C 之一,其中 alpha 和 beta 是标量,A 是一个埃尔米特矩阵,B 和 C 是 m 乘 n 矩阵。

integer(4) function cublasXtchemm(h, side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: side, uplo
  integer(kind=c_intptr_t) :: m, n, lda, ldb, ldc
  complex(4), dimension(lda, *) :: a
  complex(4), dimension(ldb, *) :: b
  complex(4), dimension(ldc, *) :: c
  complex(4) :: alpha, beta

2.8.20. cublasXtCherk

CHERK 执行埃尔米特秩 k 运算 C := alpha*A*A**H + beta*C 或 C := alpha*A**H*A + beta*C 之一,其中 alpha 和 beta 是实标量,C 是一个 n 乘 n 埃尔米特矩阵,A 在第一种情况下是一个 n 乘 k 矩阵,在第二种情况下是一个 k 乘 n 矩阵。

integer(4) function cublasXtcherk(h, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: uplo, trans
  integer(kind=c_intptr_t) :: n, k, lda, ldc
  complex(4), dimension(lda, *) :: a
  complex(4), dimension(ldc, *) :: c
  real(4) :: alpha, beta

2.8.21. cublasXtCher2k

CHER2K 执行埃尔米特秩 2k 运算 C := alpha*A*B**H + conjg( alpha )*B*A**H + beta*C 或 C := alpha*A**H*B + conjg( alpha )*B**H*A + beta*C 之一,其中 alpha 和 beta 是标量,beta 是实数,C 是一个 n 乘 n 埃尔米特矩阵,A 和 B 在第一种情况下是 n 乘 k 矩阵,在第二种情况下是 k 乘 n 矩阵。

integer(4) function cublasXtcher2k(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: uplo, trans
  integer(kind=c_intptr_t) :: n, k, lda, ldb, ldc
  complex(4), dimension(lda, *) :: a
  complex(4), dimension(ldb, *) :: b
  complex(4), dimension(ldc, *) :: c
  complex(4) :: alpha
  real(4) :: beta

2.8.22. cublasXtCherkx

CHERKX 执行埃尔米特秩 k 运算 C := alpha*A*B**H + beta*C 的变体,其中 alpha 和 beta 是实标量,C 是一个以 lower 或 upper 模式存储的 n 乘 n 埃尔米特矩阵,A 和 B 是 n 乘 k 矩阵。有关更多详细信息,请参阅 CUBLAS 文档。

integer(4) function cublasXtcherkx(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: uplo, trans
  integer(kind=c_intptr_t) :: n, k, lda, ldb, ldc
  complex(4), dimension(lda, *) :: a
  complex(4), dimension(ldb, *) :: b
  complex(4), dimension(ldc, *) :: c
  complex(4) :: alpha
  real(4) :: beta

2.8.23. cublasXtCsymm

CSYMM 执行矩阵-矩阵运算 C := alpha*A*B + beta*C 或 C := alpha*B*A + beta*C 之一,其中 alpha 和 beta 是标量,A 是一个对称矩阵,B 和 C 是 m 乘 n 矩阵。

integer(4) function cublasXtcsymm(h, side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: side, uplo
  integer(kind=c_intptr_t) :: m, n, lda, ldb, ldc
  complex(4), dimension(lda, *) :: a
  complex(4), dimension(ldb, *) :: b
  complex(4), dimension(ldc, *) :: c
  complex(4) :: alpha, beta

2.8.24. cublasXtCsyrk

CSYRK 执行对称秩 k 运算 C := alpha*A*A**T + beta*C 或 C := alpha*A**T*A + beta*C 之一,其中 alpha 和 beta 是标量,C 是一个 n 乘 n 对称矩阵,A 在第一种情况下是一个 n 乘 k 矩阵,在第二种情况下是一个 k 乘 n 矩阵。

integer(4) function cublasXtcsyrk(h, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: uplo, trans
  integer(kind=c_intptr_t) :: n, k, lda, ldc
  complex(4), dimension(lda, *) :: a
  complex(4), dimension(ldc, *) :: c
  complex(4) :: alpha, beta

2.8.25. cublasXtCsyr2k

CSYR2K 执行对称秩 2k 运算 C := alpha*A*B**T + alpha*B*A**T + beta*C 或 C := alpha*A**T*B + alpha*B**T*A + beta*C 之一,其中 alpha 和 beta 是标量,C 是一个 n 乘 n 对称矩阵,A 和 B 在第一种情况下是 n 乘 k 矩阵,在第二种情况下是 k 乘 n 矩阵。

integer(4) function cublasXtcsyr2k(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: uplo, trans
  integer(kind=c_intptr_t) :: n, k, lda, ldb, ldc
  complex(4), dimension(lda, *) :: a
  complex(4), dimension(ldb, *) :: b
  complex(4), dimension(ldc, *) :: c
  complex(4) :: alpha, beta

2.8.26. cublasXtCsyrkx

CSYRKX 执行对称秩 k 更新 C := alpha*A*B**T + beta*C 的变体,其中 alpha 和 beta 是标量,C 是一个以 lower 或 upper 模式存储的 n 乘 n 对称矩阵,A 和 B 是 n 乘 k 矩阵。当 B 以某种方式使得结果保证对称时,可以使用此例程。有关更多详细信息,请参阅 CUBLAS 文档。

integer(4) function cublasXtcsyrkx(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: uplo, trans
  integer(kind=c_intptr_t) :: n, k, lda, ldb, ldc
  complex(4), dimension(lda, *) :: a
  complex(4), dimension(ldb, *) :: b
  complex(4), dimension(ldc, *) :: c
  complex(4) :: alpha, beta

2.8.27. cublasXtCtrmm

CTRMM 执行矩阵-矩阵运算 B := alpha*op( A )*B 或 B := alpha*B*op( A ) 之一,其中 alpha 是一个标量,B 是一个 m 乘 n 矩阵,A 是一个单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 或 op( A ) = A**H 之一。

integer(4) function cublasXtctrmm(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb, c, ldc)
  type(cublasXtHandle) :: h
  integer :: side, uplo, transa, diag
  integer(kind=c_intptr_t) :: m, n, lda, ldb, ldc
  complex(4), dimension(lda, *) :: a
  complex(4), dimension(ldb, *) :: b
  complex(4), dimension(ldc, *) :: c
  complex(4) :: alpha

2.8.28. cublasXtCtrsm

CTRSM 求解矩阵方程 op( A )*X = alpha*B 或 X*op( A ) = alpha*B 之一,其中 alpha 是一个标量,X 和 B 是 m 乘 n 矩阵,A 是一个单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 或 op( A ) = A**H 之一。矩阵 X 在 B 上被覆盖。

integer(4) function cublasXtctrsm(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  type(cublasXtHandle) :: h
  integer :: side, uplo, transa, diag
  integer(kind=c_intptr_t) :: m, n, lda, ldb
  complex(4), dimension(lda, *) :: a
  complex(4), dimension(ldb, *) :: b
  complex(4) :: alpha

2.8.29. cublasXtCspmm

CSPMM 执行对称压缩矩阵-矩阵运算 C := alpha*A*B + beta*C,或 C := alpha*B*A + beta*C 之一,其中 alpha 和 beta 是标量,A 是以压缩格式存储的 n x n 对称矩阵,B 和 C 是 m x n 矩阵。

integer(4) function cublasXtcspmm(h, side, uplo, m, n, alpha, ap, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: side, uplo
  integer(kind=c_intptr_t) :: m, n, ldb, ldc
  complex(4), dimension(*) :: ap
  complex(4), dimension(ldb, *) :: b
  complex(4), dimension(ldc, *) :: c
  complex(4) :: alpha, beta

2.8.30. cublasXtDgemm

DGEMM 执行矩阵-矩阵运算 C := alpha*op( A )*op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量,A、B 和 C 是矩阵,其中 op( A ) 是 m x k 矩阵,op( B ) 是 k x n 矩阵,C 是 m x n 矩阵。

integer(4) function cublasXtdgemm(h, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: transa, transb
  integer(kind=c_intptr_t) :: m, n, k, lda, ldb, ldc
  real(8), dimension(lda, *) :: a
  real(8), dimension(ldb, *) :: b
  real(8), dimension(ldc, *) :: c
  real(8) :: alpha, beta

2.8.31. cublasXtDsymm

DSYMM 执行矩阵-矩阵运算 C := alpha*A*B + beta*C 或 C := alpha*B*A + beta*C 之一,其中 alpha 和 beta 是标量,A 是对称矩阵,B 和 C 是 m x n 矩阵。

integer(4) function cublasXtdsymm(h, side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: side, uplo
  integer(kind=c_intptr_t) :: m, n, lda, ldb, ldc
  real(8), dimension(lda, *) :: a
  real(8), dimension(ldb, *) :: b
  real(8), dimension(ldc, *) :: c
  real(8) :: alpha, beta

2.8.32. cublasXtDsyrk

DSYRK 执行对称秩 k 运算 C := alpha*A*A**T + beta*C 或 C := alpha*A**T*A + beta*C 之一,其中 alpha 和 beta 是标量,C 是 n x n 对称矩阵,A 在第一种情况下是 n x k 矩阵,在第二种情况下是 k x n 矩阵。

integer(4) function cublasXtdsyrk(h, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: uplo, trans
  integer(kind=c_intptr_t) :: n, k, lda, ldc
  real(8), dimension(lda, *) :: a
  real(8), dimension(ldc, *) :: c
  real(8) :: alpha, beta

2.8.33. cublasXtDsyr2k

DSYR2K 执行对称秩 2k 运算 C := alpha*A*B**T + alpha*B*A**T + beta*C 或 C := alpha*A**T*B + alpha*B**T*A + beta*C 之一,其中 alpha 和 beta 是标量,C 是 n x n 对称矩阵,A 和 B 在第一种情况下是 n x k 矩阵,在第二种情况下是 k x n 矩阵。

integer(4) function cublasXtdsyr2k(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: uplo, trans
  integer(kind=c_intptr_t) :: n, k, lda, ldb, ldc
  real(8), dimension(lda, *) :: a
  real(8), dimension(ldb, *) :: b
  real(8), dimension(ldc, *) :: c
  real(8) :: alpha, beta

2.8.34. cublasXtDsyrkx

DSYRKX 执行对称秩 k 更新 C := alpha*A*B**T + beta*C 的变体,其中 alpha 和 beta 是标量,C 是以三角下或上三角模式存储的 n x n 对称矩阵,A 和 B 是 n x k 矩阵。当 B 以某种方式使得结果保证对称时,可以使用此例程。有关更多详细信息,请参阅 CUBLAS 文档。

integer(4) function cublasXtdsyrkx(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: uplo, trans
  integer(kind=c_intptr_t) :: n, k, lda, ldb, ldc
  real(8), dimension(lda, *) :: a
  real(8), dimension(ldb, *) :: b
  real(8), dimension(ldc, *) :: c
  real(8) :: alpha, beta

2.8.35. cublasXtDtrmm

DTRMM 执行矩阵-矩阵运算 B := alpha*op( A )*B 或 B := alpha*B*op( A ) 之一,其中 alpha 是标量,B 是 m x n 矩阵,A 是单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一。

integer(4) function cublasXtdtrmm(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb, c, ldc)
  type(cublasXtHandle) :: h
  integer :: side, uplo, transa, diag
  integer(kind=c_intptr_t) :: m, n, lda, ldb, ldc
  real(8), dimension(lda, *) :: a
  real(8), dimension(ldb, *) :: b
  real(8), dimension(ldc, *) :: c
  real(8) :: alpha

2.8.36. cublasXtDtrsm

DTRSM 求解矩阵方程 op( A )*X = alpha*B 或 X*op( A ) = alpha*B 之一,其中 alpha 是标量,X 和 B 是 m x n 矩阵,A 是单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一。矩阵 X 在 B 上被覆盖。

integer(4) function cublasXtdtrsm(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  type(cublasXtHandle) :: h
  integer :: side, uplo, transa, diag
  integer(kind=c_intptr_t) :: m, n, lda, ldb
  real(8), dimension(lda, *) :: a
  real(8), dimension(ldb, *) :: b
  real(8) :: alpha

2.8.37. cublasXtDspmm

DSPMM 执行对称压缩矩阵-矩阵运算 C := alpha*A*B + beta*C,或 C := alpha*B*A + beta*C 之一,其中 alpha 和 beta 是标量,A 是以压缩格式存储的 n x n 对称矩阵,B 和 C 是 m x n 矩阵。

integer(4) function cublasXtdspmm(h, side, uplo, m, n, alpha, ap, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: side, uplo
  integer(kind=c_intptr_t) :: m, n, ldb, ldc
  real(8), dimension(*) :: ap
  real(8), dimension(ldb, *) :: b
  real(8), dimension(ldc, *) :: c
  real(8) :: alpha, beta

2.8.38. cublasXtZgemm

ZGEMM 执行矩阵-矩阵运算 C := alpha*op( A )*op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 或 op( X ) = X**H 之一,alpha 和 beta 是标量,A、B 和 C 是矩阵,其中 op( A ) 是一个 m 乘 k 矩阵,op( B ) 是一个 k 乘 n 矩阵,C 是一个 m 乘 n 矩阵。

integer(4) function cublasXtzgemm(h, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: transa, transb
  integer(kind=c_intptr_t) :: m, n, k, lda, ldb, ldc
  complex(8), dimension(lda, *) :: a
  complex(8), dimension(ldb, *) :: b
  complex(8), dimension(ldc, *) :: c
  complex(8) :: alpha, beta

2.8.39. cublasXtZhemm

ZHEMM 执行矩阵-矩阵运算 C := alpha*A*B + beta*C 或 C := alpha*B*A + beta*C 之一,其中 alpha 和 beta 是标量,A 是一个埃尔米特矩阵,B 和 C 是 m 乘 n 矩阵。

integer(4) function cublasXtzhemm(h, side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: side, uplo
  integer(kind=c_intptr_t) :: m, n, lda, ldb, ldc
  complex(8), dimension(lda, *) :: a
  complex(8), dimension(ldb, *) :: b
  complex(8), dimension(ldc, *) :: c
  complex(8) :: alpha, beta

2.8.40. cublasXtZherk

ZHERK 执行埃尔米特秩 k 运算 C := alpha*A*A**H + beta*C 或 C := alpha*A**H*A + beta*C 之一,其中 alpha 和 beta 是实标量,C 是一个 n 乘 n 埃尔米特矩阵,A 在第一种情况下是一个 n 乘 k 矩阵,在第二种情况下是一个 k 乘 n 矩阵。

integer(4) function cublasXtzherk(h, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: uplo, trans
  integer(kind=c_intptr_t) :: n, k, lda, ldc
  complex(8), dimension(lda, *) :: a
  complex(8), dimension(ldc, *) :: c
  real(8) :: alpha, beta

2.8.41. cublasXtZher2k

ZHER2K 执行埃尔米特秩 2k 运算 C := alpha*A*B**H + conjg( alpha )*B*A**H + beta*C 或 C := alpha*A**H*B + conjg( alpha )*B**H*A + beta*C 之一,其中 alpha 和 beta 是标量,beta 是实数,C 是一个 n 乘 n 埃尔米特矩阵,A 和 B 在第一种情况下是 n 乘 k 矩阵,在第二种情况下是 k 乘 n 矩阵。

integer(4) function cublasXtzher2k(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: uplo, trans
  integer(kind=c_intptr_t) :: n, k, lda, ldb, ldc
  complex(8), dimension(lda, *) :: a
  complex(8), dimension(ldb, *) :: b
  complex(8), dimension(ldc, *) :: c
  complex(8) :: alpha
  real(8) :: beta

2.8.42. cublasXtZherkx

ZHERKX 执行埃尔米特秩 k 运算 C := alpha*A*B**H + beta*C 的变体,其中 alpha 和 beta 是实标量,C 是一个以 lower 或 upper 模式存储的 n 乘 n 埃尔米特矩阵,A 和 B 是 n 乘 k 矩阵。有关更多详细信息,请参阅 CUBLAS 文档。

integer(4) function cublasXtzherkx(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: uplo, trans
  integer(kind=c_intptr_t) :: n, k, lda, ldb, ldc
  complex(8), dimension(lda, *) :: a
  complex(8), dimension(ldb, *) :: b
  complex(8), dimension(ldc, *) :: c
  complex(8) :: alpha
  real(8) :: beta

2.8.43. cublasXtZsymm

ZSYMM 执行矩阵-矩阵运算 C := alpha*A*B + beta*C 或 C := alpha*B*A + beta*C 之一,其中 alpha 和 beta 是标量,A 是一个对称矩阵,B 和 C 是 m 乘 n 矩阵。

integer(4) function cublasXtzsymm(h, side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: side, uplo
  integer(kind=c_intptr_t) :: m, n, lda, ldb, ldc
  complex(8), dimension(lda, *) :: a
  complex(8), dimension(ldb, *) :: b
  complex(8), dimension(ldc, *) :: c
  complex(8) :: alpha, beta

2.8.44. cublasXtZsyrk

ZSYRK 执行对称秩 k 运算 C := alpha*A*A**T + beta*C 或 C := alpha*A**T*A + beta*C 之一,其中 alpha 和 beta 是标量,C 是一个 n 乘 n 对称矩阵,A 在第一种情况下是一个 n 乘 k 矩阵,在第二种情况下是一个 k 乘 n 矩阵。

integer(4) function cublasXtzsyrk(h, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: uplo, trans
  integer(kind=c_intptr_t) :: n, k, lda, ldc
  complex(8), dimension(lda, *) :: a
  complex(8), dimension(ldc, *) :: c
  complex(8) :: alpha, beta

2.8.45. cublasXtZsyr2k

ZSYR2K 执行对称秩 2k 运算 C := alpha*A*B**T + alpha*B*A**T + beta*C 或 C := alpha*A**T*B + alpha*B**T*A + beta*C 之一,其中 alpha 和 beta 是标量,C 是一个 n 乘 n 对称矩阵,A 和 B 在第一种情况下是 n 乘 k 矩阵,在第二种情况下是 k 乘 n 矩阵。

integer(4) function cublasXtzsyr2k(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: uplo, trans
  integer(kind=c_intptr_t) :: n, k, lda, ldb, ldc
  complex(8), dimension(lda, *) :: a
  complex(8), dimension(ldb, *) :: b
  complex(8), dimension(ldc, *) :: c
  complex(8) :: alpha, beta

2.8.46. cublasXtZsyrkx

ZSYRKX 执行对称秩 k 更新 C := alpha*A*B**T + beta*C 的变体,其中 alpha 和 beta 是标量,C 是一个以 lower 或 upper 模式存储的 n 乘 n 对称矩阵,A 和 B 是 n 乘 k 矩阵。当 B 以某种方式使得结果保证对称时,可以使用此例程。有关更多详细信息,请参阅 CUBLAS 文档。

integer(4) function cublasXtzsyrkx(h, uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: uplo, trans
  integer(kind=c_intptr_t) :: n, k, lda, ldb, ldc
  complex(8), dimension(lda, *) :: a
  complex(8), dimension(ldb, *) :: b
  complex(8), dimension(ldc, *) :: c
  complex(8) :: alpha, beta

2.8.47. cublasXtZtrmm

ZTRMM 执行矩阵-矩阵运算 B := alpha*op( A )*B 或 B := alpha*B*op( A ) 之一,其中 alpha 是一个标量,B 是一个 m 乘 n 矩阵,A 是一个单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 或 op( A ) = A**H 之一。

integer(4) function cublasXtztrmm(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb, c, ldc)
  type(cublasXtHandle) :: h
  integer :: side, uplo, transa, diag
  integer(kind=c_intptr_t) :: m, n, lda, ldb, ldc
  complex(8), dimension(lda, *) :: a
  complex(8), dimension(ldb, *) :: b
  complex(8), dimension(ldc, *) :: c
  complex(8) :: alpha

2.8.48. cublasXtZtrsm

ZTRSM 求解矩阵方程 op( A )*X = alpha*B 或 X*op( A ) = alpha*B 之一,其中 alpha 是一个标量,X 和 B 是 m 乘 n 矩阵,A 是一个单位或非单位上或下三角矩阵,op( A ) 是 op( A ) = A 或 op( A ) = A**T 或 op( A ) = A**H 之一。矩阵 X 在 B 上被覆盖。

integer(4) function cublasXtztrsm(h, side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
  type(cublasXtHandle) :: h
  integer :: side, uplo, transa, diag
  integer(kind=c_intptr_t) :: m, n, lda, ldb
  complex(8), dimension(lda, *) :: a
  complex(8), dimension(ldb, *) :: b
  complex(8) :: alpha

2.8.49. cublasXtZspmm

ZSPMM 执行对称压缩矩阵-矩阵运算 C := alpha*A*B + beta*C,或 C := alpha*B*A + beta*C 之一,其中 alpha 和 beta 是标量,A 是以压缩格式存储的 n x n 对称矩阵,B 和 C 是 m x n 矩阵。

integer(4) function cublasXtzspmm(h, side, uplo, m, n, alpha, ap, b, ldb, beta, c, ldc)
  type(cublasXtHandle) :: h
  integer :: side, uplo
  integer(kind=c_intptr_t) :: m, n, ldb, ldc
  complex(8), dimension(*) :: ap
  complex(8), dimension(ldb, *) :: b
  complex(8), dimension(ldc, *) :: c
  complex(8) :: alpha, beta

2.9. CUBLAS MP 模块函数

本节包含 cuBLAS MP 模块函数的接口。用户可以通过在程序单元中插入代码行 use cublasMp 来访问此模块。cublasMp 库是一个主机端库,它在分布式设备数据上运行,并支持多进程和 GPU。它基于 ScaLAPACK PBLAS 库。

从 25.1 版本开始,cublasMp 库针对 CUDA 版本 > 12.0 具有更新的 API,特别是 cublasMp 版本 0.3.0 及更高版本。对于 CUDA 版本 <= 11.8 的用户,旧模块已重命名,您可以通过在程序单元中插入代码行 use cublasMp02 来访问它。版本 0.3.x 的一个主要区别是,所有 cublasMp 函数现在都返回 type(cublasMpStatus) 而不是 integer(4)。还有其他添加和更改,我们将在下面的各个描述中指出。有关 cublasMp 0.2.x 的 Fortran 接口的完整文档,请参阅 2024 NVHPC 版本的文档。

新模块中提供了一些用于比较和赋值 type(cublasMpStatus) 变量和表达式的重载操作。

cublasMp 模块包含 cublas 模块中的所有通用类型和定义、nvf_cal_comm 模块中的类型和接口,以及这些附加类型和枚举

! Version information
integer, parameter :: CUBLASMP_VER_MAJOR = 0
integer, parameter :: CUBLASMP_VER_MINOR = 3
integer, parameter :: CUBLASMP_VER_PATCH = 0
integer, parameter :: CUBLASMP_VERSION = &
     (CUBLASMP_VER_MAJOR * 1000 + CUBLASMP_VER_MINOR * 100 + CUBLASMP_VER_PATCH)
! New status type, with version 0.3.0
TYPE cublasMpStatus
  integer(4) :: stat
END TYPE
TYPE(cublasMpStatus), parameter :: &
  CUBLASMP_STATUS_SUCCESS                = cublasMpStatus(0), &
  CUBLASMP_STATUS_NOT_INITIALIZED        = cublasMpStatus(1), &
  CUBLASMP_STATUS_ALLOCATION_FAILED      = cublasMpStatus(2), &
  CUBLASMP_STATUS_INVALID_VALUE          = cublasMpStatus(3), &
  CUBLASMP_STATUS_ARCHITECTURE_MISMATCH  = cublasMpStatus(4), &
  CUBLASMP_STATUS_EXECUTION_FAILED       = cublasMpStatus(5), &
  CUBLASMP_STATUS_INTERNAL_ERROR         = cublasMpStatus(6), &
  CUBLASMP_STATUS_NOT_SUPPORTED          = cublasMpStatus(7)
! Grid Layout
TYPE cublasMpGridLayout
  integer(4) :: grid
END TYPE
TYPE(cublasMpGridLayout), parameter :: &
  CUBLASMP_GRID_LAYOUT_COL_MAJOR = cublasMpGridLayout(0), &
  CUBLASMP_GRID_LAYOUT_ROW_MAJOR = cublasMpGridLayout(1)
! Matmul Descriptor Attributes
TYPE cublasMpMatmulDescriptorAttribute
  integer(4) :: attr
END TYPE
TYPE(cublasMpMatmulDescriptorAttribute), parameter :: &
  CUBLASMP_MATMUL_DESCRIPTOR_ATTRIBUTE_TRANSA       = cublasMpMatmulDescriptorAttribute(0), &
  CUBLASMP_MATMUL_DESCRIPTOR_ATTRIBUTE_TRANSB       = cublasMpMatmulDescriptorAttribute(1), &
  CUBLASMP_MATMUL_DESCRIPTOR_ATTRIBUTE_COMPUTE_TYPE = cublasMpMatmulDescriptorAttribute(2), &
  CUBLASMP_MATMUL_DESCRIPTOR_ATTRIBUTE_ALGO_TYPE    = cublasMpMatmulDescriptorAttribute(3)
! Matmul Algorithm Type
TYPE cublasMpMatmulAlgoType
  integer(4) :: atyp
END TYPE
TYPE(cublasMpMatmulAlgoType), parameter :: &
  CUBLASMP_MATMUL_ALGO_TYPE_DEFAULT          = cublasMpMatmulAlgoType(0), &
  CUBLASMP_MATMUL_ALGO_TYPE_SPLIT_P2P        = cublasMpMatmulAlgoType(1), &
  CUBLASMP_MATMUL_ALGO_TYPE_SPLIT_MULTICAST  = cublasMpMatmulAlgoType(2), &
  CUBLASMP_MATMUL_ALGO_TYPE_ATOMIC_P2P       = cublasMpMatmulAlgoType(3), &
  CUBLASMP_MATMUL_ALGO_TYPE_ATOMIC_MULTICAST = cublasMpMatmulAlgoType(4)
TYPE cublasMpHandle
  TYPE(C_PTR)  :: handle
END TYPE
TYPE cublasMpGrid
  TYPE(C_PTR)  :: handle
END TYPE
TYPE cublasMpMatrixDescriptor
  TYPE(C_PTR)  :: handle
END TYPE
TYPE cublasMpMatmulDescriptor
  TYPE(C_PTR)  :: handle
END TYPE

2.9.1. cublasMpCreate

此函数初始化 cublasMp API 并创建一个句柄,指向保存 cublasMp 库上下文的不透明结构。它在主机和设备上分配硬件资源,并且必须在进行任何其他 cublasMp 库调用之前调用。

type(cublasMpStatus) function cublasMpCreate(handle, stream)
  type(cublasMpHandle) :: handle
  integer(kind=cuda_stream_kind()) :: stream

2.9.2. cublasMpDestroy

此函数释放 cublasMp 句柄和上下文使用的资源。

type(cublasMpStatus) function cublasMpDestroy(handle)
  type(cublasMpHandle) :: handle

2.9.3. cublasMpStreamSet

此函数设置要在 cublasMp 计算中使用的 CUDA 流。

type(cublasMpStatus) function cublasMpStreamSet(handle, stream)
  type(cublasMpHandle) :: handle
  integer(kind=cuda_stream_kind()) :: stream

2.9.4. cublasMpStreamGet

此函数返回 cublasMp 计算中使用的当前 CUDA 流。

type(cublasMpStatus) function cublasMpStreamGet(handle, stream)
  type(cublasMpHandle) :: handle
  integer(kind=cuda_stream_kind()) :: stream

2.9.5. cublasMpGetVersion

此函数返回 cublasMp 库的版本号。

type(cublasMpStatus) function cublasMpGetVersion(handle, version)
  type(cublasMpHandle) :: handle
  integer(4) :: version

2.9.6. cublasMpGridCreate

此函数初始化 cublasMp 库中使用的网格数据结构。它接受一个通信器以及与数据布局相关的其他信息作为输入。从版本 0.3.0 开始,它不再接受句柄参数。

type(cublasMpStatus) function cublasMpGridCreate(nprow, npcol, &
          layout, comm, grid)
  integer(8) :: nprow, npcol
  type(cublasMpGridLayout) :: layout ! usually column major in Fortran
  type(cal_comm) :: comm
  type(cublasMpGrid), intent(out) :: grid

2.9.7. cublasMpGridDestroy

此函数释放 cublasMp 库中使用的网格数据结构。从版本 0.3.0 开始,它不再接受句柄参数。

type(cublasMpStatus) function cublasMpGridDestroy(grid)
  type(cublasMpGrid) :: grid

2.9.8. cublasMpMatrixDescriptorCreate

此函数初始化 cublasMp 库中使用的矩阵描述符对象。它接受全局数组中的行数 (M) 和列数 (N),以及每个维度上的分块因子。RSRC 和 CSRC 当前必须为 0。LLD 是本地矩阵的引导维度,在分块和分布矩阵之后。从版本 0.3.0 开始,它不再接受句柄参数。

type(cublasMpStatus) function cublasMpMatrixDescriptorCreate(M, N, MB, NB, &
          RSRC, CSRC, LLD, dataType, grid, descr)
  integer(8) :: M, N, MB, NB, RSRC, CSRC, LLD
  type(cudaDataType) :: dataType
  type(cublasMpGrid) :: grid
  type(cublasMpMatrixDescriptor), intent(out)  :: descr

2.9.9. cublasMpMatrixDescriptorDestroy

此函数释放 cublasMp 库中使用的矩阵描述符对象。从版本 0.3.0 开始,它不再接受句柄参数。

type(cublasMpStatus) function cublasMpMatrixDescriptorDestroy(descr)
  type(cublasMpMatrixDescriptor) :: descr

2.9.10. cublasMpMatrixDescriptorInit

此函数初始化 cublasMp 库中使用的矩阵描述符对象中的值。它接受全局数组中的行数 (M) 和列数 (N),以及每个维度上的分块因子。RSRC 和 CSRC 当前必须为 0。LLD 是本地矩阵的引导维度,在分块和分布矩阵之后。

type(cublasMpStatus) function cublasMpMatrixDescriptorInit(M, N, MB, NB, &
          RSRC, CSRC, LLD, dataType, grid, descr)
  integer(8) :: M, N, MB, NB, RSRC, CSRC, LLD
  type(cudaDataType) :: dataType
  type(cublasMpGrid) :: grid
  type(cublasMpMatrixDescriptor), intent(out)  :: descr

2.9.11. cublasMpNumroc

此函数计算(并返回)分布式矩阵的本地行数或列数,类似于 ScaLAPACK NUMROC 函数。

type(cublasMpStatus) function cublasMpNumroc(N, NB, iproc, isrcproc, nprocs)
  integer(8) :: N, NB
  integer(4) :: iproc, isrcproc, nprocs

2.9.12. cublasMpMatmulDescriptorCreate

此函数初始化 cublasMp 库中使用的 matmul 描述符对象。

type(cublasMpStatus) function cublasMpMatmulDescriptorCreate(descr, computeType)
  type(cublasMpMatmulDescriptor)  :: descr
  type(cublasComputeType) :: computeType

2.9.13. cublasMpMatmulDescriptorDestroy

此函数销毁 cublasMp 库中使用的 matmul 描述符对象。

type(cublasMpStatus) function cublasMpMatmulDescriptorDestroy(descr)
  type(cublasMpMatmulDescriptor)  :: descr

2.9.14. cublasMpMatmulDescriptorAttributeSet

此函数设置 cublasMp 库中使用的 matmul 描述符对象中的属性。

type(cublasMpStatus) function cublasMpMatmulDescriptorAttributeSet(descr, attr &
          buf, sizeInBytes)
  type(cublasMpMatmulDescriptor)  :: descr
  type(cublasMpMatmulDescriptorAttribute)  :: attr
  integer(1) :: buf(sizeInBytes) ! Any type, kind, or rank allowed
  integer(8) :: sizeInBytes

2.9.15. cublasMpMatmulDescriptorAttributeGet

此函数检索 cublasMp 库中使用的 matmul 描述符对象中的属性。

type(cublasMpStatus) function cublasMpMatmulDescriptorAttributeGet(descr, attr &
          buf, sizeInBytes, sizeWritten)
  type(cublasMpMatmulDescriptor)  :: descr
  type(cublasMpMatmulDescriptorAttribute)  :: attr
  integer(1) :: buf(sizeInBytes) ! Any type, kind, or rank allowed
  integer(8) :: sizeInBytes, sizeWritten

2.9.16. cublasMpGemr2D_bufferSize

此函数计算 cublasMpGemr2D 的工作空间需求

type(cublasMpStatus) function cublasMpGemr2D_bufferSize(handle, M, N, &
   A, IA, JA, descrA, B, IB, JB, descrB, &
   devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes, comm)
   type(cublasMpHandle) :: handle
   integer(8), intent(in) :: M, N, IA, JA, IB, JB
   real(4), device, dimension(*) :: A, B  ! Any supported type and kind
   type(cublasMpMatrixDescriptor) :: descrA, descrB
   integer(8), intent(out) :: devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes
   type(cal_comm) :: comm

2.9.17. cublasMpGemr2D

此函数将矩阵从一种分布式形式复制到另一种形式。每个矩阵的布局在矩阵描述符中定义。M 和 N 是全局矩阵维度。IA、JA、IB 和 JB 是基于 1 的,并且对于完整矩阵通常等于 1。

type(cublasMpStatus) function cublasMpGemr2D(handle, M, N,  &
   A, IA, JA, descrA, B, IB, JB, descrB, &
   bufferOnDevice, devWorkspaceSizeInBytes, &
   bufferOnHost, hostWorkspaceSizeInBytes, comm)
   type(cublasMpHandle) :: handle
   integer(8), intent(in) :: M, N, IA, JA, IB, JB
   real(4), device, dimension(*) :: A, B  ! Any supported type and kind
   type(cublasMpMatrixDescriptor) :: descrA, descrB
   integer(8), intent(in) :: devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes
   integer(1), device :: bufferOnDevice(devWorkspaceSizeInBytes) ! Any type
   integer(1)         :: bufferOnHost(hostWorkspaceSizeInBytes)  ! Any type
   type(cal_comm) :: comm

2.9.18. cublasMpTrmr2D_bufferSize

此函数计算 cublasMpTrmr2D 的工作空间需求

type(cublasMpStatus) function cublasMpTrmr2D_bufferSize(handle, uplo, diag, &
   M, N, A, IA, JA, descrA, B, IB, JB, descrB, &
   devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes, comm)
   type(cublasMpHandle) :: handle
   integer(4), intent(in) :: uplo, diag
   integer(8), intent(in) :: M, N, IA, JA, IB, JB
   real(4), device, dimension(*) :: A, B  ! Any supported type and kind
   type(cublasMpMatrixDescriptor) :: descrA, descrB
   integer(8), intent(out) :: devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes
   type(cal_comm) :: comm

2.9.19. cublasMpTrmr2D

此函数将梯形矩阵从一种分布式形式复制到另一种形式。每个矩阵的布局在矩阵描述符中定义。M 和 N 是全局矩阵维度。IA、JA、IB 和 JB 是基于 1 的,并且对于完整矩阵通常等于 1。

type(cublasMpStatus) function cublasMpTrmr2D(handle, uplo, diag,  &
   M, N, A, IA, JA, descrA, B, IB, JB, descrB, &
   bufferOnDevice, devWorkspaceSizeInBytes, &
   bufferOnHost, hostWorkspaceSizeInBytes, comm)
   type(cublasMpHandle) :: handle
   integer(4), intent(in) :: uplo, diag
   integer(8), intent(in) :: M, N, IA, JA, IB, JB
   real(4), device, dimension(*) :: A, B  ! Any supported type and kind
   type(cublasMpMatrixDescriptor) :: descrA, descrB
   integer(8), intent(in) :: devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes
   integer(1), device :: bufferOnDevice(devWorkspaceSizeInBytes) ! Any type
   integer(1)         :: bufferOnHost(hostWorkspaceSizeInBytes)  ! Any type
   type(cal_comm) :: comm

2.9.20. cublasMpGemm_bufferSize

此函数计算 cublasMpGemm 的工作空间需求。

type(cublasMpStatus) function cublasMpGemm_bufferSize(handle, transA, transB, M, N, K, &
   alpha, A, IA, JA, descrA, B, IB, JB, descrB, beta, C, IC, JC, descrC, &
   computeType, devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes)
   type(cublasMpHandle) :: handle
   integer(4) :: transA, transB
   integer(8), intent(in) :: M, N, K, IA, JA, IB, JB, IC, JC
   real(4) :: alpha, beta  ! type and kind compatible with computeType
   real(4), device, dimension(*) :: A, B, C  ! Any supported type and kind
   type(cublasMpMatrixDescriptor) :: descrA, descrB, descrC
   type(cublasComputeType) :: computeType
   integer(8), intent(out) :: devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes

2.9.21. cublasMpGemm

这是 BLAS GEMM 操作的多处理器版本,类似于 ScaLAPACK PBLAS 函数 pdgemm、pzgemm 等。

GEMM 执行以下矩阵-矩阵运算之一

C := alpha*op( A )*op( B ) + beta*C,

其中 op( X ) 是以下之一

op( X ) = X 或 op( X ) = X**T,

alpha 和 beta 是标量,A、B 和 C 是矩阵,其中 op( A ) 是 m x k 矩阵,op( B ) 是 k x n 矩阵,C 是 m x n 矩阵。A、B 和 C 的数据应正确分布在进程网格上。该映射包含在描述符 descrA、descrB 和 descrC 中,通过 cublasMpMatrixDescriptorCreate() 函数。数据类型也在那时指定。M、N 和 K 是全局矩阵维度。IA、JA、IB、JB、IC 和 JC 是基于 1 的,并且对于完整矩阵通常等于 1。Integer(4) 输入值将根据接口提升为 integer(8)。

type(cublasMpStatus) function cublasMpGemm(handle, transA, transB, M, N, K, &
   alpha, A, IA, JA, descrA, B, IB, JB, descrB, beta, C, IC, JC, descrC, &
   computeType, bufferOnDevice, devWorkspaceSizeInBytes, &
   bufferOnHost, hostWorkspaceSizeInBytes)
   type(cublasMpHandle) :: handle
   integer(4) :: transA, transB
   integer(8), intent(in) :: M, N, K, IA, JA, IB, JB, IC, JC
   real(4) :: alpha, beta  ! type and kind compatible with computeType
   real(4), device, dimension(*) :: A, B, C  ! Any supported type and kind
   type(cublasMpMatrixDescriptor) :: descrA, descrB, descrC
   type(cublasComputeType) :: computeType
   integer(8), intent(in) :: devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes
   integer(1), device :: bufferOnDevice(devWorkspaceInBytes) ! Any type
   integer(1)         :: bufferOnHost(hostWorkspaceInBytes)  ! Any type

2.9.22. cublasMpMatmul_bufferSize

此函数计算 cublasMpMatmul 的工作空间需求。

type(cublasMpStatus) function cublasMpMatmul_bufferSize(handle, matmulDescr, M, N, K, &
   alpha, A, IA, JA, descrA, B, IB, JB, descrB, beta, C, IC, JC, descrC, &
   D, ID, JD, descrD, devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes)
   type(cublasMpHandle) :: handle
   type(cublasMpMatmulDescriptor) :: matmulDescr
   integer(8), intent(in) :: M, N, K, IA, JA, IB, JB, IC, JC, ID, JD
   real(4) :: alpha, beta  ! Any compatible kind
   real(4), device, dimension(*) :: A, B, C, D  ! Any supported type and kind
   type(cublasMpMatrixDescriptor) :: descrA, descrB, descrC, descrD
   integer(8), intent(out) :: devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes

2.9.23. cublasMpMatmul

这是矩阵乘法操作的多处理器版本。

Matmul 执行以下矩阵-矩阵运算之一

D := alpha*op( A )*op( B ) + beta*C,

其中 op( X ) 是以下之一

op( X ) = X 或 op( X ) = X**T,由调用 cublasMpMatmulDescriptorAttributeSet() 设置。

alpha 和 beta 是标量,A、B、C 和 D 是矩阵,其中 op( A ) 是 m x k 矩阵,op( B ) 是 k x n 矩阵,C 和 D 是 m x n 矩阵。A、B、C 和 D 的数据应正确分布在进程网格上。该映射包含在描述符 descrA、descrB、descrC 和 descrD 中,通过 cublasMpMatrixDescriptorCreate() 函数。数据类型也在那里指定。M、N 和 K 是全局矩阵维度。IA、JA、IB、JB、IC、JC、ID 和 JD 是基于 1 的,并且对于完整矩阵通常等于 1。Integer(4) 输入值将根据接口提升为 integer(8)。

type(cublasMpStatus) function cublasMpMatmul(handle, matmulDescr, M, N, K, &
   alpha, A, IA, JA, descrA, B, IB, JB, descrB, beta, C, IC, JC, descrC, &
   D, ID, JD, descrD, bufferOnDevice, devWorkspaceSizeInBytes, &
   bufferOnHost, hostWorkspaceSizeInBytes)
   type(cublasMpHandle) :: handle
   type(cublasMpMatmulDescriptor) :: matmulDescr
   integer(8), intent(in) :: M, N, K, IA, JA, IB, JB, IC, JC, ID, JD
   real(4) :: alpha, beta  ! Any supported type and kind
   real(4), device, dimension(*) :: A, B, C, D  ! Any supported type and kind
   type(cublasMpMatrixDescriptor) :: descrA, descrB, descrC, descrD
   integer(8), intent(in) :: devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes
   integer(1), device :: bufferOnDevice(devWorkspaceInBytes) ! Any type
   integer(1)         :: bufferOnHost(hostWorkspaceInBytes)  ! Any type

2.9.24. cublasMpSyrk

这是 BLAS SYRK 操作的多处理器版本,类似于 ScaLAPACK PBLAS 函数 pdsyrk、pzsyrk 等。

SYRK 执行以下对称秩 k 运算之一

C := alpha*A*A**T + beta*C, 或

C := alpha*A**T*A + beta*C

alpha 和 beta 是标量,A 和 C 是矩阵。A 是 N x K 或 K x N,具体取决于 trans 参数,C 是 N x N。A 和 C 的数据应正确分布在进程网格上。该映射包含在描述符 descrA 和 descrC 中,通过 cublasMpMatrixDescriptorCreate() 函数。数据类型也在那时指定。N 和 K 是全局矩阵维度。IA、JA、IC 和 JC 是基于 1 的,并且对于完整矩阵通常等于 1。Integer(4) 输入值将根据接口提升为 integer(8)。

type(cublasMpStatus) function cublasMpSyrk(handle, uplo, trans, &
   N, K, alpha, A, IA, JA, descrA, beta, C, IC, JC, descrC, &
   computeType, bufferOnDevice, devWorkspaceSizeInBytes, &
   bufferOnHost, hostWorkspaceSizeInBytes)
   type(cublasMpHandle) :: handle
   integer(4) :: uplo, trans
   integer(8), intent(in) :: N, K, IA, JA, IC, JC
   real(4) :: alpha, beta  ! type and kind compatible with computeType
   real(4), device, dimension(*) :: A, C  ! Any supported type and kind
   type(cublasMpMatrixDescriptor) :: descrA, descrC
   type(cublasComputeType) :: computeType
   integer(8), intent(in) :: devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes
   integer(1), device :: bufferOnDevice(devWorkspaceSizeInBytes) ! Any type
   integer(1)         :: bufferOnHost(hostWorkspaceSizeInBytes)  ! Any type

2.9.25. cublasMpSyrk

这是 BLAS SYRK 操作的多处理器版本,类似于 ScaLAPACK PBLAS 函数 pdsyrk、pzsyrk 等。

SYRK 执行以下对称秩 k 运算之一

C := alpha*A*A**T + beta*C, 或

C := alpha*A**T*A + beta*C

alpha 和 beta 是标量,A 和 C 是矩阵。A 是 N x K 或 K x N,具体取决于 trans 参数,C 是 N x N。A 和 C 的数据应正确分布在进程网格上。该映射包含在描述符 descrA 和 descrC 中,通过 cublasMpMatrixDescriptorCreate() 函数。数据类型也在那时指定。N 和 K 是全局矩阵维度。IA、JA、IC 和 JC 是基于 1 的,并且对于完整矩阵通常等于 1。Integer(4) 输入值将根据接口提升为 integer(8)。

type(cublasMpStatus) function cublasMpSyrk(handle, uplo, trans, &
   N, K, alpha, A, IA, JA, descrA, beta, C, IC, JC, descrC, &
   computeType, bufferOnDevice, devWorkspaceSizeInBytes, &
   bufferOnHost, hostWorkspaceSizeInBytes)
   type(cublasMpHandle) :: handle
   integer(4) :: uplo, trans
   integer(8), intent(in) :: N, K, IA, JA, IC, JC
   real(4) :: alpha, beta  ! type and kind compatible with computeType
   real(4), device, dimension(*) :: A, C  ! Any supported type and kind
   type(cublasMpMatrixDescriptor) :: descrA, descrC
   type(cublasComputeType) :: computeType
   integer(8), intent(in) :: devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes
   integer(1), device :: bufferOnDevice(devWorkspaceSizeInBytes) ! Any type
   integer(1)         :: bufferOnHost(hostWorkspaceSizeInBytes)  ! Any type

2.9.26. cublasMpTrsm_bufferSize

此函数计算 cublasMpTrsm 的工作空间需求。

type(cublasMpStatus) function cublasMpTrsm_bufferSize(handle, side, uplo, trans, diag, &
   M, N, alpha, A, IA, JA, descrA, B, IB, JB, descrB, &
   computeType, devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes)
   type(cublasMpHandle) :: handle
   integer(4) :: side, uplo, trans, diag
   integer(8), intent(in) :: M, N, IA, JA, IB, JB
   real(4) :: alpha  ! type and kind compatible with computeType
   real(4), device, dimension(*) :: A, B  ! Any supported type and kind
   type(cublasMpMatrixDescriptor) :: descrA, descrB
   type(cublasComputeType) :: computeType
   integer(8), intent(out) :: devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes

2.9.27. cublasMpTrsm

这是 BLAS TRSM 操作的多处理器版本,类似于 ScaLAPACK PBLAS 函数 pdtrsm、pztrsm 等。

TRSM 求解以下矩阵方程之一

op( A )*X = alpha*B, 或

X*op( A ) = alpha*B

alpha 是标量,A 和 B 是矩阵,其维度由 side 参数确定。A 和 B 的数据应正确分布在进程网格上。该映射包含在描述符 descrA 和 descrB 中,通过 cublasMpMatrixDescriptorCreate() 函数。数据类型也在那时指定。M 和 N 是全局矩阵维度。IA、JA、IB 和 JB 是基于 1 的,并且对于完整矩阵通常等于 1。Integer(4) 输入值将根据接口提升为 integer(8)。

type(cublasMpStatus) function cublasMpTrsm(handle, side, uplo, trans, diag,  &
   M, N, alpha, A, IA, JA, descrA, B, IB, JB, descrB, &
   computeType, bufferOnDevice, devWorkspaceSizeInBytes, &
   bufferOnHost, hostWorkspaceSizeInBytes)
   type(cublasMpHandle) :: handle
   integer(4) :: side, uplo, trans, diag
   integer(8), intent(in) :: M, N, IA, JA, IB, JB
   real(4) :: alpha  ! type and kind compatible with computeType
   real(4), device, dimension(*) :: A, B  ! Any supported type and kind
   type(cublasMpMatrixDescriptor) :: descrA, descrB
   type(cublasComputeType) :: computeType
   integer(8), intent(in) :: devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes
   integer(1), device :: bufferOnDevice(devWorkspaceSizeInBytes) ! Any type
   integer(1)         :: bufferOnHost(hostWorkspaceSizeInBytes)     ! Any type

2.9.28. cublasMpGeadd_bufferSize

此函数计算 cublasMpGeadd 的工作空间需求。

type(cublasMpStatus) function cublasMpGeadd_bufferSize(handle, trans, &
   M, N, alpha, A, IA, JA, descrA, beta, C, IC, JC, descrC, &
   devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes)
   type(cublasMpHandle) :: handle
   integer(4) :: trans
   integer(8), intent(in) :: M, N, IA, JA, IC, JC
   real(4) :: alpha, beta  ! Any compatible kind
   real(4), device, dimension(*) :: A, C  ! Any supported type and kind
   type(cublasMpMatrixDescriptor) :: descrA, descrC
   integer(8), intent(out) :: devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes

2.9.29. cublasMpGeadd

这是一般矩阵加法函数的多处理器版本。

GEADD 执行矩阵-矩阵加法运算

C := alpha*A + beta*C

alpha 和 beta 是标量,A 和 C 是矩阵。A 的维度取决于 trans 参数,可以是 M x N 或 N x M,C 的维度是 M x N。A 和 C 的数据应在进程网格上正确分布。该映射包含在描述符 descrA 和 descrC 中,通过 cublasMpMatrixDescriptorCreate() 函数创建。数据类型也在那时指定。M 和 N 是全局矩阵维度。IA、JA、IC 和 JC 是从 1 开始的索引,对于完整矩阵通常等于 1。Integer(4) 输入值将根据接口提升为 integer(8)。

type(cublasMpStatus) function cublasMpGeadd(handle, trans, &
   M, N, alpha, A, IA, JA, descrA, beta, C, IC, JC, descrC, &
   bufferOnDevice, devWorkspaceSizeInBytes, &
   bufferOnHost, hostWorkspaceSizeInBytes)
   type(cublasMpHandle) :: handle
   integer(4) :: trans
   integer(8), intent(in) :: M, N, IA, JA, IC, JC
   real(4) :: alpha, beta  ! Any compatible type and kind
   real(4), device, dimension(*) :: A, C  ! Any supported type and kind
   type(cublasMpMatrixDescriptor) :: descrA, descrC
   integer(8), intent(in) :: devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes
   integer(1), device :: bufferOnDevice(devWorkspaceSizeInBytes) ! Any type
   integer(1)         :: bufferOnHost(hostWorkspaceSizeInBytes)  ! Any type

2.9.30. cublasMpTradd_bufferSize

此函数计算 cublasMpTradd 的工作空间需求。

type(cublasMpStatus) function cublasMpTradd_bufferSize(handle, uplo, trans, &
   M, N, alpha, A, IA, JA, descrA, beta, C, IC, JC, descrC, &
   devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes)
   type(cublasMpHandle) :: handle
   integer(4) :: uplo, trans
   integer(8), intent(in) :: M, N, IA, JA, IC, JC
   real(4) :: alpha, beta  ! Any compatible kind
   real(4), device, dimension(*) :: A, C  ! Any supported type and kind
   type(cublasMpMatrixDescriptor) :: descrA, descrC
   integer(8), intent(out) :: devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes

2.9.31. cublasMpTradd

这是梯形矩阵加法函数的多处理器版本。

TRADD 执行梯形矩阵-矩阵加法运算

C := alpha*A + beta*C

alpha 和 beta 是标量,A 和 C 是矩阵。A 的维度取决于 trans 参数,可以是 M x N 或 N x M,C 的维度是 M x N。A 和 C 的数据应在进程网格上正确分布。该映射包含在描述符 descrA 和 descrC 中,通过 cublasMpMatrixDescriptorCreate() 函数创建。数据类型也在那时指定。M 和 N 是全局矩阵维度。IA、JA、IC 和 JC 是从 1 开始的索引,对于完整矩阵通常等于 1。Integer(4) 输入值将根据接口提升为 integer(8)。

type(cublasMpStatus) function cublasMpTradd(handle, uplo, trans, &
   M, N, alpha, A, IA, JA, descrA, beta, C, IC, JC, descrC, &
   bufferOnDevice, devWorkspaceSizeInBytes, &
   bufferOnHost, hostWorkspaceSizeInBytes)
   type(cublasMpHandle) :: handle
   integer(4) :: uplo, trans
   integer(8), intent(in) :: M, N, IA, JA, IC, JC
   real(4) :: alpha, beta  ! Any compatible type and kind
   real(4), device, dimension(*) :: A, C  ! Any supported type and kind
   type(cublasMpMatrixDescriptor) :: descrA, descrC
   integer(8), intent(in) :: devWorkspaceSizeInBytes, hostWorkspaceSizeInBytes
   integer(1), device :: bufferOnDevice(devWorkspaceSizeInBytes) ! Any type
   integer(1)         :: bufferOnHost(hostWorkspaceSizeInBytes)  ! Any type

2.9.32. cublasMpLoggerSetFile

此函数指定要用作 cublasMp 日志文件的 Fortran 单元。

type(cublasMpStatus) function cublasMpLoggerSetFile(unit)
  integer :: unit

2.9.33. cublasMpLoggerOpenFile

此函数指定要打开并用作 cublasMp 日志文件的 Fortran 字符串。

type(cublasMpStatus) function cublasMpLoggerOpenFile(logFile)
  character*(*) :: logFile

2.9.34. cublasMpLoggerSetLevel

此函数指定 cublasMp 日志记录级别。

type(cublasMpStatus) function cublasMpLoggerSetLevel(level)
  integer :: level

2.9.35. cublasMpLoggerSetMask

此函数指定 cublasMp 日志记录掩码。

type(cublasMpStatus) function cublasMpLoggerSetMask(mask)
  integer :: mask

2.9.36. cublasMpLoggerForceDisable

此函数禁用 cublasMp 日志记录。

type(cublasMpStatus) function cublasMpLoggerForceDisable()

3. FFT 运行时库 API

本节介绍 cuFFT 库的 Fortran 接口。FFT 函数只能从主机代码访问。所有运行时 API 例程都是返回错误代码的整数函数;如果调用成功,它们返回 CUFFT_SUCCESS 值,如果出现错误,则返回另一个 cuFFT 状态返回值。

第 10 章包含从 OpenACC 和 CUDA Fortran 访问 cuFFT 库例程的示例。在这两种情况下,可以通过添加以下行来公开库的接口

use cufft

到您的程序单元。

从 21.9 版本开始,我们还支持 cufftXt 模块,该模块提供对 cuFFT 库中提供的多 GPU 支持的接口。这些接口可以在任何 Fortran 程序中使用,方法是添加以下行

use cufftxt

到您的程序单元。cufftXt 接口的文档从本章第 4 节开始。

除非在以下接口中提供了特定的 kind,否则 plain integer 类型意味着 integer(4),plain real 类型意味着 real(4)。

3.1. CUFFT 定义和辅助函数

本节包含 cuFFT 库中使用的定义和数据类型,以及 cuFFT 辅助函数的接口。

cufft 模块包含以下常量和枚举

integer, parameter :: CUFFT_FORWARD = -1
integer, parameter :: CUFFT_INVERSE = 1
! CUFFT Status
enum, bind(C)
    enumerator :: CUFFT_SUCCESS        = 0
    enumerator :: CUFFT_INVALID_PLAN   = 1
    enumerator :: CUFFT_ALLOC_FAILED   = 2
    enumerator :: CUFFT_INVALID_TYPE   = 3
    enumerator :: CUFFT_INVALID_VALUE  = 4
    enumerator :: CUFFT_INTERNAL_ERROR = 5
    enumerator :: CUFFT_EXEC_FAILED    = 6
    enumerator :: CUFFT_SETUP_FAILED   = 7
    enumerator :: CUFFT_INVALID_SIZE   = 8
    enumerator :: CUFFT_UNALIGNED_DATA = 9
end enum
! CUFFT Transform Types
enum, bind(C)
    enumerator :: CUFFT_R2C = z'2a'     ! Real to Complex (interleaved)
    enumerator :: CUFFT_C2R = z'2c'     ! Complex (interleaved) to Real
    enumerator :: CUFFT_C2C = z'29'     ! Complex to Complex, interleaved
    enumerator :: CUFFT_D2Z = z'6a'     ! Double to Double-Complex
    enumerator :: CUFFT_Z2D = z'6c'     ! Double-Complex to Double
    enumerator :: CUFFT_Z2Z = z'69'     ! Double-Complex to Double-Complex
end enum
! CUFFT Data Layouts
enum, bind(C)
    enumerator :: CUFFT_COMPATIBILITY_NATIVE          = 0
    enumerator :: CUFFT_COMPATIBILITY_FFTW_PADDING    = 1
    enumerator :: CUFFT_COMPATIBILITY_FFTW_ASYMMETRIC = 2
    enumerator :: CUFFT_COMPATIBILITY_FFTW_ALL        = 3
end enum
integer, parameter :: CUFFT_COMPATIBILITY_DEFAULT = CUFFT_COMPATIBILITY_FFTW_PADDING

3.1.1. cufftSetCompatibilityMode

此函数配置 FFTW 兼容模式下 cuFFT 输出的布局。

integer(4) function cufftSetCompatibilityMode( plan, mode )
  integer :: plan
  integer :: mode

3.1.2. cufftSetStream

此函数设置 cuFFT 库用于执行其例程的流。

integer(4) function cufftSetStream(plan, stream)
  integer :: plan
  integer(kind=cuda_stream_kind) :: stream

3.1.3. cufftGetVersion

此函数返回 cuFFT 的版本号。

integer(4) function cufftGetVersion( version )
  integer :: version

3.1.4. cufftSetAutoAllocation

此函数指示调用者打算为已生成的计划分配和管理工作区。cuFFT 默认行为是在计划生成时分配工作区。如果在调用 cufftMakePlan*() 之一之前调用了 cufftSetAutoAllocation(),并将 autoAllocate 设置为 0,则 cuFFT 不会分配工作区。对于希望管理工作区分配的调用者来说,这是首选的顺序。

integer(4) function cufftSetAutoAllocation(plan, autoAllocate)
  integer(4) :: plan, autoallocate

3.1.5. cufftSetWorkArea

此函数覆盖与计划关联的工作区指针。如果工作区是自动分配的,则 cuFFT 会释放自动分配的空间。cufftExecute*() 调用假定工作区指针有效,并且它指向设备内存中的一个连续区域,该区域不与其他任何工作区重叠。如果不是这种情况,结果将是不确定的。

integer(4) function cufftSetWorkArea(plan, workArea)
  integer(4) :: plan
  integer, device :: workArea(*) ! Can be integer, real, complex
                                 ! or a type(c_devptr)

3.1.6. cufftDestroy

此函数释放与 cuFFT 计划关联的所有 GPU 资源,并销毁内部计划数据结构。

integer(4) function cufftDestroy( plan )
  integer :: plan

3.2. CUFFT 计划和估计大小函数

本节包含 cuFFT 库中用于创建计划和估计工作缓冲区大小的函数。

3.2.1. cufftPlan1d

此函数为指定的信号大小和数据类型创建 1D FFT 计划配置。Nx 是变换的大小;batch 是大小为 nx 的变换的数量。

integer(4) function cufftPlan1d(plan, nx, ffttype, batch)
  integer :: plan
  integer :: nx
  integer :: ffttype
  integer :: batch

3.2.2. cufftPlan2d

此函数根据指定的信号大小和数据类型创建 2D FFT 计划配置。对于 Fortran 数组 (nx,ny),nx 是变换中第 1 维的大小,但它是函数的第 2 个大小参数;ny 是第 2 维的大小,并且是函数的第 1 个大小参数。

integer(4) function cufftPlan2d( plan, ny, nx, ffttype )
  integer :: plan
  integer :: ny, nx
  integer :: ffttype

3.2.3. cufftPlan3d

此函数根据指定的信号大小和数据类型创建 3D FFT 计划配置。对于 Fortran 数组 (nx,ny,nz),nx 是变换中第 1 维的大小,但它是函数的第 3 个大小参数;nz 是第 3 维的大小,并且是函数的第 1 个大小参数。

integer(4) function cufftPlan3d( plan, nz, ny, nx, ffttype )
  integer :: plan
  integer :: nz, ny, nx
  integer :: ffttype

3.2.4. cufftPlanMany

此函数创建维度为 rank 的 FFT 计划配置,大小在数组 n 中指定。Batch 是要配置的变换的数量。此函数使用参数 inembed、istride、idist、onembed、ostride 和 odist 支持更复杂的输入和输出数据布局。在 C 函数中,如果 inembed 和 onembed 设置为 NULL,则所有其他步幅信息都将被忽略。当使用 NVIDIA cufft 模块时,Fortran 程序员可以通过将 F90 指针设置为 null() 来传递 NULL,可以通过直接赋值、使用 c_f_pointer() 和 c_null_ptr 作为第一个参数,或 nullify 语句,然后将 nullified F90 指针作为 inembed 和 onembed 哑元的实际参数传递。

integer(4) function cufftPlanMany(plan, rank, n, inembed, istride, idist, onembed, ostride, odist, ffttype, batch )
  integer :: plan
  integer :: rank
  integer :: n
  integer :: inembed, onembed
  integer :: istride, idist, ostride, odist
  integer :: ffttype, batch

3.2.5. cufftCreate

此函数为进一步的 cuFFT 调用创建不透明句柄,并在主机上分配一些小型数据结构。在 C 中,句柄类型当前 typedef 为 int,因此在 Fortran 中,我们使用 integer*4 来保存计划。

integer(4) function cufftCreate(plan)
  integer(4) :: plan

3.2.6. cufftMakePlan1d

在调用 cufftCreate() 之后,此函数为指定的信号大小和数据类型创建 1D FFT 计划配置。Nx 是变换的大小;batch 是大小为 nx 的变换的数量。如果在本次调用之前使用多个 GPU 调用了 cufftXtSetGPUs,则 workSize 是一个包含多个大小的数组。workSize 值以字节为单位。

integer(4) function cufftMakePlan1d(plan, nx, ffttype, batch, worksize)
  integer(4) :: plan
  integer(4) :: nx
  integer(4) :: ffttype
  integer(4) :: batch
  integer(kind=int_ptr_kind()) :: workSize(*)

3.2.7. cufftMakePlan2d

在调用 cufftCreate() 之后,此函数根据指定的信号大小和数据类型创建 2D FFT 计划配置。对于 Fortran 数组 (nx,ny),nx 是变换中第 1 维的大小,但它是函数的第 2 个大小参数;ny 是第 2 维的大小,并且是函数的第 1 个大小参数。如果在本次调用之前使用多个 GPU 调用了 cufftXtSetGPUs,则 workSize 是一个包含多个大小的数组。workSize 值以字节为单位。

integer(4) function cufftMakePlan2d(plan, ny, nx, ffttype, workSize)
  integer(4) :: plan
  integer(4) :: ny, nx
  integer(4) :: ffttype
  integer(kind=int_ptr_kind()) :: workSize(*)

3.2.8. cufftMakePlan3d

在调用 cufftCreate() 之后,此函数根据指定的信号大小和数据类型创建 3D FFT 计划配置。对于 Fortran 数组 (nx,ny,nz),nx 是变换中第 1 维的大小,但它是函数的第 3 个大小参数;nz 是第 3 维的大小,并且是函数的第 1 个大小参数。如果在本次调用之前使用多个 GPU 调用了 cufftXtSetGPUs,则 workSize 是一个包含多个大小的数组。workSize 值以字节为单位。

integer(4) function cufftMakePlan3d(plan, nz, ny, nx, ffttype, workSize)
  integer(4) :: plan
  integer(4) :: nz, ny, nx
  integer(4) :: ffttype
  integer(kind=int_ptr_kind()) :: workSize(*)

3.2.9. cufftMakePlanMany

在调用 cufftCreate() 之后,此函数创建维度为 rank 的 FFT 计划配置,大小在数组 n 中指定。Batch 是要配置的变换的数量。此函数使用参数 inembed、istride、idist、onembed、ostride 和 odist 支持更复杂的输入和输出数据布局。

在 C 函数中,如果 inembed 和 onembed 设置为 NULL,则所有其他步幅信息都将被忽略。当使用 NVIDIA cufft 模块时,Fortran 程序员可以通过将 F90 指针设置为 null() 来传递 NULL,可以通过直接赋值、使用 c_f_pointer() 和 c_null_ptr 作为第一个参数,或 nullify 语句,然后将 nullified F90 指针作为 inembed 和 onembed 哑元的实际参数传递。

如果在本次调用之前使用多个 GPU 调用了 cufftXtSetGPUs,则 workSize 是一个包含多个大小的数组。workSize 值以字节为单位。

integer(4) function cufftMakePlanMany(plan, rank, n, inembed, istride, idist, onembed, ostride, odist, ffttype, batch, workSize)
  integer(4) :: plan
  integer(4) :: rank
  integer :: n(rank)
  integer :: inembed(rank), onembed(rank)
  integer(4) :: istride, idist, ostride, odist
  integer(4) :: ffttype, batch
  integer(kind=int_ptr_kind()) :: workSize(*)

3.2.10. cufftEstimate1d

此函数返回所需工作区大小的估计值(以字节为单位),给定指定的大小和数据类型,并假设使用默认计划设置。

integer(4) function cufftEstimate1d(nx, ffttype, batch, workSize)
  integer(4) :: nx
  integer(4) :: ffttype
  integer(4) :: batch
  integer(kind=int_ptr_kind()) :: workSize(*)

3.2.11. cufftEstimate2d

此函数返回所需工作区大小的估计值(以字节为单位),给定指定的大小和数据类型,并假设使用默认计划设置。

integer(4) function cufftEstimate2d(ny, nx, ffttype, workSize)
  integer(4) :: ny, nx
  integer(4) :: ffttype
  integer(kind=int_ptr_kind()) :: workSize(*)

3.2.12. cufftEstimate3d

此函数返回所需工作区大小的估计值(以字节为单位),给定指定的大小和数据类型,并假设使用默认计划设置。

integer(4) function cufftEstimate3d(nz, ny, nx, ffttype, workSize)
  integer(4) :: nz, ny, nx
  integer(4) :: ffttype
  integer(kind=int_ptr_kind()) :: workSize(*)

3.2.13. cufftEstimateMany

此函数返回所需工作区大小的估计值(以字节为单位),给定指定的大小和数据类型,并假设使用默认计划设置。

integer(4) function cufftEstimateMany(rank, n, inembed, istride, idist, onembed, ostride, odist, ffttype, batch, workSize)
  integer(4) :: rank, istride, idist, ostride, odist
  integer(4), dimension(rank) :: n, inembed, onembed
  integer(4) :: ffttype
  integer(4) :: batch
  integer(kind=int_ptr_kind()) :: workSize(*)

3.2.14. cufftGetSize1d

此函数比 cufftEstimate1d() 更准确地估计所需工作区的大小(以字节为单位),给定指定的计划参数,并考虑可能已完成的任何计划设置。

integer(4) function cufftGetSize1d(plan, nx, ffttype, batch, workSize)
  integer(4) :: plan, nx, ffttype, batch
  integer(kind=int_ptr_kind()) :: workSize(*)

3.2.15. cufftGetSize2d

此函数比 cufftEstimate2d() 更准确地估计所需工作区的大小(以字节为单位),给定指定的计划参数,并考虑可能已完成的任何计划设置。

integer(4) function cufftGetSize2d(plan, ny, nx, ffttype, workSize)
  integer(4) :: plan, ny, nx, ffttype
  integer(kind=int_ptr_kind()) :: workSize(*)

3.2.16. cufftGetSize3d

此函数比 cufftEstimate3d() 更准确地估计所需工作区的大小(以字节为单位),给定指定的计划参数,并考虑可能已完成的任何计划设置。

integer(4) function cufftGetSize3d(plan, nz, ny, nx, ffttype, workSize)
  integer(4) :: plan, nz, ny, nx, ffttype
  integer(kind=int_ptr_kind()) :: workSize(*)

3.2.17. cufftGetSizeMany

此函数比 cufftEstimateMany() 更准确地估计所需工作区的大小(以字节为单位),给定指定的计划参数,并考虑可能已完成的任何计划设置。

integer(4) function cufftGetSizeMany(plan, rank, n, inembed, istride, idist, onembed, ostride, odist, ffttype, batch, workSize)
  integer(4) :: plan, rank, istride, idist, ostride, odist
  integer(4), dimension(rank) :: n, inembed, onembed
  integer(4) :: ffttype
  integer(4) :: batch
  integer(kind=int_ptr_kind()) :: workSize(*)

3.2.18. cufftGetSize

一旦完成计划生成(无论是使用原始 API 还是可扩展 API),此调用将返回支持该计划所需的实际工作区大小(以字节为单位)。选择在其应用程序中管理工作区分配的调用者必须在计划生成之后以及在计划生成之后可能更改所需工作空间大小的任何 cufftSet*() 调用之后使用此调用。

integer(4) function cufftGetSize(plan, workSize)
  integer(4) :: plan
  integer(kind=int_ptr_kind()) :: workSize(*)

3.3. CUFFT 执行函数

本节包含 cuFFT 库中执行实际傅里叶变换的执行函数。

3.3.1. cufftExecC2C

此函数在 direction 参数指定的变换方向中执行单精度复数到复数变换计划。如果 idata 和 odata 相同,则此函数执行就地变换。

integer(4) function cufftExecC2C( plan, idata, odata, direction )
  integer :: plan
  complex(4), device, dimension(*) :: idata, odata
  integer :: direction

3.3.2. cufftExecR2C

此函数执行单精度实数到复数、隐式正向 cuFFT 变换计划。如果 idata 和 odata 相同,则此函数执行就地变换,但请注意,对于 cuFFT 中的实数到复数 FFT,就地变换和异地变换之间存在数据布局差异。

integer(4) function cufftExecR2C( plan, idata, odata )
  integer :: plan
  real(4), device, dimension(*) :: idata
  complex(4), device, dimension(*) :: odata

3.3.3. cufftExecC2R

此函数执行单精度复数到实数、隐式反向 cuFFT 变换计划。如果 idata 和 odata 相同,则此函数执行就地变换。

integer(4) function cufftExecC2R( plan, idata, odata )
  integer :: plan
  complex(4), device, dimension(*) :: idata
  real(4), device, dimension(*) :: odata

3.3.4. cufftExecZ2Z

此函数在 direction 参数指定的变换方向中执行双精度复数到复数变换计划。如果 idata 和 odata 相同,则此函数执行就地变换。

integer(4) function cufftExecZ2Z( plan, idata, odata, direction )
  integer :: plan
  complex(8), device, dimension(*) :: idata, odata
  integer :: direction

3.3.5. cufftExecD2Z

此函数执行双精度实数到复数、隐式正向 cuFFT 变换计划。如果 idata 和 odata 相同,则此函数执行就地变换,但请注意,对于 cuFFT 中的实数到复数 FFT,就地变换和异地变换之间存在数据布局差异。

integer(4) function cufftExecD2Z( plan, idata, odata )
  integer :: plan
  real(8), device, dimension(*) :: idata
  complex(8), device, dimension(*) :: odata

3.3.6. cufftExecZ2D

此函数执行双精度复数到实数、隐式反向 cuFFT 变换计划。如果 idata 和 odata 相同,则此函数执行就地变换。

integer(4) function cufftExecZ2D( plan, idata, odata )
  integer :: plan
  complex(8), device, dimension(*) :: idata
  real(8), device, dimension(*) :: odata

3.4. CUFFTXT 定义和辅助函数

本节包含 cufftXt 库中使用的定义和数据类型,以及辅助函数的接口。从 NVHPC 22.5 版本开始,此模块还包含一些与 cuFFTMp 库一起使用的接口和定义。

cufftXt 模块包含以下常量和枚举

integer, parameter :: MAX_CUDA_DESCRIPTOR_GPUS = 64
! libFormat enum is used for the library member of cudaLibXtDesc
enum, bind(C)
    enumerator :: LIB_FORMAT_CUFFT     = 0
    enumerator :: LIB_FORMAT_UNDEFINED = 1
end enum
! cufftXtSubFormat identifies the data layout of a memory descriptor
enum, bind(C)
    ! by default input is in linear order across GPUs
    enumerator :: CUFFT_XT_FORMAT_INPUT = 0

    ! by default output is in scrambled order depending on transform
    enumerator :: CUFFT_XT_FORMAT_OUTPUT = 1

    ! by default inplace is input order, which is linear across GPUs
    enumerator :: CUFFT_XT_FORMAT_INPLACE = 2

    ! shuffled output order after execution of the transform
    enumerator :: CUFFT_XT_FORMAT_INPLACE_SHUFFLED = 3

    ! shuffled input order prior to execution of 1D transforms
    enumerator :: CUFFT_XT_FORMAT_1D_INPUT_SHUFFLED = 4

    ! distributed input order
    enumerator :: CUFFT_XT_FORMAT_DISTRIBUTED_INPUT = 5

    ! distributed output order
    enumerator :: CUFFT_XT_FORMAT_DISTRIBUTED_OUTPUT = 6

    enumerator :: CUFFT_FORMAT_UNDEFINED = 7
end enum
! cufftXtCopyType specifies the type of copy for cufftXtMemcpy
enum, bind(C)
    enumerator :: CUFFT_COPY_HOST_TO_DEVICE   = 0
    enumerator :: CUFFT_COPY_DEVICE_TO_HOST   = 1
    enumerator :: CUFFT_COPY_DEVICE_TO_DEVICE = 2
    enumerator :: CUFFT_COPY_UNDEFINED        = 3
end enum
! cufftXtQueryType specifies the type of query for cufftXtQueryPlan
enum, bind(c)
    enumerator :: CUFFT_QUERY_1D_FACTORS = 0
    enumerator :: CUFFT_QUERY_UNDEFINED  = 1
end enum
! cufftXtWorkAreaPolicy specifies the policy for cufftXtSetWorkAreaPolicy
enum, bind(c)
    enumerator :: CUFFT_WORKAREA_MINIMAL     = 0 ! maximum reduction
    enumerator :: CUFFT_WORKAREA_USER        = 1 ! use workSize parameter as limit
    enumerator :: CUFFT_WORKAREA_PERFORMANCE = 2 ! default - 1x overhead or more, max perf
end enum
! cufftMpCommType specifies how to initialize cuFFTMp
enum, bind(c)
    enumerator :: CUFFT_COMM_MPI       = 0
    enumerator :: CUFFT_COMM_NVSHMEM   = 1
    enumerator :: CUFFT_COMM_UNDEFINED = 2
end enum

cufftXt 模块包含以下派生类型定义

! cufftXt1dFactors type
type, bind(c) :: cufftXt1dFactors
    integer(8) :: size
    integer(8) :: stringCount
    integer(8) :: stringLength
    integer(8) :: subStringLength
    integer(8) :: factor1
    integer(8) :: factor2
    integer(8) :: stringMask
    integer(8) :: subStringMask
    integer(8) :: factor1Mask
    integer(8) :: factor2Mask
    integer(4) :: stringShift
    integer(4) :: subStringShift
    integer(4) :: factor1Shift
    integer(4) :: factor2Shift
end type cufftXt1dFactors
type, bind(C) :: cudaXtDesc
    integer(4) :: version
    integer(4) :: nGPUs
    integer(4) :: GPUs(MAX_CUDA_DESCRIPTOR_GPUS)
    type(c_devptr) :: data(MAX_CUDA_DESCRIPTOR_GPUS)
    integer(8) :: size(MAX_CUDA_DESCRIPTOR_GPUS)
    type(c_ptr) :: cudaXtState
end type cudaXtDesc
type, bind(C) :: cudaLibXtDesc
    integer(4) :: version
    type(c_ptr) :: descriptor     ! cudaXtDesc *descriptor
    integer(4) :: library         ! libFormat library
    integer(4) :: subFormat
    type(c_ptr) :: libDescriptor  ! void *libDescriptor
end type cudaLibXtDesc
type, bind(C) :: cufftBox3d
    integer(8) :: lower(3)
    integer(8) :: upper(3)
    integer(8) :: strides(3)
end type cufftBox3d

3.4.1. cufftXtSetGPUs

此函数标识计划要使用的 GPU。cufftXtSetGPUs 的调用必须发生在调用 cufftCreate 之后,但在调用 cufftMakePlan* 之前。

integer(4) function cufftXtSetGPUs( plan, nGPUs, whichGPUs )
  integer(4) :: plan
  integer(4) :: nGPUs
  integer(4) :: whichGPUs(*)

3.4.2. cufftXtMalloc

此函数分配 cufftXt 描述符,以及与计划关联的 GPU 中数据的内存。cufftXtSubFormat 的值确定缓冲区是用于输入还是输出。Fortran 程序员应声明并传递指向 type(cudaLibXtDesc) 变量的指针,以便可以存储所有信息,并在后续调用 cufftXtFree 中释放。对于熟悉 C 接口的程序员,此函数的变体可以接受 type(c_ptr) 作为第 2 个参数。

integer(4) function cufftXtMalloc( plan, descriptor, format )
  integer(4) :: plan
  type(cudaLibXtDesc), pointer :: descriptor  ! A type(c_ptr) is also accepted.
  integer(4) :: format ! cufftXtSubFormat value

3.4.3. cufftXtFree

此函数释放 cufftXt 描述符以及与之关联的所有内存。描述符和内存必须已通过先前对 cufftXtMalloc 的调用分配。Fortran 程序员应声明并传递指向 type(cudaLibXtDesc) 变量的指针。对于熟悉 C 接口的程序员,此函数的变体可以接受 type(c_ptr) 作为唯一参数。

integer(4) function cufftXtFree( descriptor )
  type(cudaLibXtDesc), pointer :: descriptor  ! A type(c_ptr) is also accepted.

3.4.4. cufftXtMemcpy

此函数在主机和 GPU 上的缓冲区之间或 GPU 之间复制数据。type 参数的值确定复制方向。此外,此 Fortran 函数被重载为接受 type(cudaLibXtDesc) 变量作为目标(H2D 传输)、源(D2H 传输)或两者(D2D 传输),在这种情况下,不需要 type 参数。

integer(4) function cufftXtMemcpy( plan, dst, src, type )
  integer(4) :: plan
  type(cudaLibXtDesc) :: dst  ! Or any host buffer, depending on the type
  type(cudaLibXtDesc) :: src  ! Or any host buffer, depending on the type
  integer(4) :: type          ! optional cufftXtCopyType value

3.5. CUFFTXT 计划和工作区函数

本节包含 cufftXt 库中用于创建计划和管理工作缓冲区的函数。

3.5.1. cufftXtMakePlanMany

在调用 cufftCreate() 之后,此函数创建维度为 rank 的 FFT 计划配置,大小在数组 n 中指定。Batch 是要配置的变换的数量。此函数使用参数 inembed、istride、idist、onembed、ostride 和 odist 支持更复杂的输入和输出数据布局。在 C 函数中,如果 inembed 和 onembed 设置为 NULL,则所有其他步幅信息都将被忽略。当使用 NVIDIA cufft 模块时,Fortran 程序员可以通过将 F90 指针设置为 null() 来传递 NULL,可以通过直接赋值、使用 c_f_pointer() 和 c_null_ptr 作为第一个参数,或 nullify 语句,然后将 nullified F90 指针作为 inembed 和 onembed 哑元的实际参数传递。

integer(4) function cufftXtMakePlanMany(plan, rank, n, inembed, istride, &
    idist, inputType, onembed, ostride, odist, outputType, batch, workSize, &
    executionType)
  integer(4) :: plan
  integer(4) :: rank
  integer(8) :: n(*)
  integer(8) :: inembed(*), onembed(*)
  integer(8) :: istride, idist, ostride, odist
  type(cudaDataType) :: inputType, outputType, executionType
  integer(4) :: batch
  integer(8) :: workSize(*)

3.5.2. cufftXtQueryPlan

此函数仅支持多 GPU 1D 变换。它返回一个派生类型 factors,其中包含字符串的数量、因子的分解以及(在 2 的幂大小的情况下)一些其他有用的掩码和移位元素,用于在置换索引和线性索引之间进行转换。

integer(4) function cufftXtQueryPlan(plan, factors, queryType)
  integer(4) :: plan
  type(cufftXt1DFactors) :: factors
  integer(4) :: queryType

3.5.3. cufftXtSetWorkAreaPolicy

此函数覆盖与计划关联的工作区。目前,workAreaPolicy 可以指定为 CUFFT_WORKAREA_MINIMAL,cuFFT 将尝试重新计划以使用零字节的工作区内存。有关其他功能的支持,请参阅 CUFFT 文档。

integer(4) function cufftXtSetWorkAreaPolicy(plan, workAreaPolicy, workSize)
  integer(4) :: plan
  integer(4) :: workAreaPolicy
  integer(8) :: workSize

3.5.4. cufftXtGetSizeMany

此函数比 cufftEstimateMany() 更准确地估计所需工作区的大小(以字节为单位),给定用于 cufftXtMakePlanMany 的指定计划参数,并考虑可能已完成的任何计划设置。

integer(4) function cufftXtGetSizeMany(plan, rank, n, inembed, istride, &
    idist, inputType, onembed, ostride, odist, outputType, batch, workSize, &
    executionType)
  integer(4) :: plan
  integer(4) :: rank
  integer(8) :: n(*)
  integer(8) :: inembed(*), onembed(*)
  integer(8) :: istride, idist, ostride, odist
  type(cudaDataType) :: inputType, outputType, executionType
  integer(4) :: batch
  integer(8) :: workSize(*)

3.5.5. cufftXtSetWorkArea

此函数覆盖与计划关联的工作区。如果工作区是自动分配的,则 cuFFT 会释放自动分配的空间。cufftExecute*() 调用假定工作区指针有效,并且它指向设备内存中的一个连续区域,该区域不与其他任何工作区重叠。如果不是这种情况,结果将是不确定的。

integer(4) function cufftXtSetWorkArea(plan, workArea)
  integer(4) :: plan
  type(c_devptr) :: workArea(*)

3.5.6. cufftXtSetDistribution

此函数注册并描述后续 FFT 操作的数据分布。cufftXtSetDistribution 的调用必须发生在调用 cufftCreate 之后,但在调用 cufftMakePlan* 之前。

integer(4) function cufftXtSetDistribution( plan, boxIn, boxOut )
  integer(4) :: plan
  type(cufftBox3d) :: boxIn
  type(cufftBox3d) :: boxOut

3.6. CUFFTXT 执行函数

本节包含 cufftXt 库中执行实际傅里叶变换的执行函数。

3.6.1. cufftXtExec

此函数执行任何傅里叶变换,无论精度和类型如何。在复数到实数和实数到复数变换的情况下,direction 参数将被忽略。否则,变换方向由 direction 参数指定。此函数使用 input 指向的 GPU 内存作为输入数据,并将计算出的傅里叶系数存储在 output 数组中。如果它们相同,则此方法执行就地变换。接受 inputoutput 数组的任何有效数据类型。

integer(4) function cufftXtExec( plan, input, output, direction )
  integer :: plan
  real, dimension(*) :: input, output  ! Any data type is allowed
  integer :: direction

3.6.2. cufftXtExecDescriptor

此函数执行任何傅里叶变换,无论精度和类型如何。在复数到实数和实数到复数变换的情况下,direction 参数将被忽略。否则,变换方向由 direction 参数指定。此函数将结果存储在指定的输出数组中。

integer(4) function cufftXtExecDescriptor( plan, input, output, direction )
  integer :: plan
  type(cudaLibXtDesc) :: input, output
  integer :: direction

3.6.3. cufftXtExecDescriptorC2C

此函数在 direction 参数指定的变换方向中执行单精度复数到复数变换计划。此多 GPU 函数目前仅支持就地变换;结果将存储在输入数组中。

integer(4) function cufftXtExecDescriptorC2C( plan, input, output, direction )
  integer :: plan
  type(cudaLibXtDesc) :: input, output
  integer :: direction

3.6.4. cufftXtExecDescriptorZ2Z

此函数在 direction 参数指定的变换方向中执行双精度复数到复数变换计划。此多 GPU 函数目前仅支持就地变换;结果将存储在输入数组中。

integer(4) function cufftXtExecDescriptorZ2Z( plan, input, output, direction )
  integer :: plan
  type(cudaLibXtDesc) :: input, output
  integer :: direction

3.6.5. cufftXtExecDescriptorR2C

此函数执行单精度实数到复数变换计划。此多 GPU 函数目前仅支持就地变换;结果将存储在输入数组中。

integer(4) function cufftXtExecDescriptorR2C( plan, input, output )
  integer :: plan
  type(cudaLibXtDesc) :: input, output

3.6.6. cufftXtExecDescriptorD2Z

此函数执行双精度实数到复数变换计划。此多 GPU 函数目前仅支持就地变换;结果将存储在输入数组中。

integer(4) function cufftXtExecDescriptorD2Z( plan, input, output )
  integer :: plan
  type(cudaLibXtDesc) :: input, output

3.6.7. cufftXtExecDescriptorC2R

此函数执行单精度复数到实数变换计划。此多 GPU 函数目前仅支持就地变换;结果将存储在输入数组中。

integer(4) function cufftXtExecDescriptorC2R( plan, input, output )
  integer :: plan
  type(cudaLibXtDesc) :: input, output

3.6.8. cufftXtExecDescriptorZ2D

此函数执行双精度复数到实数变换计划。此多 GPU 函数目前仅支持就地变换;结果将存储在输入数组中。

integer(4) function cufftXtExecDescriptorZ2D( plan, input, output )
  integer :: plan
  type(cudaLibXtDesc) :: input, output

3.7. CUFFTMP 函数

本节包含 cuFFTMp 函数,这些函数将 cuFFTXt 库的功能扩展到多个进程和多个 GPU。

3.7.1. cufftMpNvshmemMalloc

此函数从 NVSHMEM 对称堆中分配空间。cuFFTMp 库基于 NVSHMEM。但是,不允许用户在其自己的应用程序中链接和使用 NVSHMEM。这可能会导致应用程序启动时崩溃。此限制将在 cuFFTMp 的未来版本中解除。

但是,cuFFTMp 的某些功能需要 NVSHMEM 分配的内存,因此目前公开并支持此功能。此函数要求在使用之前至少有一个 cuFFTMp 计划处于活动状态。

integer(4) function cufftMpNvshmemMalloc( size, workArea )
  integer(8) :: size  ! Size is in bytes
  type(c_devptr) :: workArea

3.7.2. cufftMpNvshmemFree

此函数释放先前从 NVSHMEM 对称堆中分配的空间。cuFFTMp 库基于 NVSHMEM。但是,不允许用户在其自己的应用程序中链接和使用 NVSHMEM。这可能会导致应用程序启动时崩溃。此限制将在 cuFFTMp 的未来版本中解除。

但是,cuFFTMp 的某些功能需要 NVSHMEM 分配的内存,因此目前公开并支持此功能。此函数要求在使用之前至少有一个 cuFFTMp 计划处于活动状态。

integer(4) function cufftMpNvshmemFree( workArea )
  type(c_devptr) :: workArea

3.7.3. cufftMpAttachComm

此函数将通信器(例如 MPI_COMM_WORLD)附加到 cuFFT 计划,以便稍后应用分布式 FFT 操作

integer(4) function cufftMpAttachComm( plan, commType, fcomm )
  integer(4) :: plan
  integer(4) :: commType
  integer(4) :: fcomm

3.7.4. cufftMpCreateReshape

此函数创建一个 cuFFTMp reshape 句柄,以便稍后应用分布式 FFT 操作

integer(4) function cufftMpCreateReshape( reshapeHandle )
  type(c_ptr) :: reshapeHandle

3.7.5. cufftMpAttachReshapeComm

此函数将通信器(例如 MPI_COMM_WORLD)附加到 cuFFTMp reshape 句柄,以便稍后应用分布式 FFT 操作

integer(4) function cufftMpAttachReshapeComm( reshapeHandle, commType, fcomm )
  type(c_ptr) :: reshapeHandle
  integer(4) :: commType
  integer(4) :: fcomm

3.7.6. cufftMpGetReshapeSize

此函数返回后续 cuFFTMp reshape 执行中工作空间所需的大小。目前,不需要工作区,但这在未来的版本中可能会更改。

integer(4) function cufftMpGetReshapeSize( reshapeHandle, workSize )
   type(c_ptr) :: reshapeHandle
   integer(8)  :: workSize

3.7.7. cufftMpMakeReshape

此函数基于输入和输出框创建 cuFFTMp reshape 计划。请注意,这些框使用 C 约定来表示边界和步幅。

integer(4) function cufftMpMakeReshape( reshapeHandle, &
       elementSize, boxIn, boxOut )
   type(c_ptr) :: reshapeHandle
   integer(8)  :: elementSize
   type(cufftBox3d) :: boxIn
   type(cufftBox3d) :: boxOut

3.7.8. cufftMpExecReshapeAsync

此函数在指定的流上执行 cuFFTMp reshape 计划。

integer(4) function cufftMpExecReshapeAsync( reshapeHandle, &
       dataOut, dataIn, workSpace, stream )
   type(c_ptr) :: reshapeHandle
   type(c_devptr) :: dataOut
   type(c_devptr) :: dataIn
   type(c_devptr) :: workSpace
   integer(kind=cuda_stream_kind) :: stream

3.7.9. cufftMpDestroyReshape

此函数销毁 cuFFTMp reshape 句柄。

integer(4) function cufftMpDestroyReshape( reshapeHandle )
  type(c_ptr) :: reshapeHandle

4. 随机数运行时库 API

本节介绍 CUDA cuRAND 库的 Fortran 接口。cuRAND 功能可以从主机和设备代码访问。在主机库中,所有运行时 API 例程都是返回错误代码的整数函数;如果调用成功,它们返回 CURAND_STATUS_SUCCESS 值,如果出现错误,则返回其他 cuRAND 返回状态值。主机库例程旨在生成一系列或数组随机数。在设备库中,init 例程是子例程,生成器函数返回正在生成的值的类型。设备库例程旨在为每个线程每次调用生成一个值。

第 10 章包含从 OpenACC 和 CUDA Fortran 访问 cuRAND 库例程的示例。在这两种情况下,可以通过在主机代码中添加以下行来公开库的接口

use curand

到您的程序单元。

除非提供了特定的 kind,否则 plain integer 类型意味着 integer(4),plain real 类型意味着 real(4)。

4.1. CURAND 定义和辅助函数

本节包含 cuRAND 库中使用的定义和数据类型,以及 cuRAND 辅助函数的接口。

curand 模块包含以下派生类型定义

TYPE curandGenerator
  TYPE(C_PTR)  :: handle
END TYPE

curand 模块包含以下枚举

! CURAND Status
enum, bind(c)
    enumerator :: CURAND_STATUS_SUCCESS                   = 0
    enumerator :: CURAND_STATUS_VERSION_MISMATCH          = 100
    enumerator :: CURAND_STATUS_NOT_INITIALIZED           = 101
    enumerator :: CURAND_STATUS_ALLOCATION_FAILED         = 102
    enumerator :: CURAND_STATUS_TYPE_ERROR                = 103
    enumerator :: CURAND_STATUS_OUT_OF_RANGE              = 104
    enumerator :: CURAND_STATUS_LENGTH_NOT_MULTIPLE       = 105
    enumerator :: CURAND_STATUS_DOUBLE_PRECISION_REQUIRED = 106
    enumerator :: CURAND_STATUS_LAUNCH_FAILURE            = 201
    enumerator :: CURAND_STATUS_PREEXISTING_FAILURE       = 202
    enumerator :: CURAND_STATUS_INITIALIZATION_FAILED     = 203
    enumerator :: CURAND_STATUS_ARCH_MISMATCH             = 204
    enumerator :: CURAND_STATUS_INTERNAL_ERROR            = 999
end enum
! CURAND Generator Types
enum, bind(c)
    enumerator :: CURAND_RNG_TEST                    = 0
    enumerator :: CURAND_RNG_PSEUDO_DEFAULT          = 100
    enumerator :: CURAND_RNG_PSEUDO_XORWOW           = 101
    enumerator :: CURAND_RNG_PSEUDO_MRG32K3A         = 121
    enumerator :: CURAND_RNG_PSEUDO_MTGP32           = 141
    enumerator :: CURAND_RNG_PSEUDO_MT19937          = 142
    enumerator :: CURAND_RNG_PSEUDO_PHILOX4_32_10    = 161
    enumerator :: CURAND_RNG_QUASI_DEFAULT           = 200
    enumerator :: CURAND_RNG_QUASI_SOBOL32           = 201
    enumerator :: CURAND_RNG_QUASI_SCRAMBLED_SOBOL32 = 202
    enumerator :: CURAND_RNG_QUASI_SOBOL64           = 203
    enumerator :: CURAND_RNG_QUASI_SCRAMBLED_SOBOL64 = 204
end enum
! CURAND Memory Ordering
enum, bind(c)
    enumerator :: CURAND_ORDERING_PSEUDO_BEST    = 100
    enumerator :: CURAND_ORDERING_PSEUDO_DEFAULT = 101
    enumerator :: CURAND_ORDERING_PSEUDO_SEEDED  = 102
    enumerator :: CURAND_ORDERING_QUASI_DEFAULT  = 201
end enum
! CURAND Direction Vectors
enum, bind(c)
    enumerator :: CURAND_DIRECTION_VECTORS_32_JOEKUO6           = 101
    enumerator :: CURAND_SCRAMBLED_DIRECTION_VECTORS_32_JOEKUO6 = 102
    enumerator :: CURAND_DIRECTION_VECTORS_64_JOEKUO6           = 103
    enumerator :: CURAND_SCRAMBLED_DIRECTION_VECTORS_64_JOEKUO6 = 104
end enum
! CURAND Methods
enum, bind(c)
    enumerator :: CURAND_CHOOSE_BEST    = 0
    enumerator :: CURAND_ITR            = 1
    enumerator :: CURAND_KNUTH          = 2
    enumerator :: CURAND_HITR           = 3
    enumerator :: CURAND_M1             = 4
    enumerator :: CURAND_M2             = 5
    enumerator :: CURAND_BINARY_SEARCH  = 6
    enumerator :: CURAND_DISCRETE_GAUSS = 7
    enumerator :: CURAND_REJECTION      = 8
    enumerator :: CURAND_DEVICE_API     = 9
    enumerator :: CURAND_FAST_REJECTION = 10
    enumerator :: CURAND_3RD            = 11
    enumerator :: CURAND_DEFINITION     = 12
    enumerator :: CURAND_POISSON        = 13
end enum

4.1.1. curandCreateGenerator

此函数创建一个新的类型为 rng 的随机数生成器。有关 rng 的有效值,请参阅本节开头。

integer(4) function curandCreateGenerator(generator, rng)
  type(curandGenerator) :: generator
  integer :: rng

4.1.2. curandCreateGeneratorHost

此函数创建一个新的类型为 rng 的主机 CPU 随机数生成器。有关 rng 的有效值,请参阅本节开头。

integer(4) function curandCreateGeneratorHost(generator, rng)
  type(curandGenerator) :: generator
  integer :: rng

4.1.3. curandDestroyGenerator

此函数销毁一个现有的随机数生成器。

integer(4) function curandDestroyGenerator(generator)
  type(curandGenerator) :: generator

4.1.4. curandGetVersion

此函数返回 cuRAND 库的版本号。

integer(4) function curandGetVersion(version)
  integer(4) :: version

4.1.5. curandSetStream

此函数为 cuRAND 内核启动设置当前流。

integer(4) function curandSetStream(generator, stream)
  type(curandGenerator) :: generator
  integer(kind=c_intptr_t) :: stream

4.1.6. curandSetPseudoRandomGeneratorSeed

此函数设置伪随机数生成器的种子值。

integer(4) function curandSetPseudoRandomGeneratorSeed(generator, seed)
  type(curandGenerator) :: generator
  integer(8) :: seed

4.1.7. curandSetGeneratorOffset

此函数设置伪随机数或准随机数生成器的绝对偏移量。

integer(4) function curandSetGeneratorOffset(generator, offset)
  type(curandGenerator) :: generator
  integer(8) :: offset

4.1.8. curandSetGeneratorOrdering

此函数设置伪随机数或准随机数生成器结果的排序。

integer(4) function curandSetGeneratorOrdering(generator, order)
  type(curandGenerator) :: generator
  integer(4) :: order

4.1.9. curandSetQuasiRandomGeneratorDimensions

此函数设置准随机数生成器的维度数量。

integer(4) function curandSetQuasiRandomGeneratorDimensions(generator, num)
  type(curandGenerator) :: generator
  integer(4) :: num

4.2. CURAND 生成器函数

本节包含 cuRAND 生成器函数的接口。

4.2.1. curandGenerate

此函数生成 32 位伪随机数或准随机数。

integer(4) function curandGenerate(generator, array, num )
  type(curandGenerator) :: generator
  integer(4), device :: array(*) ! Host or device depending on the generator
  integer(kind=c_intptr_t) :: num

4.2.2. curandGenerateLongLong

此函数生成 64 位整数准随机数。函数 curandGenerate() 也被重载以接受这些函数参数。

integer(4) function curandGenerateLongLong(generator, array, num )
  type(curandGenerator) :: generator
  integer(8), device :: array(*) ! Host or device depending on the generator
  integer(kind=c_intptr_t) :: num

4.2.3. curandGenerateUniform

此函数生成 32 位浮点均匀分布的随机数。函数 curandGenerate() 也被重载以接受这些函数参数。

integer(4) function curandGenerateUniform(generator, array, num )
  type(curandGenerator) :: generator
  real(4), device :: array(*) ! Host or device depending on the generator
  integer(kind=c_intptr_t) :: num

4.2.4. curandGenerateUniformDouble

此函数生成 64 位浮点均匀分布的随机数。函数 curandGenerate() 也被重载以接受这些函数参数。

integer(4) function curandGenerateUniformDouble(generator, array, num )
  type(curandGenerator) :: generator
  real(8), device :: array(*) ! Host or device depending on the generator
  integer(kind=c_intptr_t) :: num

4.2.5. curandGenerateNormal

此函数生成 32 位浮点正态分布的随机数。函数 curandGenerate() 也被重载以接受这些函数参数。

integer(4) function curandGenerateNormal(generator, array, num, mean, stddev )
  type(curandGenerator) :: generator
  real(4), device :: array(*) ! Host or device depending on the generator
  integer(kind=c_intptr_t) :: num
  real(4) :: mean, stddev

4.2.6. curandGenerateNormalDouble

此函数生成 64 位浮点正态分布的随机数。函数 curandGenerate() 也被重载以接受这些函数参数。

integer(4) function curandGenerateNormalDouble(generator, array, num, mean, stddev )
  type(curandGenerator) :: generator
  real(8), device :: array(*) ! Host or device depending on the generator
  integer(kind=c_intptr_t) :: num
  real(8) :: mean, stddev

4.2.7. curandGeneratePoisson

此函数生成泊松分布的随机数。函数 curandGenerate() 也被重载以接受这些函数参数。

integer(4) function curandGeneratePoisson(generator, array, num, lambda )
  type(curandGenerator) :: generator
  real(8), device :: array(*) ! Host or device depending on the generator
  integer(kind=c_intptr_t) :: num
  real(8) :: lambda

4.2.8. curandGenerateSeeds

此函数设置生成器的起始状态。

integer(4) function curandGenerateSeeds(generator)
  type(curandGenerator) :: generator

4.2.9. curandGenerateLogNormal

此函数生成 32 位浮点对数正态分布的随机数。

integer(4) function curandGenerateLogNormal(generator, array, num, mean, stddev )
  type(curandGenerator) :: generator
  real(4), device :: array(*) ! Host or device depending on the generator
  integer(kind=c_intptr_t) :: num
  real(4) :: mean, stddev

4.2.10. curandGenerateLogNormalDouble

此函数生成 64 位浮点对数正态分布的随机数。

integer(4) function curandGenerateLogNormalDouble(generator, array, num, mean, stddev )
  type(curandGenerator) :: generator
  real(8), device :: array(*) ! Host or device depending on the generator
  integer(kind=c_intptr_t) :: num
  real(8) :: mean, stddev

4.3. CURAND 设备定义和函数

本节包含 cuRAND 设备库中使用的定义和数据类型,以及 cuRAND 函数的接口。

curand 设备模块包含以下派生类型定义

TYPE curandStateXORWOW
    integer(4) :: d
    integer(4) :: v(5)
    integer(4) :: boxmuller_flag
    integer(4) :: boxmuller_flag_double
    real(4)    :: boxmuller_extra
    real(8)    :: boxmuller_extra_double
END TYPE curandStateXORWOW
TYPE curandStateMRG32k3a
    real(8)    :: s1(3)
    real(8)    :: s2(3)
    integer(4) :: boxmuller_flag
    integer(4) :: boxmuller_flag_double
    real(4)    :: boxmuller_extra
    real(8)    :: boxmuller_extra_double
END TYPE curandStateMRG32k3a
TYPE curandStateSobol32
    integer(4) :: d
    integer(4) :: x
    integer(4) :: c
    integer(4) :: direction_vectors(32)
END TYPE curandStateSobol32
TYPE curandStateScrambledSobol32
    integer(4) :: d
    integer(4) :: x
    integer(4) :: c
    integer(4) :: direction_vectors(32)
END TYPE curandStateScrambledSobol32
TYPE curandStateSobol64
    integer(8) :: d
    integer(8) :: x
    integer(8) :: c
    integer(8) :: direction_vectors(32)
END TYPE curandStateSobol64
TYPE curandStateScrambledSobol64
    integer(8) :: d
    integer(8) :: x
    integer(8) :: c
    integer(8) :: direction_vectors(32)
END TYPE curandStateScrambledSobol64
TYPE curandStateMtgp32
    integer(4) :: s(MTGP32_STATE_SIZE)
    integer(4) :: offset
    integer(4) :: pIdx
    integer(kind=int_ptr_kind()) :: k
    integer(4) :: precise_double_flag
END TYPE curandStateMtgp32
TYPE curandStatePhilox4_32_10
    integer(4) :: ctr
    integer(4) :: output
    integer(2) :: key
    integer(4) :: state
    integer(4) :: boxmuller_flag
    integer(4) :: boxmuller_flag_double
    real(4)    :: boxmuller_extra
    real(8)    :: boxmuller_extra_double
END TYPE curandStatePhilox4_32_10

4.3.1. curand_Init

此重载设备子例程初始化随机数生成器的状态。这些设备子例程在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

4.3.1.1. curandInitXORWOW

此函数初始化 XORWOW 随机数生成器的状态。函数 curand_init() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

subroutine curandInitXORWOW(seed, sequence, offset, state)
  integer(8) :: seed
  integer(8) :: sequence
  integer(8) :: offset
  TYPE(curandStateXORWOW) :: state

4.3.1.2. curandInitMRG32k3a

此函数初始化 MRG32k3a 随机数生成器的状态。函数 curand_init() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

subroutine curandInitMRG32k3a(seed, sequence, offset, state)
  integer(8) :: seed
  integer(8) :: sequence
  integer(8) :: offset
  TYPE(curandStateMRG32k3a) :: state

4.3.1.3. curandInitPhilox4_32_10

此函数初始化 Philox4_32_10 随机数生成器的状态。函数 curand_init() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

subroutine curandInitPhilox4_32_10(seed, sequence, offset, state)
  integer(8) :: seed
  integer(8) :: sequence
  integer(8) :: offset
  TYPE(curandStatePhilox4_32_10) :: state

4.3.1.4. curandInitSobol32

此函数初始化 Sobol32 随机数生成器的状态。函数 curand_init() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

subroutine curandInitSobol32(direction_vectors, offset, state)
  integer :: direction_vectors(*)
  integer(4) :: offset
  TYPE(curandStateSobol32) :: state

4.3.1.5. curandInitScrambledSobol32

此函数初始化 scrambled Sobol32 随机数生成器的状态。函数 curand_init() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

subroutine curandInitScrambledSobol32(direction_vectors, scramble, offset, state)
  integer :: direction_vectors(*)
  integer(4) :: scramble
  integer(4) :: offset
  TYPE(curandStateScrambledSobol32) :: state

4.3.1.6. curandInitSobol64

此函数初始化 Sobol64 随机数生成器的状态。函数 curand_init() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

subroutine curandInitSobol64(direction_vectors, offset, state)
  integer :: direction_vectors(*)
  integer(8) :: offset
  TYPE(curandStateSobol64) :: state

4.3.1.7. curandInitScrambledSobol64

此函数初始化 scrambled Sobol64 随机数生成器的状态。函数 curand_init() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

subroutine curandInitScrambledSobol64(direction_vectors, scramble, offset, state)
  integer :: direction_vectors(*)
  integer(8) :: scramble
  integer(8) :: offset
  TYPE(curandStateScrambledSobol64) :: state

4.3.2. curand

此重载设备函数根据状态参数返回 32 位或 64 位的随机数据。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

4.3.2.1. curandGetXORWOW

此函数从 XORWOW 随机数生成器返回 32 位的伪随机数。函数 curand() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

integer(4) function curandGetXORWOW(state)
  TYPE(curandStateXORWOW) :: state

4.3.2.2. curandGetMRG32k3a

此函数从 MRG32k3a 随机数生成器返回 32 位的伪随机数。函数 curand() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

integer(4) function curandGetMRG32k3a(state)
  TYPE(curandStateMRG32k3a) :: state

4.3.2.3. curandGetPhilox4_32_10

此函数从 Philox4_32_10 随机数生成器返回 32 位的伪随机数。函数 curand() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

integer(4) function curandGetPhilox4_32_10(state)
  TYPE(curandStatePhilox4_32_10) :: state

4.3.2.4. curandGetSobol32

此函数从 Sobol32 随机数生成器返回 32 位的准随机数。函数 curand() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

integer(4) function curandGetSobol32(state)
  TYPE(curandStateSobol32) :: state

4.3.2.5. curandGetScrambledSobol32

此函数从 scrambled Sobol32 随机数生成器返回 32 位的准随机数。函数 curand() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

integer(4) function curandGetScrambledSobol32(state)
  TYPE(curandStateScrambledSobol32) :: state

4.3.2.6. curandGetSobol64

此函数从 Sobol64 随机数生成器返回 64 位的准随机数。函数 curand() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

integer(4) function curandGetSobol64(state)
  TYPE(curandStateSobol64) :: state

4.3.2.7. curandGetScrambledSobol64

此函数从 scrambled Sobol64 随机数生成器返回 64 位的准随机数。函数 curand() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

integer(4) function curandGetScrambledSobol64(state)
  TYPE(curandStateScrambledSobol64) :: state

4.3.3. Curand_Normal

此重载设备函数返回一个 32 位浮点正态分布的随机数。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

4.3.3.1. curandNormalXORWOW

此函数从 XORWOW 生成器返回一个 32 位浮点正态分布的随机数。函数 curand_normal() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandNormalXORWOW(state)
  TYPE(curandStateXORWOW) :: state

4.3.3.2. curandNormalMRG32k3a

此函数从 MRG32k3a 生成器返回一个 32 位浮点正态分布的随机数。函数 curand_normal() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandNormalMRG32k3a(state)
  TYPE(curandStateMRG32k3a) :: state

4.3.3.3. curandNormalPhilox4_32_10

此函数从 Philox4_32_10 生成器返回一个 32 位浮点正态分布的随机数。函数 curand_normal() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandNormalPhilox4_32_10(state)
  TYPE(curandStatePhilox4_32_10) :: state

4.3.3.4. curandNormalSobol32

此函数从 Sobol32 生成器返回一个 32 位浮点正态分布的随机数。函数 curand_normal() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandNormalSobol32(state)
  TYPE(curandStateSobol32) :: state

4.3.3.5. curandNormalScrambledSobol32

此函数从 scrambled Sobol32 生成器返回一个 32 位浮点正态分布的随机数。函数 curand_normal() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandNormalScrambledSobol32(state)
  TYPE(curandStateScrambledSobol32) :: state

4.3.3.6. curandNormalSobol64

此函数从 Sobol64 生成器返回一个 32 位浮点正态分布的随机数。函数 curand_normal() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandNormalSobol64(state)
  TYPE(curandStateSobol64) :: state

4.3.3.7. curandNormalScrambledSobol64

此函数从 scrambled Sobol64 生成器返回一个 32 位浮点正态分布的随机数。函数 curand_normal() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandNormalScrambledSobol64(state)
  TYPE(curandStateScrambledSobol64) :: state

4.3.4. Curand_Normal_Double

此重载设备函数返回一个 64 位浮点正态分布的随机数。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

4.3.4.1. curandNormalDoubleXORWOW

此函数从 XORWOW 生成器返回一个 64 位浮点正态分布的随机数。函数 curand_normal_double() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandNormalDoubleXORWOW(state)
  TYPE(curandStateXORWOW) :: state

4.3.4.2. curandNormalDoubleMRG32k3a

此函数从 MRG32k3a 生成器返回一个 64 位浮点正态分布的随机数。函数 curand_normal_double() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandNormalDoubleMRG32k3a(state)
  TYPE(curandStateMRG32k3a) :: state

4.3.4.3. curandNormalDoublePhilox4_32_10

此函数从 Philox4_32_10 生成器返回一个 64 位浮点正态分布的随机数。函数 curand_normal_double() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandNormalDoublePhilox4_32_10(state)
  TYPE(curandStatePhilox4_32_10) :: state

4.3.4.4. curandNormalDoubleSobol32

此函数从 Sobol32 生成器返回一个 64 位浮点正态分布的随机数。函数 curand_normal_double() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandNormalDoubleSobol32(state)
  TYPE(curandStateSobol32) :: state

4.3.4.5. curandNormalDoubleScrambledSobol32

此函数从 scrambled Sobol32 生成器返回一个 64 位浮点正态分布的随机数。函数 curand_normal_double() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandNormalDoubleScrambledSobol32(state)
  TYPE(curandStateScrambledSobol32) :: state

4.3.4.6. curandNormalDoubleSobol64

此函数从 Sobol64 生成器返回一个 64 位浮点正态分布的随机数。函数 curand_normal_double() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandNormalDoubleSobol64(state)
  TYPE(curandStateSobol64) :: state

4.3.4.7. curandNormalDoubleScrambledSobol64

此函数从 scrambled Sobol64 生成器返回一个 64 位浮点正态分布的随机数。函数 curand_normal_double() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandNormalDoubleScrambledSobol64(state)
  TYPE(curandStateScrambledSobol64) :: state

4.3.5. Curand_Log_Normal

此重载设备函数返回一个 32 位浮点对数正态分布的随机数。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

4.3.5.1. curandLogNormalXORWOW

此函数从 XORWOW 生成器返回一个 32 位浮点对数正态分布的随机数。函数 curand_log_normal() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandLogNormalXORWOW(state)
  TYPE(curandStateXORWOW) :: state

4.3.5.2. curandLogNormalMRG32k3a

此函数从 MRG32k3a 生成器返回一个 32 位浮点对数正态分布的随机数。函数 curand_log_normal() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandLogNormalMRG32k3a(state)
  TYPE(curandStateMRG32k3a) :: state

4.3.5.3. curandLogNormalPhilox4_32_10

此函数从 Philox4_32_10 生成器返回一个 32 位浮点对数正态分布的随机数。函数 curand_log_normal() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandLogNormalPhilox4_32_10(state)
  TYPE(curandStatePhilox4_32_10) :: state

4.3.5.4. curandLogNormalSobol32

此函数从 Sobol32 生成器返回一个 32 位浮点对数正态分布的随机数。函数 curand_log_normal() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandLogNormalSobol32(state)
  TYPE(curandStateSobol32) :: state

4.3.5.5. curandLogNormalScrambledSobol32

此函数从 scrambled Sobol32 生成器返回一个 32 位浮点对数正态分布的随机数。函数 curand_log_normal() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandLogNormalScrambledSobol32(state)
  TYPE(curandStateScrambledSobol32) :: state

4.3.5.6. curandLogNormalSobol64

此函数从 Sobol64 生成器返回一个 32 位浮点对数正态分布的随机数。函数 curand_log_normal() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandLogNormalSobol64(state)
  TYPE(curandStateSobol64) :: state

4.3.5.7. curandLogNormalScrambledSobol64

此函数从 scrambled Sobol64 生成器返回一个 32 位浮点对数正态分布的随机数。函数 curand_log_normal() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandLogNormalScrambledSobol64(state)
  TYPE(curandStateScrambledSobol64) :: state

4.3.6. Curand_Log_Normal_Double

此重载设备函数返回一个 64 位浮点对数正态分布的随机数。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

4.3.6.1. curandLogNormalDoubleXORWOW

此函数从 XORWOW 生成器返回一个 64 位浮点对数正态分布的随机数。函数 curand_log_normal_double() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandLogNormalDoubleXORWOW(state)
  TYPE(curandStateXORWOW) :: state

4.3.6.2. curandLogNormalDoubleMRG32k3a

此函数从 MRG32k3a 生成器返回一个 64 位浮点对数正态分布的随机数。函数 curand_log_normal_double() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandLogNormalDoubleMRG32k3a(state)
  TYPE(curandStateMRG32k3a) :: state

4.3.6.3. curandLogNormalDoublePhilox4_32_10

此函数从 Philox4_32_10 生成器返回一个 64 位浮点对数正态分布的随机数。函数 curand_log_normal_double() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandLogNormalDoublePhilox4_32_10(state)
  TYPE(curandStatePhilox4_32_10) :: state

4.3.6.4. curandLogNormalDoubleSobol32

此函数从 Sobol32 生成器返回一个 64 位浮点对数正态分布的随机数。函数 curand_log_normal_double() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandLogNormalDoubleSobol32(state)
  TYPE(curandStateSobol32) :: state

4.3.6.5. curandLogNormalDoubleScrambledSobol32

此函数从 scrambled Sobol32 生成器返回一个 64 位浮点对数正态分布的随机数。函数 curand_log_normal_double() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandLogNormalDoubleScrambledSobol32(state)
  TYPE(curandStateScrambledSobol32) :: state

4.3.6.6. curandLogNormalDoubleSobol64

此函数从 Sobol64 生成器返回一个 64 位浮点对数正态分布的随机数。函数 curand_log_normal_double() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandLogNormalDoubleSobol64(state)
  TYPE(curandStateSobol64) :: state

4.3.6.7. curandLogNormalDoubleScrambledSobol64

此函数从 scrambled Sobol64 生成器返回一个 64 位浮点对数正态分布的随机数。函数 curand_log_normal_double() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandLogNormalDoubleScrambledSobol64(state)
  TYPE(curandStateScrambledSobol64) :: state

4.3.7. Curand_Uniform

此重载设备函数返回一个 32 位浮点均匀分布的随机数。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

4.3.7.1. curandUniformXORWOW

此函数从 XORWOW 生成器返回一个 32 位浮点均匀分布的随机数。函数 curand_uniform() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandUniformXORWOW(state)
  TYPE(curandStateXORWOW) :: state

4.3.7.2. curandUniformMRG32k3a

此函数从 MRG32k3a 生成器返回一个 32 位浮点均匀分布的随机数。函数 curand_uniform() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandUniformMRG32k3a(state)
  TYPE(curandStateMRG32k3a) :: state

4.3.7.3. curandUniformPhilox4_32_10

此函数从 Philox4_32_10 生成器返回一个 32 位浮点均匀分布的随机数。函数 curand_uniform() 也被重载以接受这些函数参数,如同在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandUniformPhilox4_32_10(state)
  TYPE(curandStatePhilox4_32_10) :: state

4.3.7.4. curandUniformSobol32

此函数从 Sobol32 生成器返回一个 32 位浮点均匀分布随机数。函数 curand_uniform() 也被重载以接受这些函数参数,就像在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandUniformSobol32(state)
  TYPE(curandStateSobol32) :: state

4.3.7.5. curandUniformScrambledSobol32

此函数从 scrambled Sobol32 生成器返回一个 32 位浮点均匀分布随机数。函数 curand_uniform() 也被重载以接受这些函数参数,就像在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandUniformScrambledSobol32(state)
  TYPE(curandStateScrambledSobol32) :: state

4.3.7.6. curandUniformSobol64

此函数从 Sobol64 生成器返回一个 32 位浮点均匀分布随机数。函数 curand_uniform() 也被重载以接受这些函数参数,就像在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandUniformSobol64(state)
  TYPE(curandStateSobol64) :: state

4.3.7.7. curandUniformScrambledSobol64

此函数从 scrambled Sobol64 生成器返回一个 32 位浮点均匀分布随机数。函数 curand_uniform() 也被重载以接受这些函数参数,就像在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(4) function curandUniformScrambledSobol64(state)
  TYPE(curandStateScrambledSobol64) :: state

4.3.8. Curand_Uniform_Double

此重载的设备函数返回一个 64 位浮点均匀分布随机数。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

4.3.8.1. curandUniformDoubleXORWOW

此函数从 XORWOW 生成器返回一个 64 位浮点均匀分布随机数。函数 curand_uniform_double() 也被重载以接受这些函数参数,就像在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandUniformDoubleXORWOW(state)
  TYPE(curandStateXORWOW) :: state

4.3.8.2. curandUniformDoubleMRG32k3a

此函数从 MRG32k3a 生成器返回一个 64 位浮点均匀分布随机数。函数 curand_uniform_double() 也被重载以接受这些函数参数,就像在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandUniformDoubleMRG32k3a(state)
  TYPE(curandStateMRG32k3a) :: state

4.3.8.3. curandUniformDoublePhilox4_32_10

此函数从 Philox4_32_10 生成器返回一个 64 位浮点均匀分布随机数。函数 curand_uniform_double() 也被重载以接受这些函数参数,就像在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandUniformDoublePhilox4_32_10(state)
  TYPE(curandStatePhilox4_32_10) :: state

4.3.8.4. curandUniformDoubleSobol32

此函数从 Sobol32 生成器返回一个 64 位浮点均匀分布随机数。函数 curand_uniform_double() 也被重载以接受这些函数参数,就像在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandUniformDoubleSobol32(state)
  TYPE(curandStateSobol32) :: state

4.3.8.5. curandUniformDoubleScrambledSobol32

此函数从 scrambled Sobol32 生成器返回一个 64 位浮点均匀分布随机数。函数 curand_uniform_double() 也被重载以接受这些函数参数,就像在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandUniformDoubleScrambledSobol32(state)
  TYPE(curandStateScrambledSobol32) :: state

4.3.8.6. curandUniformDoubleSobol64

此函数从 Sobol64 生成器返回一个 64 位浮点均匀分布随机数。函数 curand_uniform_double() 也被重载以接受这些函数参数,就像在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandUniformDoubleSobol64(state)
  TYPE(curandStateSobol64) :: state

4.3.8.7. curandUniformDoubleScrambledSobol64

此函数从 scrambled Sobol64 生成器返回一个 64 位浮点均匀分布随机数。函数 curand_uniform_double() 也被重载以接受这些函数参数,就像在 CUDA C++ 中一样。设备函数在 CUDA Fortran 中声明为 attributes(device),在 OpenACC 中声明为 !$acc routine() seq

real(8) function curandUniformDoubleScrambledSobol64(state)
  TYPE(curandStateScrambledSobol64) :: state

5. SPARSE 矩阵运行时库 API

本节介绍 CUDA cuSPARSE 库的 Fortran 接口。cuSPARSE 函数只能从主机代码访问。所有运行时 API 例程都是返回错误代码的整数函数;如果调用成功,它们将返回值 CUSPARSE_STATUS_SUCCESS,如果发生错误,则返回另一个 cuSPARSE 状态返回值。

第 10 章包含从 OpenACC 和 CUDA Fortran 访问 cuSPARSE 库例程的示例。在这两种情况下,可以通过添加以下行来公开库的接口

use cusparse

到您的程序单元。

本章中列出的许多函数接口可以接受主机或设备标量参数。这些函数还有一个额外的 v2 接口,该接口不会隐式管理这些调用的指针模式。有关指针模式处理的更多讨论,请参见第 1.6 节。

除非提供了特定的 kind,否则接口中使用的普通 integer 类型表示 integer(4),而普通 real 类型表示 real(4)。

5.1. CUSPARSE 定义和辅助函数

本节包含 cuSPARSE 库中使用的定义和数据类型,以及 cuSPARSE 辅助函数的接口。

cuSPARSE 模块包含以下派生类型定义

type cusparseHandle
  type(c_ptr) :: handle
end type cusparseHandle
type :: cusparseMatDescr
     type(c_ptr) :: descr
end type cusparseMatDescr
! This type was removed in CUDA 11.0
type cusparseSolveAnalysisInfo
     type(c_ptr) :: info
end type cusparseSolveAnalysisInfo
! This type was removed in CUDA 11.0
type cusparseHybMat
     type(c_ptr) :: mat
end type cusparseHybMat
type cusparseCsrsv2Info
     type(c_ptr) :: info
end type cusparseCsrsv2Info
type cusparseCsric02Info
     type(c_ptr) :: info
end type cusparseCsric02Info
type cusparseCsrilu02Info
     type(c_ptr) :: info
end type cusparseCsrilu02Info
type cusparseBsrsv2Info
     type(c_ptr) :: info
end type cusparseBsrsv2Info
type cusparseBsric02Info
     type(c_ptr) :: info
end type cusparseBsric02Info
type cusparseBsrilu02Info
     type(c_ptr) :: info
end type cusparseBsrilu02Info
type cusparseBsrsm2Info
     type(c_ptr) :: info
end type cusparseBsrsm2Info
type cusparseCsrgemm2Info
     type(c_ptr) :: info
end type cusparseCsrgemm2Info
type cusparseColorInfo
     type(c_ptr) :: info
end type cusparseColorInfo
type cusparseCsru2csrInfo
     type(c_ptr) :: info
end type cusparseCsru2csrInfo
type cusparseSpVecDescr
     type(c_ptr) :: descr
end type cusparseSpVecDescr
type cusparseDnVecDescr
     type(c_ptr) :: descr
end type cusparseDnVecDescr
type cusparseSpMatDescr
     type(c_ptr) :: descr
end type cusparseSpMatDescr
type cusparseDnMatDescr
     type(c_ptr) :: descr
end type cusparseDnMatDescr
type cusparseSpSVDescr
     type(c_ptr) :: descr
end type cusparseSpSVDescr
type cusparseSpSMDescr
     type(c_ptr) :: descr
end type cusparseSpSMDescr
type cusparseSpGEMMDescr
     type(c_ptr) :: descr
end type cusparseSpGEMMDescr

cuSPARSE 模块包含以下常量和枚举

! cuSPARSE Version Info
  integer, parameter :: CUSPARSE_VER_MAJOR = 12
  integer, parameter :: CUSPARSE_VER_MINOR = 1
  integer, parameter :: CUSPARSE_VER_PATCH = 2
  integer, parameter :: CUSPARSE_VER_BUILD = 129
  integer, parameter :: CUSPARSE_VERSION   = (CUSPARSE_VER_MAJOR * 1000 + &
                          CUSPARSE_VER_MINOR *  100 + CUSPARSE_VER_PATCH)
! cuSPARSE status return values
enum, bind(C) ! cusparseStatus_t
    enumerator :: CUSPARSE_STATUS_SUCCESS=0
    enumerator :: CUSPARSE_STATUS_NOT_INITIALIZED=1
    enumerator :: CUSPARSE_STATUS_ALLOC_FAILED=2
    enumerator :: CUSPARSE_STATUS_INVALID_VALUE=3
    enumerator :: CUSPARSE_STATUS_ARCH_MISMATCH=4
    enumerator :: CUSPARSE_STATUS_MAPPING_ERROR=5
    enumerator :: CUSPARSE_STATUS_EXECUTION_FAILED=6
    enumerator :: CUSPARSE_STATUS_INTERNAL_ERROR=7
    enumerator :: CUSPARSE_STATUS_MATRIX_TYPE_NOT_SUPPORTED=8
    enumerator :: CUSPARSE_STATUS_ZERO_PIVOT=9
    enumerator :: CUSPARSE_STATUS_NOT_SUPPORTED=10
    enumerator :: CUSPARSE_STATUS_INSUFFICIENT_RESOURCES=11
end enum
enum, bind(c) ! cusparsePointerMode_t
    enumerator :: CUSPARSE_POINTER_MODE_HOST = 0
    enumerator :: CUSPARSE_POINTER_MODE_DEVICE = 1
end enum
enum, bind(c) ! cusparseAction_t
    enumerator :: CUSPARSE_ACTION_SYMBOLIC = 0
    enumerator :: CUSPARSE_ACTION_NUMERIC = 1
end enum
enum, bind(C) ! cusparseMatrixType_t
    enumerator :: CUSPARSE_MATRIX_TYPE_GENERAL = 0
    enumerator :: CUSPARSE_MATRIX_TYPE_SYMMETRIC = 1
    enumerator :: CUSPARSE_MATRIX_TYPE_HERMITIAN = 2
    enumerator :: CUSPARSE_MATRIX_TYPE_TRIANGULAR = 3
end enum
enum, bind(C) ! cusparseFillMode_t
    enumerator :: CUSPARSE_FILL_MODE_LOWER = 0
    enumerator :: CUSPARSE_FILL_MODE_UPPER = 1
end enum
enum, bind(C) ! cusparseDiagType_t
    enumerator :: CUSPARSE_DIAG_TYPE_NON_UNIT = 0
    enumerator :: CUSPARSE_DIAG_TYPE_UNIT = 1
end enum
enum, bind(C) ! cusparseIndexBase_t
    enumerator :: CUSPARSE_INDEX_BASE_ZERO = 0
    enumerator :: CUSPARSE_INDEX_BASE_ONE = 1
end enum
enum, bind(C) ! cusparseOperation_t
    enumerator :: CUSPARSE_OPERATION_NON_TRANSPOSE = 0
    enumerator :: CUSPARSE_OPERATION_TRANSPOSE = 1
    enumerator :: CUSPARSE_OPERATION_CONJUGATE_TRANSPOSE = 2
end enum
enum, bind(C) ! cusparseDirection_t
    enumerator :: CUSPARSE_DIRECTION_ROW = 0
    enumerator :: CUSPARSE_DIRECTION_COLUMN = 1
end enum
enum, bind(C) ! cusparseHybPartition_t
    enumerator :: CUSPARSE_HYB_PARTITION_AUTO = 0
    enumerator :: CUSPARSE_HYB_PARTITION_USER = 1
    enumerator :: CUSPARSE_HYB_PARTITION_MAX = 2
end enum
enum, bind(C) ! cusparseSolvePolicy_t
    enumerator :: CUSPARSE_SOLVE_POLICY_NO_LEVEL = 0
    enumerator :: CUSPARSE_SOLVE_POLICY_USE_LEVEL = 1
end enum
enum, bind(C) ! cusparseSideMode_t
    enumerator :: CUSPARSE_SIDE_LEFT  = 0
    enumerator :: CUSPARSE_SIDE_RIGHT = 1
end enum
enum, bind(C) ! cusparseColorAlg_t
    enumerator :: CUSPARSE_COLOR_ALG0 = 0
    enumerator :: CUSPARSE_COLOR_ALG1 = 1
end enum
enum, bind(C) ! cusparseAlgMode_t;
    enumerator :: CUSPARSE_ALG0           = 0
    enumerator :: CUSPARSE_ALG1           = 1
    enumerator :: CUSPARSE_ALG_NAIVE      = 0
    enumerator :: CUSPARSE_ALG_MERGE_PATH = 0
end enum
enum, bind(C) ! cusparseCsr2CscAlg_t;
    enumerator :: CUSPARSE_CSR2CSC_ALG_DEFAULT = 1
    enumerator :: CUSPARSE_CSR2CSC_ALG1 = 1
    enumerator :: CUSPARSE_CSR2CSC_ALG2 = 2
end enum
enum, bind(C) ! cusparseFormat_t;
    enumerator :: CUSPARSE_FORMAT_CSR     = 1
    enumerator :: CUSPARSE_FORMAT_CSC     = 2
    enumerator :: CUSPARSE_FORMAT_COO     = 3
    enumerator :: CUSPARSE_FORMAT_COO_AOS = 4
    enumerator :: CUSPARSE_FORMAT_BLOCKED_ELL = 5
    enumerator :: CUSPARSE_FORMAT_BSR     = 6
    enumerator :: CUSPARSE_FORMAT_SLICED_ELLPACK = 7
end enum
enum, bind(C) ! cusparseOrder_t;
    enumerator :: CUSPARSE_ORDER_COL = 1
    enumerator :: CUSPARSE_ORDER_ROW = 2
end enum
enum, bind(C) ! cusparseSpMVAlg_t;
    enumerator :: CUSPARSE_MV_ALG_DEFAULT = 0
    enumerator :: CUSPARSE_COOMV_ALG      = 1
    enumerator :: CUSPARSE_CSRMV_ALG1     = 2
    enumerator :: CUSPARSE_CSRMV_ALG2     = 3
    enumerator :: CUSPARSE_SPMV_ALG_DEFAULT = 0
    enumerator :: CUSPARSE_SPMV_CSR_ALG1    = 2
    enumerator :: CUSPARSE_SPMV_CSR_ALG2    = 3
    enumerator :: CUSPARSE_SPMV_COO_ALG1    = 1
    enumerator :: CUSPARSE_SPMV_COO_ALG2    = 4
    enumerator :: CUSPARSE_SPMV_SELL_ALG1   = 5
end enum
enum, bind(C) ! cusparseSpMMAlg_t;
    enumerator :: CUSPARSE_MM_ALG_DEFAULT = 0
    enumerator :: CUSPARSE_COOMM_ALG1 = 1
    enumerator :: CUSPARSE_COOMM_ALG2 = 2
    enumerator :: CUSPARSE_COOMM_ALG3 = 3
    enumerator :: CUSPARSE_CSRMM_ALG1 = 4
    enumerator :: CUSPARSE_SPMM_ALG_DEFAULT = 0
    enumerator :: CUSPARSE_SPMM_COO_ALG1    = 1
    enumerator :: CUSPARSE_SPMM_COO_ALG2    = 2
    enumerator :: CUSPARSE_SPMM_COO_ALG3    = 3
    enumerator :: CUSPARSE_SPMM_COO_ALG4    = 5
    enumerator :: CUSPARSE_SPMM_CSR_ALG1    = 4
    enumerator :: CUSPARSE_SPMM_CSR_ALG2    = 6
    enumerator :: CUSPARSE_SPMM_CSR_ALG3    = 12
    enumerator :: CUSPARSE_SPMM_BLOCKED_ELL_ALG1 = 13
end enum
enum, bind(C) ! cusparseIndexType_t;
    enumerator :: CUSPARSE_INDEX_16U = 1
    enumerator :: CUSPARSE_INDEX_32I = 2
    enumerator :: CUSPARSE_INDEX_64I = 3
end enum
enum, bind(C) ! cusparseSpMatAttribute_t;
    enumerator :: CUSPARSE_SPMAT_FILL_MODE = 0
    enumerator :: CUSPARSE_SPMAT_DIAG_TYPE = 1
end enum
enum, bind(C) ! cusparseSparseToDenseAlg_t;
    enumerator :: CUSPARSE_SPARSETODENSE_ALG_DEFAULT = 0
    enumerator :: CUSPARSE_DENSETOSPARSE_ALG_DEFAULT = 0
end enum
enum, bind(C) ! cusparseSpSVAlg_t;
    enumerator :: CUSPARSE_SPSV_ALG_DEFAULT = 0
end enum
enum, bind(C) ! cusparseSpSVUpdate_t;
    enumerator :: CUSPARSE_SPSV_UPDATE_GENERAL  = 0
    enumerator :: CUSPARSE_SPSV_UPDATE_DIAGONAL = 1
end enum
enum, bind(C) ! cusparseSpSMAlg_t;
    enumerator :: CUSPARSE_SPSM_ALG_DEFAULT = 0
end enum
enum, bind(C) ! cusparseSpMMOpAlg_t;
    enumerator :: CUSPARSE_SPMM_OP_ALG_DEFAULT = 0
end enum
enum, bind(C) ! cusparseSpGEMMAlg_t;
    enumerator :: CUSPARSE_SPGEMM_DEFAULT = 0
    enumerator :: CUSPARSE_SPGEMM_CSR_ALG_DETERMINISTIC = 1
    enumerator :: CUSPARSE_SPGEMM_CSR_ALG_DETERMINITIC  = 1
    enumerator :: CUSPARSE_SPGEMM_CSR_ALG_NONDETERMINISTIC = 2
    enumerator :: CUSPARSE_SPGEMM_CSR_ALG_NONDETERMINITIC  = 2
    enumerator :: CUSPARSE_SPGEMM_ALG1 = 3
    enumerator :: CUSPARSE_SPGEMM_ALG2 = 4
    enumerator :: CUSPARSE_SPGEMM_ALG3 = 5
end enum
enum, bind(C) ! cusparseSDDMMAlg_t;
    enumerator :: CUSPARSE_SDDMM_ALG_DEFAULT = 0
end enum

5.1.1. cusparseCreate

此函数初始化 cuSPARSE 库并在 cuSPARSE 上下文上创建句柄。必须在调用任何其他 cuSPARSE API 函数之前调用它。它分配访问 GPU 所需的硬件资源。

integer(4) function cusparseCreate(handle)
  type(cusparseHandle) :: handle

5.1.2. cusparseDestroy

此函数释放 cuSPARSE 库使用的 CPU 端资源。GPU 端资源的释放可能会延迟到应用程序关闭时。

integer(4) function cusparseDestroy(handle)
  type(cusparseHandle) :: handle

5.1.3. cusparseGetErrorName

此函数返回错误代码名称。

character*128 function cusparseGetErrorName(ierr)
   integer(c_int) :: ierr

5.1.4. cusparseGetErrorString

此函数返回错误代码的描述字符串。

character*128 function cusparseGetErrorString(ierr)
   integer(c_int) :: ierr

5.1.5. cusparseGetVersion

此函数返回 cuSPARSE 库的版本号。

integer(4) function cusparseGetVersion(handle, version)
  type(cusparseHandle) :: handle
  integer(c_int) :: version

5.1.6. cusparseSetStream

此函数设置 cuSPARSE 库用于执行其例程的流。

integer(4) function cusparseSetStream(handle, stream)
  type(cusparseHandle) :: handle
  integer(cuda_stream_kind) :: stream

5.1.7. cusparseGetStream

此函数获取 cuSPARSE 库用于执行其例程的流。如果未设置 cuSPARSE 库流,则所有内核都使用默认的 NULL 流。

integer(4) function cusparseGetStream(handle, stream)
  type(cusparseHandle) :: handle
  integer(cuda_stream_kind) :: stream

5.1.8. cusparseGetPointerMode

此函数获取 cuSPARSE 库使用的指针模式。有关指针模式的更多详细信息,请参见第 1.6 节。

integer(4) function cusparseGetPointerMode(handle, mode)
  type(cusparseHandle) :: handle
  integer(c_int) :: mode

5.1.9. cusparseSetPointerMode

此函数设置 cuSPARSE 库使用的指针模式。在这些 Fortran 接口中,这仅在使用 *_v2 接口时才有效。默认情况下,值通过主机上的引用传递。有关指针模式的更多详细信息,请参见第 1.6 节。

integer(4) function cusparseSetPointerMode(handle, mode)
  type(cusparseHandle) :: handle
  integer(4) :: mode

5.1.10. cusparseCreateMatDescr

此函数初始化矩阵描述符。它将字段 MatrixType 和 IndexBase 分别设置为默认值 CUSPARSE_MATRIX_TYPE_GENERAL 和 CUSPARSE_INDEX_BASE_ZERO,同时将其他字段保持未初始化状态。

integer(4) function cusparseCreateMatDescr(descrA)
  type(cusparseMatDescr) :: descrA

5.1.11. cusparseDestroyMatDescr

此函数释放为矩阵描述符分配的内存。

integer(4) function cusparseDestroyMatDescr(descrA)
  type(cusparseMatDescr) :: descrA

5.1.12. cusparseSetMatType

此函数设置矩阵描述符 descrA 的 MatrixType。

integer(4) function cusparseSetMatType(descrA, type)
  type(cusparseMatDescr) :: descrA
  integer(4) :: type

5.1.13. cusparseGetMatType

此函数返回矩阵描述符 descrA 的 MatrixType。

integer(4) function cusparseGetMatType(descrA)
  type(cusparseMatDescr) :: descrA

5.1.14. cusparseSetMatFillMode

此函数设置矩阵描述符 descrA 的 FillMode 字段。

integer(4) function cusparseSetMatFillMode(descrA, mode)
  type(cusparseMatDescr) :: descrA
  integer(4) :: mode

5.1.15. cusparseGetMatFillMode

此函数返回矩阵描述符 descrA 的 FillMode 字段。

integer(4) function cusparseGetMatFillMode(descrA)
  type(cusparseMatDescr) :: descrA

5.1.16. cusparseSetMatDiagType

此函数设置矩阵描述符 descrA 的 DiagType。

integer(4) function cusparseSetMatDiagType(descrA, type)
  type(cusparseMatDescr) :: descrA
  integer(4) :: type

5.1.17. cusparseGetMatDiagType

此函数返回矩阵描述符 descrA 的 DiagType。

integer(4) function cusparseGetMatDiagType(descrA)
  type(cusparseMatDescr) :: descrA

5.1.18. cusparseSetMatIndexBase

此函数设置矩阵描述符 descrA 的 IndexBase 字段。

integer(4) function cusparseSetMatIndexBase(descrA, base)
  type(cusparseMatDescr) :: descrA
  integer(4) :: base

5.1.19. cusparseGetMatIndexBase

此函数返回矩阵描述符 descrA 的 IndexBase 字段。

integer(4) function cusparseGetMatIndexBase(descrA)
  type(cusparseMatDescr) :: descrA

5.1.20. cusparseCreateSolveAnalysisInfo

此函数创建 solve 和 analysis 结构并将其初始化为默认值。此函数以及所有使用 cusparseSolveAnalysisInfo 类型的函数已在 CUDA 11.0 中移除。

integer(4) function cusparseCreateSolveAnalysisInfo(info)
  type(cusparseSolveAnalysisinfo) :: info

5.1.21. cusparseDestroySolveAnalysisInfo

此函数销毁并释放结构所需的任何内存。此函数以及所有使用 cusparseSolveAnalysisInfo 类型的函数已在 CUDA 11.0 中移除。

integer(4) function cusparseDestroySolveAnalysisInfo(info)
  type(cusparseSolveAnalysisinfo) :: info

5.1.22. cusparseGetLevelInfo

此函数返回级别数以及由 csrsv_analysis、csrsm_analysis 或 hybsv_analysis 例程计算的行到级别的分配。

integer(4) function cusparseGetLevelInfo(handle, info, nlevels, levelPtr, levelInd)
  type(cusparseHandle) :: handle
  type(cusparseSolveAnalysisinfo) :: info
  integer(c_int) :: nlevels
  type(c_ptr) :: levelPtr
  type(c_ptr) :: levelInd

5.1.23. cusparseCreateHybMat

此函数创建并初始化 hybA 不透明数据结构。此函数以及所有使用 cusparseHybMat 类型的函数已在 CUDA 11.0 中移除。

integer(4) function cusparseCreateHybMat(hybA)
  type(cusparseHybMat) :: hybA

5.1.24. cusparseDestroyHybMat

此函数销毁并释放 hybA 结构所需的任何内存。此函数以及所有使用 cusparseHybMat 类型的函数已在 CUDA 11.0 中移除。

integer(4) function cusparseDestroyHybMat(hybA)
  type(cusparseHybMat) :: hybA

5.1.25. cusparseCreateCsrsv2Info

此函数创建 csrsv2 的 solve 和 analysis 结构并将其初始化为默认值。

integer(4) function cusparseCreateCsrsv2Info(info)
  type(cusparseCsrsv2Info) :: info

5.1.26. cusparseDestroyCsrsv2Info

此函数销毁并释放结构所需的任何内存。

integer(4) function cusparseDestroyCsrsv2Info(info)
  type(cusparseCsrsv2Info) :: info

5.1.27. cusparseCreateCsric02Info

此函数创建不完全 Cholesky 分解的 solve 和 analysis 结构并将其初始化为默认值。

integer(4) function cusparseCreateCsric02Info(info)
  type(cusparseCsric02Info) :: info

5.1.28. cusparseDestroyCsric02Info

此函数销毁并释放结构所需的任何内存。

integer(4) function cusparseDestroyCsric02Info(info)
  type(cusparseCsric02Info) :: info

5.1.29. cusparseCreateCsrilu02Info

此函数创建不完全 LU 分解的 solve 和 analysis 结构并将其初始化为默认值。

integer(4) function cusparseCreateCsrilu02Info(info)
  type(cusparseCsrilu02Info) :: info

5.1.30. cusparseDestroyCsrilu02Info

此函数销毁并释放结构所需的任何内存。

integer(4) function cusparseDestroyCsrilu02Info(info)
  type(cusparseCsrilu02Info) :: info

5.1.31. cusparseCreateBsrsv2Info

此函数创建 bsrsv2 的 solve 和 analysis 结构并将其初始化为默认值。

integer(4) function cusparseCreateBsrsv2Info(info)
  type(cusparseBsrsv2Info) :: info

5.1.32. cusparseDestroyBsrsv2Info

此函数销毁并释放结构所需的任何内存。

integer(4) function cusparseDestroyBsrsv2Info(info)
  type(cusparseBsrsv2Info) :: info

5.1.33. cusparseCreateBsric02Info

此函数创建块不完全 Cholesky 分解的 solve 和 analysis 结构并将其初始化为默认值。

integer(4) function cusparseCreateBsric02Info(info)
  type(cusparseBsric02Info) :: info

5.1.34. cusparseDestroyBsric02Info

此函数销毁并释放结构所需的任何内存。

integer(4) function cusparseDestroyBsric02Info(info)
  type(cusparseBsric02Info) :: info

5.1.35. cusparseCreateBsrilu02Info

此函数创建块不完全 LU 分解的 solve 和 analysis 结构并将其初始化为默认值。

integer(4) function cusparseCreateBsrilu02Info(info)
  type(cusparseBsrilu02Info) :: info

5.1.36. cusparseDestroyBsrilu02Info

此函数销毁并释放结构所需的任何内存。

integer(4) function cusparseDestroyBsrilu02Info(info)
  type(cusparseBsrilu02Info) :: info

5.1.37. cusparseCreateBsrsm2Info

此函数创建 bsrsm2 的 solve 和 analysis 结构并将其初始化为默认值。

integer(4) function cusparseCreateBsrsm2Info(info)
  type(cusparseBsrsm2Info) :: info

5.1.38. cusparseDestroyBsrsm2Info

此函数销毁并释放结构所需的任何内存。

integer(4) function cusparseDestroyBsrsm2Info(info)
  type(cusparseBsrsm2Info) :: info

5.1.39. cusparseCreateCsrgemm2Info

此函数创建通用稀疏矩阵-矩阵乘法的 analysis 结构。

integer(4) function cusparseCreateCsrgemm2Info(info)
  type(cusparseCsrgemm2Info) :: info

5.1.40. cusparseDestroyCsrgemm2Info

此函数销毁并释放结构所需的任何内存。

integer(4) function cusparseDestroyCsrgemm2Info(info)
  type(cusparseCsrgemm2Info) :: info

5.1.41. cusparseCreateColorInfo

此函数创建 CSRCOLOR 等调用中使用的着色信息。

integer(4) function cusparseCreateColorInfo(info)
  type(cusparseColorInfo) :: info

5.1.42. cusparseDestroyColorInfo

此函数销毁 CSRCOLOR 等调用中使用的着色信息。

integer(4) function cusparseDestroyColorInfo(info)
  type(cusparseColorInfo) :: info

5.1.43. cusparseCreateCsru2csrInfo

此函数创建 CSRU2CSR 等调用中使用的排序信息。

integer(4) function cusparseCreateCsru2csrInfo(info)
  type(cusparseCsru2csrInfo) :: info

5.1.44. cusparseDestroyCsru2csrInfo

此函数创建 CSRU2CSR 等调用中使用的排序信息。

integer(4) function cusparseDestroyCsru2csrInfo(info)
  type(cusparseCsru2csrInfo) :: info

5.2. CUSPARSE Level 1 函数

本节包含用于执行稠密向量和稀疏向量之间运算的 1 级稀疏线性代数函数的接口。

5.2.1. cusparseSaxpyi

SAXPY 执行常数乘以向量加向量。此函数将稀疏格式的向量 x 乘以常数 alpha,并将结果添加到稠密格式的向量 y,即 y = y + alpha * xVal(xInd)

integer(4) function cusparseSaxpyi(handle, nnz, alpha, xVal, xInd, y, idxBase)
  type(cusparseHandle) :: handle
  integer :: nnz
  real(4), device :: alpha ! device or host variable
  real(4), device :: xVal(*)
  integer(4), device :: xInd(*)
  real(4), device :: y(*)
  integer :: idxBase

5.2.2. cusparseDaxpyi

DAXPY 执行常数乘以向量加向量。此函数将稀疏格式的向量 x 乘以常数 alpha,并将结果添加到稠密格式的向量 y,即 y = y + alpha * xVal(xInd)

integer(4) function cusparseDaxpyi(handle, nnz, alpha, xVal, xInd, y, idxBase)
  type(cusparseHandle) :: handle
  integer :: nnz
  real(8), device :: alpha ! device or host variable
  real(8), device :: xVal(*)
  integer(4), device :: xInd(*)
  real(8), device :: y(*)
  integer :: idxBase

5.2.3. cusparseCaxpyi

CAXPY 执行常数乘以向量加向量。此函数将稀疏格式的向量 x 乘以常数 alpha,并将结果添加到稠密格式的向量 y,即 y = y + alpha * xVal(xInd)

integer(4) function cusparseCaxpyi(handle, nnz, alpha, xVal, xInd, y, idxBase)
  type(cusparseHandle) :: handle
  integer :: nnz
  complex(4), device :: alpha ! device or host variable
  complex(4), device :: xVal(*)
  integer(4), device :: xInd(*)
  complex(4), device :: y(*)
  integer :: idxBase

5.2.4. cusparseZaxpyi

ZAXPY 执行常数乘以向量加向量。此函数将稀疏格式的向量 x 乘以常数 alpha,并将结果添加到稠密格式的向量 y,即 y = y + alpha * xVal(xInd)

integer(4) function cusparseZaxpyi(handle, nnz, alpha, xVal, xInd, y, idxBase)
  type(cusparseHandle) :: handle
  integer :: nnz
  complex(8), device :: alpha ! device or host variable
  complex(8), device :: xVal(*)
  integer(4), device :: xInd(*)
  complex(8), device :: y(*)
  integer :: idxBase

5.2.5. cusparseSdoti

SDOT 形成两个向量的点积。此函数返回稀疏格式的向量 x 和稠密格式的向量 y 的点积,即 res = sum(y * xVal(xInd))

此函数已在 CUDA 11.0 中移除。应将其替换为对 cusparseSpVV 的调用

integer(4) function cusparseSdoti(handle, nnz, xVal, xInd, y, res, idxBase)
  type(cusparseHandle) :: handle
  integer :: nnz
  real(4), device :: xVal(*)
  integer(4), device :: xInd(*)
  real(4), device :: y(*)
  real(4), device :: res ! device or host variable
  integer :: idxBase

5.2.6. cusparseDdoti

DDOT 形成两个向量的点积。此函数返回稀疏格式的向量 x 和稠密格式的向量 y 的点积,即 res = sum(y * xVal(xInd))

此函数已在 CUDA 11.0 中移除。应将其替换为对 cusparseSpVV 的调用

integer(4) function cusparseDdoti(handle, nnz, xVal, xInd, y, res, idxBase)
  type(cusparseHandle) :: handle
  integer :: nnz
  real(8), device :: xVal(*)
  integer(4), device :: xInd(*)
  real(8), device :: y(*)
  real(8), device :: res ! device or host variable
  integer :: idxBase

5.2.7. cusparseCdoti

CDOT 形成两个向量的点积。此函数返回稀疏格式的向量 x 和稠密格式的向量 y 的点积,即 res = sum(y * xVal(xInd))

此函数已在 CUDA 11.0 中移除。应将其替换为对 cusparseSpVV 的调用

integer(4) function cusparseCdoti(handle, nnz, xVal, xInd, y, res, idxBase)
  type(cusparseHandle) :: handle
  integer :: nnz
  complex(4), device :: xVal(*)
  integer(4), device :: xInd(*)
  complex(4), device :: y(*)
  complex(4), device :: res ! device or host variable
  integer :: idxBase

5.2.8. cusparseZdoti

ZDOT 形成两个向量的点积。此函数返回稀疏格式的向量 x 和稠密格式的向量 y 的点积,即 res = sum(y * xVal(xInd))

此函数已在 CUDA 11.0 中移除。应将其替换为对 cusparseSpVV 的调用

integer(4) function cusparseZdoti(handle, nnz, xVal, xInd, y, res, idxBase)
  type(cusparseHandle) :: handle
  integer :: nnz
  complex(8), device :: xVal(*)
  integer(4), device :: xInd(*)
  complex(8), device :: y(*)
  complex(8), device :: res ! device or host variable
  integer :: idxBase

5.2.9. cusparseCdotci

CDOTC 形成两个向量的点积,共轭第一个向量。此函数返回稀疏格式的向量 x 和稠密格式的向量 y 的点积,即 res = sum(y * conjg(xVal(xInd))

此函数已在 CUDA 11.0 中移除。应将其替换为对 cusparseSpVV 的调用

integer(4) function cusparseCdotci(handle, nnz, xVal, xInd, y, res, idxBase)
  type(cusparseHandle) :: handle
  integer :: nnz
  complex(4), device :: xVal(*)
  integer(4), device :: xInd(*)
  complex(4), device :: y(*)
  complex(4), device :: res ! device or host variable
  integer :: idxBase

5.2.10. cusparseZdotci

ZDOTC 形成两个向量的点积,共轭第一个向量。此函数返回稀疏格式的向量 x 和稠密格式的向量 y 的点积,即 res = sum(y * conjg(xVal(xInd))

此函数已在 CUDA 11.0 中移除。应将其替换为对 cusparseSpVV 的调用

integer(4) function cusparseZdotci(handle, nnz, xVal, xInd, y, res, idxBase)
  type(cusparseHandle) :: handle
  integer :: nnz
  complex(8), device :: xVal(*)
  integer(4), device :: xInd(*)
  complex(8), device :: y(*)
  complex(8), device :: res ! device or host variable
  integer :: idxBase

5.2.11. cusparseSgthr

此函数将索引数组 xInd 中列出的向量 y 的元素收集到数据数组 xVal 中,即 xVal = y(xInd)。Fortran 程序员通常应使用 idxBase == 1。

integer(4) function cusparseSgthr(handle, nnz, y, xVal, xInd, idxBase)
  type(cusparseHandle) :: handle
  integer(4) :: nnz
  real(4), device :: y(*)
  real(4), device :: xVal(*)
  integer(4), device :: xInd(*)
  integer(4) :: idxBase

5.2.12. cusparseDgthr

此函数将索引数组 xInd 中列出的向量 y 的元素收集到数据数组 xVal 中,即 xVal = y(xInd)。Fortran 程序员通常应使用 idxBase == 1。

integer(4) function cusparseDgthr(handle, nnz, y, xVal, xInd, idxBase)
  type(cusparseHandle) :: handle
  integer(4) :: nnz
  real(8), device :: y(*)
  real(8), device :: xVal(*)
  integer(4), device :: xInd(*)
  integer(4) :: idxBase

5.2.13. cusparseCgthr

此函数将索引数组 xInd 中列出的向量 y 的元素收集到数据数组 xVal 中,即 xVal = y(xInd)。Fortran 程序员通常应使用 idxBase == 1。

integer(4) function cusparseCgthr(handle, nnz, y, xVal, xInd, idxBase)
  type(cusparseHandle) :: handle
  integer(4) :: nnz
  complex(4), device :: y(*)
  complex(4), device :: xVal(*)
  integer(4), device :: xInd(*)
  integer(4) :: idxBase

5.2.14. cusparseZgthr

此函数将索引数组 xInd 中列出的向量 y 的元素收集到数据数组 xVal 中,即 xVal = y(xInd)。Fortran 程序员通常应使用 idxBase == 1。

integer(4) function cusparseZgthr(handle, nnz, y, xVal, xInd, idxBase)
  type(cusparseHandle) :: handle
  integer(4) :: nnz
  complex(8), device :: y(*)
  complex(8), device :: xVal(*)
  integer(4), device :: xInd(*)
  integer(4) :: idxBase

5.2.15. cusparseSgthrz

此函数将索引数组 xInd 中列出的向量 y 的元素收集到数据数组 xVal 中,即 xVal = y(xInd); y(xInd) = 0.0。Fortran 程序员通常应使用 idxBase == 1。

integer(4) function cusparseSgthrz(handle, nnz, y, xVal, xInd, idxBase)
  type(cusparseHandle) :: handle
  integer(4) :: nnz
  real(4), device :: y(*)
  real(4), device :: xVal(*)
  integer(4), device :: xInd(*)
  integer(4) :: idxBase

5.2.16. cusparseDgthrz

此函数将索引数组 xInd 中列出的向量 y 的元素收集到数据数组 xVal 中,即 xVal = y(xInd); y(xInd) = 0.0。Fortran 程序员通常应使用 idxBase == 1。

integer(4) function cusparseDgthrz(handle, nnz, y, xVal, xInd, idxBase)
  type(cusparseHandle) :: handle
  integer(4) :: nnz
  real(8), device :: y(*)
  real(8), device :: xVal(*)
  integer(4), device :: xInd(*)
  integer(4) :: idxBase

5.2.17. cusparseCgthrz

此函数将索引数组 xInd 中列出的向量 y 的元素收集到数据数组 xVal 中,即 xVal = y(xInd); y(xInd) = 0.0。Fortran 程序员通常应使用 idxBase == 1。

integer(4) function cusparseCgthrz(handle, nnz, y, xVal, xInd, idxBase)
  type(cusparseHandle) :: handle
  integer(4) :: nnz
  complex(4), device :: y(*)
  complex(4), device :: xVal(*)
  integer(4), device :: xInd(*)
  integer(4) :: idxBase

5.2.18. cusparseZgthrz

此函数将索引数组 xInd 中列出的向量 y 的元素收集到数据数组 xVal 中,即 xVal = y(xInd); y(xInd) = 0.0。Fortran 程序员通常应使用 idxBase == 1。

integer(4) function cusparseZgthrz(handle, nnz, y, xVal, xInd, idxBase)
  type(cusparseHandle) :: handle
  integer(4) :: nnz
  complex(8), device :: y(*)
  complex(8), device :: xVal(*)
  integer(4), device :: xInd(*)
  integer(4) :: idxBase

5.2.19. cusparseSsctr

此函数将稠密格式向量 x 的元素分散到稀疏格式的向量 y 中,即 y(xInd) = x。Fortran 程序员通常应使用 idxBase == 1。

integer(4) function cusparseSsctr(handle, nnz, xVal, xInd, y, idxBase)
  type(cusparseHandle) :: handle
  integer(4) :: nnz
  real(4), device :: xVal(*)
  integer(4), device :: xInd(*)
  real(4), device :: y(*)
  integer(4) :: idxBase

5.2.20. cusparseDsctr

此函数将稠密格式向量 x 的元素分散到稀疏格式的向量 y 中,即 y(xInd) = x。Fortran 程序员通常应使用 idxBase == 1。

integer(4) function cusparseDsctr(handle, nnz, xVal, xInd, y, idxBase)
  type(cusparseHandle) :: handle
  integer(4) :: nnz
  real(8), device :: xVal(*)
  integer(4), device :: xInd(*)
  real(8), device :: y(*)
  integer(4) :: idxBase

5.2.21. cusparseCsctr

此函数将稠密格式向量 x 的元素分散到稀疏格式的向量 y 中,即 y(xInd) = x。Fortran 程序员通常应使用 idxBase == 1。

integer(4) function cusparseCsctr(handle, nnz, xVal, xInd, y, idxBase)
  type(cusparseHandle) :: handle
  integer(4) :: nnz
  complex(4), device :: xVal(*)
  integer(4), device :: xInd(*)
  complex(4), device :: y(*)
  integer(4) :: idxBase

5.2.22. cusparseZsctr

此函数将稠密格式向量 x 的元素分散到稀疏格式的向量 y 中,即 y(xInd) = x。Fortran 程序员通常应使用 idxBase == 1。

integer(4) function cusparseZsctr(handle, nnz, xVal, xInd, y, idxBase)
  type(cusparseHandle) :: handle
  integer(4) :: nnz
  complex(8), device :: xVal(*)
  integer(4), device :: xInd(*)
  complex(8), device :: y(*)
  integer(4) :: idxBase

5.2.23. cusparseSroti

SROT 应用平面旋转。X 是稀疏向量,Y 是稠密向量。

integer(4) function cusparseSroti(handle, nnz, xVal, xInd, y, c, s, idxBase)
  type(cusparseHandle) :: handle
  integer :: nnz
  real(4), device :: xVal(*)
  integer(4), device :: xInd(*)
  real(4), device :: y(*)
  real(4), device :: c, s ! device or host variable
  integer :: idxBase

5.2.24. cusparseDroti

DROT 应用平面旋转。X 是稀疏向量,Y 是稠密向量。

integer(4) function cusparseDroti(handle, nnz, xVal, xInd, y, c, s, idxBase)
  type(cusparseHandle) :: handle
  integer :: nnz
  real(8), device :: xVal(*)
  integer(4), device :: xInd(*)
  real(8), device :: y(*)
  real(8), device :: c, s ! device or host variable
  integer :: idxBase

5.3. CUSPARSE Level 2 函数

本节包含用于执行稀疏矩阵和稠密向量之间运算的 2 级稀疏线性代数函数的接口。

5.3.1. cusparseSbsrmv

BSRMV 执行矩阵-向量运算 y := alpha*A*x + beta*y, 或 y := alpha*A**T*x + beta*y, 其中 alpha 和 beta 是标量,x 和 y 是向量,A 是一个 (mb*blockDim) x (nb*blockDim) 稀疏矩阵,该矩阵在 BSR 存储格式中由三个数组 bsrVal、bsrRowPtr 和 bsrColInd 定义

integer(4) function cusparseSbsrmv(handle, dir, trans, mb, nb, nnzb, alpha, descr, bsrVal, bsrRowPtr, bsrColInd, blockDim, x, beta, y)
  type(cusparseHandle) :: handle
  integer :: dir
  integer :: trans
  integer :: mb, nb, nnzb
  real(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  real(4), device :: bsrVal(*)
  integer(4), device :: bsrRowPtr(*)
  integer(4), device :: bsrColInd(*)
  integer :: blockDim
  real(4), device :: x(*)
  real(4), device :: beta ! device or host variable
  real(4), device :: y(*)

5.3.2. cusparseDbsrmv

BSRMV 执行矩阵-向量运算 y := alpha*A*x + beta*y, 或 y := alpha*A**T*x + beta*y, 其中 alpha 和 beta 是标量,x 和 y 是向量,A 是一个 (mb*blockDim) x (nb*blockDim) 稀疏矩阵,该矩阵在 BSR 存储格式中由三个数组 bsrVal、bsrRowPtr 和 bsrColInd 定义

integer(4) function cusparseDbsrmv(handle, dir, trans, mb, nb, nnzb, alpha, descr, bsrVal, bsrRowPtr, bsrColInd, blockDim, x, beta, y)
  type(cusparseHandle) :: handle
  integer :: dir
  integer :: trans
  integer :: mb, nb, nnzb
  real(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  real(8), device :: bsrVal(*)
  integer(4), device :: bsrRowPtr(*)
  integer(4), device :: bsrColInd(*)
  integer :: blockDim
  real(8), device :: x(*)
  real(8), device :: beta ! device or host variable
  real(8), device :: y(*)

5.3.3. cusparseCbsrmv

BSRMV 执行矩阵-向量运算 y := alpha*A*x + beta*y, 或 y := alpha*A**T*x + beta*y, 其中 alpha 和 beta 是标量,x 和 y 是向量,A 是一个 (mb*blockDim) x (nb*blockDim) 稀疏矩阵,该矩阵在 BSR 存储格式中由三个数组 bsrVal、bsrRowPtr 和 bsrColInd 定义

integer(4) function cusparseCbsrmv(handle, dir, trans, mb, nb, nnzb, alpha, descr, bsrVal, bsrRowPtr, bsrColInd, blockDim, x, beta, y)
  type(cusparseHandle) :: handle
  integer :: dir
  integer :: trans
  integer :: mb, nb, nnzb
  complex(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  complex(4), device :: bsrVal(*)
  integer(4), device :: bsrRowPtr(*)
  integer(4), device :: bsrColInd(*)
  integer :: blockDim
  complex(4), device :: x(*)
  complex(4), device :: beta ! device or host variable
  complex(4), device :: y(*)

5.3.4. cusparseZbsrmv

BSRMV 执行矩阵-向量运算 y := alpha*A*x + beta*y, 或 y := alpha*A**T*x + beta*y, 其中 alpha 和 beta 是标量,x 和 y 是向量,A 是一个 (mb*blockDim) x (nb*blockDim) 稀疏矩阵,该矩阵在 BSR 存储格式中由三个数组 bsrVal、bsrRowPtr 和 bsrColInd 定义

integer(4) function cusparseZbsrmv(handle, dir, trans, mb, nb, nnzb, alpha, &
           descr, bsrVal, bsrRowPtr, bsrColInd, blockDim, x, beta, y)
  type(cusparseHandle) :: handle
  integer :: dir
  integer :: trans
  integer :: mb, nb, nnzb
  complex(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  complex(8), device :: bsrVal(*)
  integer(4), device :: bsrRowPtr(*)
  integer(4), device :: bsrColInd(*)
  integer :: blockDim
  complex(8), device :: x(*)
  complex(8), device :: beta ! device or host variable
  complex(8), device :: y(*)

5.3.5. cusparseSbsrxmv

BSRXMV 执行 BSRMV 和掩码运算。

integer(4) function cusparseSbsrxmv(handle, dir, trans, sizeOfMask, mb, nb, nnzb, alpha, &
           descr, bsrVal, bsrMaskPtr, bsrRowPtr, bsrEndPtr, bsrColInd, blockDim, x, beta, y)
  type(cusparseHandle) :: handle
  integer :: dir
  integer :: trans
  integer :: sizeOfMask
  integer :: mb, nb, nnzb
  real(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  real(4), device :: bsrVal(*)
  integer(4), device :: bsrMaskPtr(*), bsrRowPtr(*), bsrEndPtr(*)
  integer(4), device :: bsrColInd(*)
  integer :: blockDim
  real(4), device :: x(*)
  real(4), device :: beta ! device or host variable
  real(4), device :: y(*)

5.3.6. cusparseDbsrxmv

BSRXMV 执行 BSRMV 和掩码运算。

integer(4) function cusparseDbsrxmv(handle, dir, trans, sizeOfMask, mb, nb, nnzb, alpha, &
           descr, bsrVal, bsrMaskPtr, bsrRowPtr, bsrEndPtr, bsrColInd, blockDim, x, beta, y)
  type(cusparseHandle) :: handle
  integer :: dir
  integer :: trans
  integer :: sizeOfMask
  integer :: mb, nb, nnzb
  real(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  real(8), device :: bsrVal(*)
  integer(4), device :: bsrMaskPtr(*), bsrRowPtr(*), bsrEndPtr(*)
  integer(4), device :: bsrColInd(*)
  integer :: blockDim
  real(8), device :: x(*)
  real(8), device :: beta ! device or host variable
  real(8), device :: y(*)

5.3.7. cusparseCbsrxmv

BSRXMV 执行 BSRMV 和掩码运算。

integer(4) function cusparseCbsrxmv(handle, dir, trans, sizeOfMask, mb, nb, nnzb, alpha, &
           descr, bsrVal, bsrMaskPtr, bsrRowPtr, bsrEndPtr, bsrColInd, blockDim, x, beta, y)
  type(cusparseHandle) :: handle
  integer :: dir
  integer :: trans
  integer :: sizeOfMask
  integer :: mb, nb, nnzb
  complex(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  complex(4), device :: bsrVal(*)
  integer(4), device :: bsrMaskPtr(*), bsrRowPtr(*), bsrEndPtr(*)
  integer(4), device :: bsrColInd(*)
  integer :: blockDim
  complex(4), device :: x(*)
  complex(4), device :: beta ! device or host variable
  complex(4), device :: y(*)

5.3.8. cusparseZbsrxmv

BSRXMV 执行 BSRMV 和掩码运算。

integer(4) function cusparseZbsrxmv(handle, dir, trans, sizeOfMask, mb, nb, nnzb, alpha, &
           descr, bsrVal, bsrMaskPtr, bsrRowPtr, bsrEndPtr, bsrColInd, blockDim, x, beta, y)
  type(cusparseHandle) :: handle
  integer :: dir
  integer :: trans
  integer :: sizeOfMask
  integer :: mb, nb, nnzb
  complex(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  complex(8), device :: bsrVal(*)
  integer(4), device :: bsrMaskPtr(*), bsrRowPtr(*), bsrEndPtr(*)
  integer(4), device :: bsrColInd(*)
  integer :: blockDim
  complex(8), device :: x(*)
  complex(8), device :: beta ! device or host variable
  complex(8), device :: y(*)

5.3.9. cusparseScsrmv

CSRMV 执行矩阵-向量运算 y := alpha*A*x + beta*y, 或 y := alpha*A**T*x + beta*y, 其中 alpha 和 beta 是标量,x 和 y 是向量,A 是一个 m x n 稀疏矩阵,该矩阵在 CSR 存储格式中由三个数组 csrValA、csrRowPtrA 和 csrColIndA 定义

此函数已在 CUDA 11.0 中移除。应将其替换为对 cusparseSpMV 的调用

integer(4) function cusparseScsrmv(handle, trans, m, n, nnz, alpha, descr, csrVal, csrRowPtr, csrColInd, x, beta, y)
  type(cusparseHandle) :: handle
  integer :: trans
  integer :: m, n, nnz
  real(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  real(4), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*)
  integer(4), device :: csrColInd(*)
  real(4), device :: x(*)
  real(4), device :: beta ! device or host variable
  real(4), device :: y(*)

5.3.10. cusparseDcsrmv

CSRMV 执行矩阵-向量运算 y := alpha*A*x + beta*y, 或 y := alpha*A**T*x + beta*y, 其中 alpha 和 beta 是标量,x 和 y 是向量,A 是一个 m x n 稀疏矩阵,该矩阵在 CSR 存储格式中由三个数组 csrValA、csrRowPtrA 和 csrColIndA 定义

此函数已在 CUDA 11.0 中移除。应将其替换为对 cusparseSpMV 的调用

integer(4) function cusparseDcsrmv(handle, trans, m, n, nnz, alpha, descr, csrVal, csrRowPtr, csrColInd, x, beta, y)
  type(cusparseHandle) :: handle
  integer :: trans
  integer :: m, n, nnz
  real(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  real(8), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*)
  integer(4), device :: csrColInd(*)
  real(8), device :: x(*)
  real(8), device :: beta ! device or host variable
  real(8), device :: y(*)

5.3.11. cusparseCcsrmv

CSRMV 执行矩阵-向量运算 y := alpha*A*x + beta*y, 或 y := alpha*A**T*x + beta*y, 其中 alpha 和 beta 是标量,x 和 y 是向量,A 是一个 m x n 稀疏矩阵,该矩阵在 CSR 存储格式中由三个数组 csrValA、csrRowPtrA 和 csrColIndA 定义

此函数已在 CUDA 11.0 中移除。应将其替换为对 cusparseSpMV 的调用

integer(4) function cusparseCcsrmv(handle, trans, m, n, nnz, alpha, descr, csrVal, csrRowPtr, csrColInd, x, beta, y)
  type(cusparseHandle) :: handle
  integer :: trans
  integer :: m, n, nnz
  complex(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  complex(4), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*)
  integer(4), device :: csrColInd(*)
  complex(4), device :: x(*)
  complex(4), device :: beta ! device or host variable
  complex(4), device :: y(*)

5.3.12. cusparseZcsrmv

CSRMV 执行矩阵-向量运算 y := alpha*A*x + beta*y, 或 y := alpha*A**T*x + beta*y, 其中 alpha 和 beta 是标量,x 和 y 是向量,A 是一个 m x n 稀疏矩阵,该矩阵在 CSR 存储格式中由三个数组 csrValA、csrRowPtrA 和 csrColIndA 定义

此函数已在 CUDA 11.0 中移除。应将其替换为对 cusparseSpMV 的调用

integer(4) function cusparseZcsrmv(handle, trans, m, n, nnz, alpha, descr, csrVal, csrRowPtr, csrColInd, x, beta, y)
  type(cusparseHandle) :: handle
  integer :: trans
  integer :: m, n, nnz
  complex(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  complex(8), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*)
  integer(4), device :: csrColInd(*)
  complex(8), device :: x(*)
  complex(8), device :: beta ! device or host variable
  complex(8), device :: y(*)

5.3.13. cusparseScsrsv_analysis

此函数执行 csrsv 的分析阶段。

integer(4) function cusparseScsrsv_analysis(handle, trans, m, nnz, descr, csrVal, csrRowPtr, csrColInd, info)
  type(cusparseHandle) :: handle
  integer(4) :: trans
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descr
  real(4), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*)
  integer(4), device :: csrColInd(*)
  type(cusparseSolveAnalysisInfo) :: info

5.3.14. cusparseDcsrsv_analysis

此函数执行 csrsv 的分析阶段。

integer(4) function cusparseDcsrsv_analysis(handle, trans, m, nnz, descr, csrVal, csrRowPtr, csrColInd, info)
  type(cusparseHandle) :: handle
  integer(4) :: trans
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descr
  real(8), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*)
  integer(4), device :: csrColInd(*)
  type(cusparseSolveAnalysisInfo) :: info

5.3.15. cusparseCcsrsv_analysis

此函数执行 csrsv 的分析阶段。

integer(4) function cusparseCcsrsv_analysis(handle, trans, m, nnz, descr, csrVal, csrRowPtr, csrColInd, info)
  type(cusparseHandle) :: handle
  integer(4) :: trans
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descr
  complex(4), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*)
  integer(4), device :: csrColInd(*)
  type(cusparseSolveAnalysisInfo) :: info

5.3.16. cusparseZcsrsv_analysis

此函数执行 csrsv 的分析阶段。

integer(4) function cusparseZcsrsv_analysis(handle, trans, m, nnz, descr, csrVal, csrRowPtr, csrColInd, info)
  type(cusparseHandle) :: handle
  integer(4) :: trans
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descr
  complex(8), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*)
  integer(4), device :: csrColInd(*)
  type(cusparseSolveAnalysisInfo) :: info

5.3.17. cusparseScsrsv_solve

此函数执行 csrsv 的求解阶段。

integer(4) function cusparseScsrsv_solve(handle, trans, m, alpha, descr, csrVal, csrRowPtr, csrColInd, info, x, y)
  type(cusparseHandle) :: handle
  integer :: trans
  integer :: m
  real(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  real(4), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*)
  integer(4), device :: csrColInd(*)
  type(cusparseSolveAnalysisInfo) :: info
  real(4), device :: x(*)
  real(4), device :: y(*)

5.3.18. cusparseDcsrsv_solve

此函数执行 csrsv 的求解阶段。

integer(4) function cusparseDcsrsv_solve(handle, trans, m, alpha, descr, csrVal, csrRowPtr, csrColInd, info, x, y)
  type(cusparseHandle) :: handle
  integer :: trans
  integer :: m
  real(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  real(8), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*)
  integer(4), device :: csrColInd(*)
  type(cusparseSolveAnalysisInfo) :: info
  real(8), device :: x(*)
  real(8), device :: y(*)

5.3.19. cusparseCcsrsv_solve

此函数执行 csrsv 的求解阶段。

integer(4) function cusparseCcsrsv_solve(handle, trans, m, alpha, descr, csrVal, csrRowPtr, csrColInd, info, x, y)
  type(cusparseHandle) :: handle
  integer :: trans
  integer :: m
  complex(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  complex(4), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*)
  integer(4), device :: csrColInd(*)
  type(cusparseSolveAnalysisInfo) :: info
  complex(4), device :: x(*)
  complex(4), device :: y(*)

5.3.20. cusparseZcsrsv_solve

此函数执行 csrsv 的求解阶段。

integer(4) function cusparseZcsrsv_solve(handle, trans, m, alpha, descr, csrVal, csrRowPtr, csrColInd, info, x, y)
  type(cusparseHandle) :: handle
  integer :: trans
  integer :: m
  complex(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  complex(8), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*)
  integer(4), device :: csrColInd(*)
  type(cusparseSolveAnalysisInfo) :: info
  complex(8), device :: x(*)
  complex(8), device :: y(*)

5.3.21. cusparseSgemvi_bufferSize

此函数返回 cusparseSgemvi 所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseSgemvi_bufferSize(handle, transA, m, n, nnz, pBufferSize)
  type(cusparseHandle) :: handle
  integer :: transA
  integer :: m, n, nnz
  integer(4) :: pBufferSize

5.3.22. cusparseDgemvi_bufferSize

此函数返回 cusparseDgemvi 所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseDgemvi_bufferSize(handle, transA, m, n, nnz, pBufferSize)
  type(cusparseHandle) :: handle
  integer :: transA
  integer :: m, n, nnz
  integer(4) :: pBufferSize

5.3.23. cusparseCgemvi_bufferSize

此函数返回 cusparseCgemvi 所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseCgemvi_bufferSize(handle, transA, m, n, nnz, pBufferSize)
  type(cusparseHandle) :: handle
  integer :: transA
  integer :: m, n, nnz
  integer(4) :: pBufferSize

5.3.24. cusparseZgemvi_bufferSize

此函数返回 cusparseZgemvi 所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseZgemvi_bufferSize(handle, transA, m, n, nnz, pBufferSize)
  type(cusparseHandle) :: handle
  integer :: transA
  integer :: m, n, nnz
  integer(4) :: pBufferSize

5.3.25. cusparseSgemvi

GEMVI 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,A 是 m x n 稠密矩阵,x 是稀疏向量,y 是稠密向量。

integer(4) function cusparseSgemvi(handle, transA, m, n, alpha, A, lda, nnz, xVal, xInd, beta, y, idxBase, pBuffer)
  type(cusparseHandle) :: handle
  integer :: transA
  integer :: m, n, lda, nnz, idxBase
  real(4), device :: alpha, beta ! device or host variable
  real(4), device :: A(lda,*)
  real(4), device :: xVal(*)
  integer(4), device :: xInd(*)
  real(4), device :: y(*)
  integer(1), device :: pBuffer(*) ! Any data type is allowed

5.3.26. cusparseDgemvi

GEMVI 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,A 是 m x n 稠密矩阵,x 是稀疏向量,y 是稠密向量。

integer(4) function cusparseDgemvi(handle, transA, m, n, alpha, A, lda, nnz, xVal, xInd, beta, y, idxBase, pBuffer)
  type(cusparseHandle) :: handle
  integer :: transA
  integer :: m, n, lda, nnz, idxBase
  real(8), device :: alpha, beta ! device or host variable
  real(8), device :: A(lda,*)
  real(8), device :: xVal(*)
  integer(4), device :: xInd(*)
  real(8), device :: y(*)
  integer(1), device :: pBuffer(*) ! Any data type is allowed

5.3.27. cusparseCgemvi

GEMVI 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,A 是 m x n 稠密矩阵,x 是稀疏向量,y 是稠密向量。

integer(4) function cusparseCgemvi(handle, transA, m, n, alpha, A, lda, nnz, xVal, xInd, beta, y, idxBase, pBuffer)
  type(cusparseHandle) :: handle
  integer :: transA
  integer :: m, n, lda, nnz, idxBase
  complex(4), device :: alpha, beta ! device or host variable
  complex(4), device :: A(lda,*)
  complex(4), device :: xVal(*)
  integer(4), device :: xInd(*)
  complex(4), device :: y(*)
  integer(1), device :: pBuffer(*) ! Any data type is allowed

5.3.28. cusparseZgemvi

GEMVI 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,A 是 m x n 稠密矩阵,x 是稀疏向量,y 是稠密向量。

integer(4) function cusparseZgemvi(handle, transA, m, n, alpha, A, lda, nnz, xVal, xInd, beta, y, idxBase, pBuffer)
  type(cusparseHandle) :: handle
  integer :: transA
  integer :: m, n, lda, nnz, idxBase
  complex(8), device :: alpha, beta ! device or host variable
  complex(8), device :: A(lda,*)
  complex(8), device :: xVal(*)
  integer(4), device :: xInd(*)
  complex(8), device :: y(*)
  integer(1), device :: pBuffer(*) ! Any data type is allowed

5.3.29. cusparseShybmv

HYBMV 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是向量,A 是一个以 HYB 存储格式定义的 m x n 稀疏矩阵。

此函数已在 CUDA 11.0 中移除。

integer(4) function cusparseShybmv(handle, trans, alpha, descr, hyb, x, beta, y)
  type(cusparseHandle) :: handle
  integer :: trans
  real(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  type(cusparseHybMat) :: hyb
  real(4), device :: x(*)
  real(4), device :: beta ! device or host variable
  real(4), device :: y(*)

5.3.30. cusparseDhybmv

HYBMV 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是向量,A 是一个以 HYB 存储格式定义的 m x n 稀疏矩阵。

此函数已在 CUDA 11.0 中移除。

integer(4) function cusparseDhybmv(handle, trans, alpha, descr, hyb, x, beta, y)
  type(cusparseHandle) :: handle
  integer :: trans
  real(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  type(cusparseHybMat) :: hyb
  real(8), device :: x(*)
  real(8), device :: beta ! device or host variable
  real(8), device :: y(*)

5.3.31. cusparseChybmv

HYBMV 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是向量,A 是一个以 HYB 存储格式定义的 m x n 稀疏矩阵。

此函数已在 CUDA 11.0 中移除。

integer(4) function cusparseChybmv(handle, trans, alpha, descr, hyb, x, beta, y)
  type(cusparseHandle) :: handle
  integer :: trans
  complex(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  type(cusparseHybMat) :: hyb
  complex(4), device :: x(*)
  complex(4), device :: beta ! device or host variable
  complex(4), device :: y(*)

5.3.32. cusparseZhybmv

HYBMV 执行矩阵-向量运算 y := alpha*A*x + beta*y,其中 alpha 和 beta 是标量,x 和 y 是向量,A 是一个以 HYB 存储格式定义的 m x n 稀疏矩阵。

此函数已在 CUDA 11.0 中移除。

integer(4) function cusparseZhybmv(handle, trans, alpha, descr, hyb, x, beta, y)
  type(cusparseHandle) :: handle
  integer :: trans
  complex(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  type(cusparseHybMat) :: hyb
  complex(8), device :: x(*)
  complex(8), device :: beta ! device or host variable
  complex(8), device :: y(*)

5.3.33. cusparseShybsv_analysis

此函数执行 hybsv 的分析阶段。

integer(4) function cusparseShybsv_analysis(handle, trans, descr, hyb, info)
  type(cusparseHandle) :: handle
  integer(4) :: trans
  type(cusparseMatDescr) :: descr
  type(cusparseHybMat) :: hyb
  type(cusparseSolveAnalysisInfo) :: info

5.3.34. cusparseDhybsv_analysis

此函数执行 hybsv 的分析阶段。

integer(4) function cusparseDhybsv_analysis(handle, trans, descr, hyb, info)
  type(cusparseHandle) :: handle
  integer(4) :: trans
  type(cusparseMatDescr) :: descr
  type(cusparseHybMat) :: hyb
  type(cusparseSolveAnalysisInfo) :: info

5.3.35. cusparseChybsv_analysis

此函数执行 hybsv 的分析阶段。

integer(4) function cusparseChybsv_analysis(handle, trans, descr, hyb, info)
  type(cusparseHandle) :: handle
  integer(4) :: trans
  type(cusparseMatDescr) :: descr
  type(cusparseHybMat) :: hyb
  type(cusparseSolveAnalysisInfo) :: info

5.3.36. cusparseZhybsv_analysis

此函数执行 hybsv 的分析阶段。

integer(4) function cusparseZhybsv_analysis(handle, trans, descr, hyb, info)
  type(cusparseHandle) :: handle
  integer(4) :: trans
  type(cusparseMatDescr) :: descr
  type(cusparseHybMat) :: hyb
  type(cusparseSolveAnalysisInfo) :: info

5.3.37. cusparseShybsv_solve

此函数执行 hybsv 的求解阶段。

integer(4) function cusparseShybsv_solve(handle, trans, alpha, descr, hyb, info, x, y)
  type(cusparseHandle) :: handle
  integer :: trans
  real(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  type(cusparseHybMat) :: hyb
  type(cusparseSolveAnalysisInfo) :: info
  real(4), device :: x(*)
  real(4), device :: y(*)

5.3.38. cusparseDhybsv_solve

此函数执行 hybsv 的求解阶段。

integer(4) function cusparseDhybsv_solve(handle, trans, alpha, descr, hyb, info, x, y)
  type(cusparseHandle) :: handle
  integer :: trans
  real(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  type(cusparseHybMat) :: hyb
  type(cusparseSolveAnalysisInfo) :: info
  real(8), device :: x(*)
  real(8), device :: y(*)

5.3.39. cusparseChybsv_solve

此函数执行 hybsv 的求解阶段。

integer(4) function cusparseChybsv_solve(handle, trans, alpha, descr, hyb, info, x, y)
  type(cusparseHandle) :: handle
  integer :: trans
  complex(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  type(cusparseHybMat) :: hyb
  type(cusparseSolveAnalysisInfo) :: info
  complex(4), device :: x(*)
  complex(4), device :: y(*)

5.3.40. cusparseZhybsv_solve

此函数执行 hybsv 的求解阶段。

integer(4) function cusparseZhybsv_solve(handle, trans, alpha, descr, hyb, info, x, y)
  type(cusparseHandle) :: handle
  integer :: trans
  complex(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descr
  type(cusparseHybMat) :: hyb
  type(cusparseSolveAnalysisInfo) :: info
  complex(8), device :: x(*)
  complex(8), device :: y(*)

5.3.41. cusparseSbsrsv2_bufferSize

此函数返回 bsrsv2 中使用的缓冲区大小。

integer(4) function cusparseSbsrsv2_bufferSize(handle, dirA, transA, mb, nnzb, &
           descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, transA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  real(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrsv2Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.3.42. cusparseDbsrsv2_bufferSize

此函数返回 bsrsv2 中使用的缓冲区大小。

integer(4) function cusparseDbsrsv2_bufferSize(handle, dirA, transA, mb, nnzb, &
           descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, transA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  real(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrsv2Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.3.43. cusparseCbsrsv2_bufferSize

此函数返回 bsrsv2 中使用的缓冲区大小。

integer(4) function cusparseCbsrsv2_bufferSize(handle, dirA, transA, mb, nnzb, &
           descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, transA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrsv2Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.3.44. cusparseZbsrsv2_bufferSize

此函数返回 bsrsv2 中使用的缓冲区大小。

integer(4) function cusparseZbsrsv2_bufferSize(handle, dirA, transA, mb, nnzb, &
           descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, transA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrsv2Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.3.45. cusparseSbsrsv2_analysis

此函数执行 bsrsv2 的分析阶段。

integer(4) function cusparseSbsrsv2_analysis(handle, dirA, transA, mb, nnzb, &
           descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, transA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  real(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrsv2Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.3.46. cusparseDbsrsv2_analysis

此函数执行 bsrsv2 的分析阶段。

integer(4) function cusparseDbsrsv2_analysis(handle, dirA, transA, mb, nnzb, &
           descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, transA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  real(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrsv2Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.3.47. cusparseCbsrsv2_analysis

此函数执行 bsrsv2 的分析阶段。

integer(4) function cusparseCbsrsv2_analysis(handle, dirA, transA, mb, nnzb, &
           descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, transA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrsv2Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.3.48. cusparseZbsrsv2_analysis

此函数执行 bsrsv2 的分析阶段。

integer(4) function cusparseZbsrsv2_analysis(handle, dirA, transA, mb, nnzb, &
           descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, transA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrsv2Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.3.49. cusparseSbsrsv2_solve

此函数执行 bsrsv2 的求解阶段。

integer(4) function cusparseSbsrsv2_solve(handle, dirA, transA, mb, nnzb, &
           alpha, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, x, y, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer :: dirA, transA, mb, nnzb
  real(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descrA
  real(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer :: blockDim
  type(cusparseBsrsv2Info) :: info
  real(4), device :: x(*), y(*)
  integer :: policy
  character, device :: pBuffer(*)

5.3.50. cusparseDbsrsv2_solve

此函数执行 bsrsv2 的求解阶段。

integer(4) function cusparseDbsrsv2_solve(handle, dirA, transA, mb, nnzb, &
           alpha, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, x, y, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer :: dirA, transA, mb, nnzb
  real(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descrA
  real(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer :: blockDim
  type(cusparseBsrsv2Info) :: info
  real(8), device :: x(*), y(*)
  integer :: policy
  character, device :: pBuffer(*)

5.3.51. cusparseCbsrsv2_solve

此函数执行 bsrsv2 的求解阶段。

integer(4) function cusparseCbsrsv2_solve(handle, dirA, transA, mb, nnzb, alpha, &
           descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, x, y, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer :: dirA, transA, mb, nnzb
  complex(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descrA
  complex(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer :: blockDim
  type(cusparseBsrsv2Info) :: info
  complex(4), device :: x(*), y(*)
  integer :: policy
  character, device :: pBuffer(*)

5.3.52. cusparseZbsrsv2_solve

此函数执行 bsrsv2 的求解阶段。

integer(4) function cusparseZbsrsv2_solve(handle, dirA, transA, mb, nnzb, alpha, &
           descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, x, y, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer :: dirA, transA, mb, nnzb
  complex(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descrA
  complex(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer :: blockDim
  type(cusparseBsrsv2Info) :: info
  complex(8), device :: x(*), y(*)
  integer :: policy
  character, device :: pBuffer(*)

5.3.53. cusparseXbsrsv2_zeroPivot

当 A(j,j) 是结构零或数值零时,此函数返回等于 CUSPARSE_STATUS_ZERO_PIVOT 的错误代码,并将 position 设置为 j。否则,position 将设置为 -1。

integer(4) function cusparseXbsrsv2_zeroPivot(handle, info, position)
  type(cusparseHandle) :: handle
  type(cusparseBsrsv2Info) :: info
  integer(4), device :: position ! device or host variable

5.3.54. cusparseScsrsv2_bufferSize

此函数返回 csrsv2 中使用的缓冲区大小。

integer(4) function cusparseScsrsv2_bufferSize(handle, transA, m, nnz, descrA, &
           csrValA, csrRowPtrA, csrColIndA, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: transA, m, nnz
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrsv2Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.3.55. cusparseDcsrsv2_bufferSize

此函数返回 csrsv2 中使用的缓冲区大小。

integer(4) function cusparseDcsrsv2_bufferSize(handle, transA, m, nnz, descrA, &
           csrValA, csrRowPtrA, csrColIndA, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: transA, m, nnz
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrsv2Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.3.56. cusparseCcsrsv2_bufferSize

此函数返回 csrsv2 中使用的缓冲区大小。

integer(4) function cusparseCcsrsv2_bufferSize(handle, transA, m, nnz, descrA, csrValA, &
           csrRowPtrA, csrColIndA, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: transA, m, nnz
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrsv2Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.3.57. cusparseZcsrsv2_bufferSize

此函数返回 csrsv2 中使用的缓冲区大小。

integer(4) function cusparseZcsrsv2_bufferSize(handle, transA, m, nnz, descrA, &
           csrValA, csrRowPtrA, csrColIndA, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: transA, m, nnz
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrsv2Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.3.58. cusparseScsrsv2_analysis

此函数执行 csrsv2 的分析阶段。

integer(4) function cusparseScsrsv2_analysis(handle, transA, m, nnz, descrA, &
           csrValA, csrRowPtrA, csrColIndA, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: transA, m, nnz
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrsv2Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.3.59. cusparseDcsrsv2_analysis

此函数执行 csrsv2 的分析阶段。

integer(4) function cusparseDcsrsv2_analysis(handle, transA, m, nnz, descrA, &
           csrValA, csrRowPtrA, csrColIndA, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: transA, m, nnz
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrsv2Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.3.60. cusparseCcsrsv2_analysis

此函数执行 csrsv2 的分析阶段。

integer(4) function cusparseCcsrsv2_analysis(handle, transA, m, nnz, descrA, &
           csrValA, csrRowPtrA, csrColIndA, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: transA, m, nnz
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrsv2Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.3.61. cusparseZcsrsv2_analysis

此函数执行 csrsv2 的分析阶段。

integer(4) function cusparseZcsrsv2_analysis(handle, transA, m, nnz, descrA, &
           csrValA, csrRowPtrA, csrColIndA, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: transA, m, nnz
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrsv2Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.3.62. cusparseScsrsv2_solve

此函数执行 csrsv2 的求解阶段。

integer(4) function cusparseScsrsv2_solve(handle, transA, m, nnz, alpha, descrA, &
           csrValA, csrRowPtrA, csrColIndA, info, x, y, policy, pBuffer)
  type(cusparseHandle) :: handle
  real(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValA(*), x(*), y(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrsv2Info) :: info
  integer :: policy
  character, device :: pBuffer(*)

5.3.63. cusparseDcsrsv2_solve

此函数执行 csrsv2 的求解阶段。

integer(4) function cusparseDcsrsv2_solve(handle, transA, m, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, info, x, y, policy, pBuffer)
  type(cusparseHandle) :: handle
  real(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValA(*), x(*), y(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrsv2Info) :: info
  integer :: policy
  character, device :: pBuffer(*)

5.3.64. cusparseCcsrsv2_solve

此函数执行 csrsv2 的求解阶段。

integer(4) function cusparseCcsrsv2_solve(handle, transA, m, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, info, x, y, policy, pBuffer)
  type(cusparseHandle) :: handle
  complex(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValA(*), x(*), y(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrsv2Info) :: info
  integer :: policy
  character, device :: pBuffer(*)

5.3.65. cusparseZcsrsv2_solve

此函数执行 csrsv2 的求解阶段。

integer(4) function cusparseZcsrsv2_solve(handle, transA, m, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, info, x, y, policy, pBuffer)
  type(cusparseHandle) :: handle
  complex(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValA(*), x(*), y(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrsv2Info) :: info
  integer :: policy
  character, device :: pBuffer(*)

5.3.66. cusparseXcsrsv2_zeroPivot

当 A(j,j) 是结构零或数值零时,此函数返回等于 CUSPARSE_STATUS_ZERO_PIVOT 的错误代码,并将 position 设置为 j。否则,position 将设置为 -1。

integer(4) function cusparseXcsrsv2_zeroPivot(handle, info, position)
  type(cusparseHandle) :: handle
  type(cusparseCsrsv2Info) :: info
  integer(4), device :: position ! device or host variable

5.4. CUSPARSE Level 3 函数

本节包含用于执行稀疏矩阵和稠密矩阵之间运算的 3 级稀疏线性代数函数的接口。

5.4.1. cusparseScsrmm

CSRMM 执行矩阵-矩阵运算 C := alpha*op( A ) * B + beta*C 之一,其中 op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一,alpha 和 beta 是标量。A 是一个 m x k 稀疏矩阵,通过三个数组 csrValA、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。B 和 C 是稠密矩阵。

此函数已在 CUDA 11.0 中移除。应将其替换为对 cusparseSpMM 的调用

integer(4) function cusparseScsrmm(handle, transA, m, n, k, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, B, ldb, beta, C, ldc)
  type(cusparseHandle) :: handle
  integer :: transA, m, n, k, nnz
  real(4), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValA(*), B(*), C(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  integer :: ldb, ldc

5.4.2. cusparseDcsrmm

CSRMM 执行矩阵-矩阵运算 C := alpha*op( A ) * B + beta*C 之一,其中 op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一,alpha 和 beta 是标量。A 是一个 m x k 稀疏矩阵,通过三个数组 csrValA、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。B 和 C 是稠密矩阵。

此函数已在 CUDA 11.0 中移除。应将其替换为对 cusparseSpMM 的调用

integer(4) function cusparseDcsrmm(handle, transA, m, n, k, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, B, ldb, beta, C, ldc)
  type(cusparseHandle) :: handle
  integer :: transA, m, n, k, nnz
  real(8), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValA(*), B(*), C(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  integer :: ldb, ldc

5.4.3. cusparseCcsrmm

CSRMM 执行矩阵-矩阵运算 C := alpha*op( A ) * B + beta*C 之一,其中 op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一,alpha 和 beta 是标量。A 是一个 m x k 稀疏矩阵,通过三个数组 csrValA、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。B 和 C 是稠密矩阵。

此函数已在 CUDA 11.0 中移除。应将其替换为对 cusparseSpMM 的调用

integer(4) function cusparseCcsrmm(handle, transA, m, n, k, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, B, ldb, beta, C, ldc)
  type(cusparseHandle) :: handle
  integer :: transA, m, n, k, nnz
  complex(4), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValA(*), B(*), C(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  integer :: ldb, ldc

5.4.4. cusparseZcsrmm

CSRMM 执行矩阵-矩阵运算 C := alpha*op( A ) * B + beta*C 之一,其中 op( A ) 是 op( A ) = A 或 op( A ) = A**T 之一,alpha 和 beta 是标量。A 是一个 m x k 稀疏矩阵,通过三个数组 csrValA、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。B 和 C 是稠密矩阵。

此函数已在 CUDA 11.0 中移除。应将其替换为对 cusparseSpMM 的调用

integer(4) function cusparseZcsrmm(handle, transA, m, n, k, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, B, ldb, beta, C, ldc)
  type(cusparseHandle) :: handle
  integer :: transA, m, n, k, nnz
  complex(8), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValA(*), B(*), C(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  integer :: ldb, ldc

5.4.5. cusparseScsrmm2

CSRMM2 执行矩阵-矩阵运算 C := alpha*op( A ) * op( B ) + beta*C 之一,其中 op( A ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量。A 是一个 m x k 稀疏矩阵,通过三个数组 csrValA、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。B 和 C 是稠密矩阵。

此函数已在 CUDA 11.0 中移除。应将其替换为对 cusparseSpMM 的调用

integer(4) function cusparseScsrmm2(handle, transA, transB, m, n, k, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, B, ldb, beta, C, ldc)
  type(cusparseHandle) :: handle
  integer :: transA, transB, m, n, k, nnz
  real(4), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValA(*), B(*), C(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  integer :: ldb, ldc

5.4.6. cusparseDcsrmm2

CSRMM2 执行矩阵-矩阵运算 C := alpha*op( A ) * op( B ) + beta*C 之一,其中 op( A ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量。A 是一个 m x k 稀疏矩阵,通过三个数组 csrValA、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。B 和 C 是稠密矩阵。

此函数已在 CUDA 11.0 中移除。应将其替换为对 cusparseSpMM 的调用

integer(4) function cusparseDcsrmm2(handle, transA, transB, m, n, k, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, B, ldb, beta, C, ldc)
  type(cusparseHandle) :: handle
  integer :: transA, transB, m, n, k, nnz
  real(8), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValA(*), B(*), C(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  integer :: ldb, ldc

5.4.7. cusparseCcsrmm2

CSRMM2 执行矩阵-矩阵运算 C := alpha*op( A ) * op( B ) + beta*C 之一,其中 op( A ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量。A 是一个 m x k 稀疏矩阵,通过三个数组 csrValA、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。B 和 C 是稠密矩阵。

此函数已在 CUDA 11.0 中移除。应将其替换为对 cusparseSpMM 的调用

integer(4) function cusparseCcsrmm2(handle, transA, transB, m, n, k, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, B, ldb, beta, C, ldc)
  type(cusparseHandle) :: handle
  integer :: transA, transB, m, n, k, nnz
  complex(4), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValA(*), B(*), C(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  integer :: ldb, ldc

5.4.8. cusparseZcsrmm2

CSRMM2 执行矩阵-矩阵运算 C := alpha*op( A ) * op( B ) + beta*C 之一,其中 op( A ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量。A 是一个 m x k 稀疏矩阵,通过三个数组 csrValA、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。B 和 C 是稠密矩阵。

此函数已在 CUDA 11.0 中移除。应将其替换为对 cusparseSpMM 的调用

integer(4) function cusparseZcsrmm2(handle, transA, transB, m, n, k, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, B, ldb, beta, C, ldc)
  type(cusparseHandle) :: handle
  integer :: transA, transB, m, n, k, nnz
  complex(8), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValA(*), B(*), C(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  integer :: ldb, ldc

5.4.9. cusparseScsrsm_analysis

此函数执行 csrsm 的分析阶段。

integer(4) function cusparseScsrsm_analysis(handle, transA, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info)
  type(cusparseHandle) :: handle
  integer(4) :: transA, m, nnz
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseSolveAnalysisInfo) :: info

5.4.10. cusparseDcsrsm_analysis

此函数执行 csrsm 的分析阶段。

integer(4) function cusparseDcsrsm_analysis(handle, transA, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info)
  type(cusparseHandle) :: handle
  integer(4) :: transA, m, nnz
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseSolveAnalysisInfo) :: info

5.4.11. cusparseCcsrsm_analysis

此函数执行 csrsm 的分析阶段。

integer(4) function cusparseCcsrsm_analysis(handle, transA, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info)
  type(cusparseHandle) :: handle
  integer(4) :: transA, m, nnz
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseSolveAnalysisInfo) :: info

5.4.12. cusparseZcsrsm_analysis

此函数执行 csrsm 的分析阶段。

integer(4) function cusparseZcsrsm_analysis(handle, transA, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info)
  type(cusparseHandle) :: handle
  integer(4) :: transA, m, nnz
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseSolveAnalysisInfo) :: info

5.4.13. cusparseScsrsm_solve

此函数执行 csrsm 的求解阶段。

integer(4) function cusparseScsrsm_solve(handle, transA, m, n, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, info, X, ldx, Y, ldy)
  type(cusparseHandle) :: handle
  integer :: transA, m, n
  real(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseSolveAnalysisInfo) :: info
  real(4), device :: X(*), Y(*)
  integer :: ldx, ldy

5.4.14. cusparseDcsrsm_solve

此函数执行 csrsm 的求解阶段。

integer(4) function cusparseDcsrsm_solve(handle, transA, m, n, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, info, X, ldx, Y, ldy)
  type(cusparseHandle) :: handle
  integer :: transA, m, n
  real(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseSolveAnalysisInfo) :: info
  real(8), device :: X(*), Y(*)
  integer :: ldx, ldy

5.4.15. cusparseCcsrsm_solve

此函数执行 csrsm 的求解阶段。

integer(4) function cusparseCcsrsm_solve(handle, transA, m, n, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, info, X, ldx, Y, ldy)
  type(cusparseHandle) :: handle
  integer :: transA, m, n
  complex(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseSolveAnalysisInfo) :: info
  complex(4), device :: X(*), Y(*)
  integer :: ldx, ldy

5.4.16. cusparseZcsrsm_solve

此函数执行 csrsm 的求解阶段。

integer(4) function cusparseZcsrsm_solve(handle, transA, m, n, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, info, X, ldx, Y, ldy)
  type(cusparseHandle) :: handle
  integer :: transA, m, n
  complex(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseSolveAnalysisInfo) :: info
  complex(8), device :: X(*), Y(*)
  integer :: ldx, ldy

5.4.17. cusparseScsrsm2_bufferSizeExt

此函数计算 cusparseScsrsm2 例程所需的工作缓冲区大小。

integer(4) function cusparseScsrsm2_bufferSizeExt(handle, algo, transA, transB, m, nrhs, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, B, ldb, info, policy, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: algo, transA, transB, m, nrhs, nnz, ldb, policy
  real(4) :: alpha ! host or device variable
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  real(4), device :: B(ldb,*)
  type(cusparseCsrsm2Info) :: info
  integer(8) :: pBufferSize

5.4.18. cusparseDcsrsm2_bufferSizeExt

此函数计算 cusparseDcsrsm2 例程所需的工作缓冲区大小。

integer(4) function cusparseDcsrsm2_bufferSizeExt(handle, algo, transA, transB, m, nrhs, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, B, ldb, info, policy, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: algo, transA, transB, m, nrhs, nnz, ldb, policy
  real(8) :: alpha ! host or device variable
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  real(8), device :: B(ldb,*)
  type(cusparseCsrsm2Info) :: info
  integer(8) :: pBufferSize

5.4.19. cusparseCcsrsm2_bufferSizeExt

此函数计算 cusparseCcsrsm2 例程所需的工作缓冲区大小。

integer(4) function cusparseCcsrsm2_bufferSizeExt(handle, algo, transA, transB, m, nrhs, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, B, ldb, info, policy, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: algo, transA, transB, m, nrhs, nnz, ldb, policy
  complex(4) :: alpha ! host or device variable
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  complex(4), device :: B(ldb,*)
  type(cusparseCsrsm2Info) :: info
  integer(8) :: pBufferSize

5.4.20. cusparseZcsrsm2_bufferSizeExt

此函数计算 cusparseZcsrsm2 例程所需的工作缓冲区大小。

integer(4) function cusparseZcsrsm2_bufferSizeExt(handle, algo, transA, transB, m, nrhs, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, B, ldb, info, policy, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: algo, transA, transB, m, nrhs, nnz, ldb, policy
  complex(8) :: alpha ! host or device variable
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  complex(8), device :: B(ldb,*)
  type(cusparseCsrsm2Info) :: info
  integer(8) :: pBufferSize

5.4.21. cusparseScsrsm2_analysis

此函数执行 csrsm 的分析阶段。

integer(4) function cusparseScsrsm2_analysis(handle, algo, transA, transB, m, nrhs, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, B, ldb, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: algo, transA, transB, m, nrhs, nnz, ldb, policy
  real(4) :: alpha ! host or device variable
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  real(4), device :: B(ldb,*)
  type(cusparseCsrsm2Info) :: info
  integer(1), device :: pBuffer ! Any data type

5.4.22. cusparseDcsrsm2_analysis

此函数执行 csrsm 的分析阶段。

integer(4) function cusparseDcsrsm2_analysis(handle, algo, transA, transB, m, nrhs, nnz, alpha, descrA, &
           csrValA, csrRowPtrA, csrColIndA, B, ldb, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: algo, transA, transB, m, nrhs, nnz, ldb, policy
  real(8) :: alpha ! host or device variable
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  real(8), device :: B(ldb,*)
  type(cusparseCsrsm2Info) :: info
  integer(1), device :: pBuffer ! Any data type

5.4.23. cusparseCcsrsm2_analysis

此函数执行 csrsm 的分析阶段。

integer(4) function cusparseCcsrsm2_analysis(handle, algo, transA, transB, m, nrhs, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, B, ldb, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: algo, transA, transB, m, nrhs, nnz, ldb, policy
  complex(4) :: alpha ! host or device variable
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  complex(4), device :: B(ldb,*)
  type(cusparseCsrsm2Info) :: info
  integer(1), device :: pBuffer ! Any data type

5.4.24. cusparseZcsrsm2_analysis

此函数执行 csrsm 的分析阶段。

integer(4) function cusparseZcsrsm2_analysis(handle, algo, transA, transB, m, nrhs, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, B, ldb, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: algo, transA, transB, m, nrhs, nnz, ldb, policy
  complex(8) :: alpha ! host or device variable
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  complex(8), device :: B(ldb,*)
  type(cusparseCsrsm2Info) :: info
  integer(1), device :: pBuffer ! Any data type

5.4.25. cusparseScsrsm2_solve

此函数执行 csrsm2 的求解阶段,求解稀疏三角线性系统 op(A) * op(X) = alpha * op(B)。A 是 CSR 存储格式的 m x m 稀疏矩阵;B 和 X 是右手侧矩阵和解矩阵,B 被 X 覆盖。

integer(4) function cusparseScsrsm2_solve(handle, algo, transA, transB, m, nrhs, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, B, ldb, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: algo, transA, transB, m, nrhs, nnz, ldb, policy
  real(4) :: alpha ! host or device variable
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  real(4), device :: B(ldb,*)
  type(cusparseCsrsm2Info) :: info
  integer(1), device :: pBuffer ! Any data type

5.4.26. cusparseDcsrsm2_solve

此函数执行 csrsm2 的求解阶段,求解稀疏三角线性系统 op(A) * op(X) = alpha * op(B)。A 是 CSR 存储格式的 m x m 稀疏矩阵;B 和 X 是右手侧矩阵和解矩阵,B 被 X 覆盖。

integer(4) function cusparseDcsrsm2_solve(handle, algo, transA, transB, m, nrhs, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, B, ldb, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: algo, transA, transB, m, nrhs, nnz, ldb, policy
  real(8) :: alpha ! host or device variable
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  real(8), device :: B(ldb,*)
  type(cusparseCsrsm2Info) :: info
  integer(1), device :: pBuffer ! Any data type

5.4.27. cusparseCcsrsm2_solve

此函数执行 csrsm2 的求解阶段,求解稀疏三角线性系统 op(A) * op(X) = alpha * op(B)。A 是 CSR 存储格式的 m x m 稀疏矩阵;B 和 X 是右手侧矩阵和解矩阵,B 被 X 覆盖。

integer(4) function cusparseCcsrsm2_solve(handle, algo, transA, transB, m, nrhs, nnz, alpha, descrA, csrValA, csrRowPtrA, csrColIndA, B, ldb, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: algo, transA, transB, m, nrhs, nnz, ldb, policy
  complex(4) :: alpha ! host or device variable
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  complex(4), device :: B(ldb,*)
  type(cusparseCsrsm2Info) :: info
  integer(1), device :: pBuffer ! Any data type

5.4.28. cusparseZcsrsm2_solve

此函数执行 csrsm2 的求解阶段,求解稀疏三角线性系统 op(A) * op(X) = alpha * op(B)。A 是 CSR 存储格式的 m x m 稀疏矩阵;B 和 X 是右手侧矩阵和解矩阵,B 被 X 覆盖。

integer(4) function cusparseZcsrsm2_solve(handle, algo, transA, transB, m, nrhs, nnz, alpha, &
           descrA, csrValA, csrRowPtrA, csrColIndA, B, ldb, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: algo, transA, transB, m, nrhs, nnz, ldb, policy
  complex(8) :: alpha ! host or device variable
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  complex(8), device :: B(ldb,*)
  type(cusparseCsrsm2Info) :: info
  integer(1), device :: pBuffer ! Any data type

5.4.29. cusparseXcsrsm2_zeroPivot

当 A(j,j) 是结构零或数值零时,此函数返回等于 CUSPARSE_STATUS_ZERO_PIVOT 的错误代码,并将 position 设置为 j。否则,position 将设置为 -1。

integer(4) function cusparseXcsrsm2_zeroPivot(handle, info, position)
  type(cusparseHandle) :: handle
  type(cusparseCsrsm2Info) :: info
  integer(4), device :: position ! device or host variable

5.4.30. cusparseSbsrmm

BSRMM 执行矩阵-矩阵运算 C := alpha*op( A ) * op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量。A 是一个 mb x kb 稀疏矩阵,通过三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 以 BSR 存储格式定义。B 和 C 是稠密矩阵。

integer(4) function cusparseSbsrmm(handle, dirA, transA, transB, mb, n, kb, nnzb, alpha, &
           descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, B, ldb, beta, C, ldc)
  type(cusparseHandle) :: handle
  integer :: dirA, transA, transB, mb, n, kb, nnzb, blockDim
  real(4), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr) :: descrA
  real(4), device :: bsrValA(*), B(*), C(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer :: ldb, ldc

5.4.31. cusparseDbsrmm

BSRMM 执行矩阵-矩阵运算 C := alpha*op( A ) * op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量。A 是一个 mb x kb 稀疏矩阵,通过三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 以 BSR 存储格式定义。B 和 C 是稠密矩阵。

integer(4) function cusparseDbsrmm(handle, dirA, transA, transB, mb, n, kb, nnzb, alpha, &
           descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, B, ldb, beta, C, ldc)
  type(cusparseHandle) :: handle
  integer :: dirA, transA, transB, mb, n, kb, nnzb, blockDim
  real(8), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr) :: descrA
  real(8), device :: bsrValA(*), B(*), C(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer :: ldb, ldc

5.4.32. cusparseCbsrmm

BSRMM 执行矩阵-矩阵运算 C := alpha*op( A ) * op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量。A 是一个 mb x kb 稀疏矩阵,通过三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 以 BSR 存储格式定义。B 和 C 是稠密矩阵。

integer(4) function cusparseCbsrmm(handle, dirA, transA, transB, mb, n, kb, nnzb, alpha, &
           descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, B, ldb, beta, C, ldc)
  type(cusparseHandle) :: handle
  integer :: dirA, transA, transB, mb, n, kb, nnzb, blockDim
  complex(4), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr) :: descrA
  complex(4), device :: bsrValA(*), B(*), C(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer :: ldb, ldc

5.4.33. cusparseZbsrmm

BSRMM 执行矩阵-矩阵运算 C := alpha*op( A ) * op( B ) + beta*C 之一,其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,alpha 和 beta 是标量。A 是一个 mb x kb 稀疏矩阵,通过三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 以 BSR 存储格式定义。B 和 C 是稠密矩阵。

integer(4) function cusparseZbsrmm(handle, dirA, transA, transB, mb, n, kb, nnzb, alpha, &
           descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, B, ldb, beta, C, ldc)
  type(cusparseHandle) :: handle
  integer :: dirA, transA, transB, mb, n, kb, nnzb, blockDim
  complex(8), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr) :: descrA
  complex(8), device :: bsrValA(*), B(*), C(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer :: ldb, ldc

5.4.34. cusparseSbsrsm2_bufferSize

此函数返回 bsrsm2 中使用的缓冲区大小。

integer(4) function cusparseSbsrsm2_bufferSize(handle, dirA, transA, transX, mb, n, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, transA, transX, mb, n, nnzb, blockDim
  type(cusparseMatDescr) :: descrA
  real(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  type(cusparseBsrsm2Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.4.35. cusparseDbsrsm2_bufferSize

此函数返回 bsrsm2 中使用的缓冲区大小。

integer(4) function cusparseDbsrsm2_bufferSize(handle, dirA, transA, transX, mb, n, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, transA, transX, mb, n, nnzb, blockDim
  type(cusparseMatDescr) :: descrA
  real(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  type(cusparseBsrsm2Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.4.36. cusparseCbsrsm2_bufferSize

此函数返回 bsrsm2 中使用的缓冲区大小。

integer(4) function cusparseCbsrsm2_bufferSize(handle, dirA, transA, transX, mb, n, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, transA, transX, mb, n, nnzb, blockDim
  type(cusparseMatDescr) :: descrA
  complex(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  type(cusparseBsrsm2Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.4.37. cusparseZbsrsm2_bufferSize

此函数返回 bsrsm2 中使用的缓冲区大小。

integer(4) function cusparseZbsrsm2_bufferSize(handle, dirA, transA, transX, mb, n, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, transA, transX, mb, n, nnzb, blockDim
  type(cusparseMatDescr) :: descrA
  complex(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  type(cusparseBsrsm2Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.4.38. cusparseSbsrsm2_analysis

此函数执行 bsrsm2 的分析阶段。

integer(4) function cusparseSbsrsm2_analysis(handle, dirA, transA, transX, mb, n, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, transA, transX, mb, n, nnzb, blockDim
  type(cusparseMatDescr) :: descrA
  real(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  type(cusparseBsrsm2Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.4.39. cusparseDbsrsm2_analysis

此函数执行 bsrsm2 的分析阶段。

integer(4) function cusparseDbsrsm2_analysis(handle, dirA, transA, transX, mb, n, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, transA, transX, mb, n, nnzb, blockDim
  type(cusparseMatDescr) :: descrA
  real(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  type(cusparseBsrsm2Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.4.40. cusparseCbsrsm2_analysis

此函数执行 bsrsm2 的分析阶段。

integer(4) function cusparseCbsrsm2_analysis(handle, dirA, transA, transX, mb, n, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, transA, transX, mb, n, nnzb, blockDim
  type(cusparseMatDescr) :: descrA
  complex(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  type(cusparseBsrsm2Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.4.41. cusparseZbsrsm2_analysis

此函数执行 bsrsm2 的分析阶段。

integer(4) function cusparseZbsrsm2_analysis(handle, dirA, transA, transX, mb, n, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, transA, transX, mb, n, nnzb, blockDim
  type(cusparseMatDescr) :: descrA
  complex(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  type(cusparseBsrsm2Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.4.42. cusparseSbsrsm2_solve

此函数执行 bsrsm2 的求解阶段。

integer(4) function cusparseSbsrsm2_solve(handle, dirA, transA, transX, mb, n, nnzb, alpha, &
           descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, x, ldx, y, ldy, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer :: dirA, transA, transX, mb, n, nnzb
  real(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descrA
  real(4), device :: bsrValA(*), x(*), y(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer :: blockDim, policy, ldx, ldy
  type(cusparseBsrsm2Info) :: info
  character, device :: pBuffer(*)

5.4.43. cusparseDbsrsm2_solve

此函数执行 bsrsm2 的求解阶段。

integer(4) function cusparseDbsrsm2_solve(handle, dirA, transA, transX, mb, n, nnzb, alpha, &
           descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, x, ldx, y, ldy, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer :: dirA, transA, transX, mb, n, nnzb
  real(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descrA
  real(8), device :: bsrValA(*), x(*), y(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer :: blockDim, policy, ldx, ldy
  type(cusparseBsrsm2Info) :: info
  character, device :: pBuffer(*)

5.4.44. cusparseCbsrsm2_solve

此函数执行 bsrsm2 的求解阶段。

integer(4) function cusparseCbsrsm2_solve(handle, dirA, transA, transX, mb, n, nnzb, alpha, &
           descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, x, ldx, y, ldy, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer :: dirA, transA, transX, mb, n, nnzb
  complex(4), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descrA
  complex(4), device :: bsrValA(*), x(*), y(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer :: blockDim, policy, ldx, ldy
  type(cusparseBsrsm2Info) :: info
  character, device :: pBuffer(*)

5.4.45. cusparseZbsrsm2_solve

此函数执行 bsrsm2 的求解阶段。

integer(4) function cusparseZbsrsm2_solve(handle, dirA, transA, transX, mb, n, nnzb, alpha, &
           descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, x, ldx, y, ldy, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer :: dirA, transA, transX, mb, n, nnzb
  complex(8), device :: alpha ! device or host variable
  type(cusparseMatDescr) :: descrA
  complex(8), device :: bsrValA(*), x(*), y(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer :: blockDim, policy, ldx, ldy
  type(cusparseBsrsm2Info) :: info
  character, device :: pBuffer(*)

5.4.46. cusparseXbsrsm2_zeroPivot

当 A(j,j) 是结构零或数值零时,此函数返回等于 CUSPARSE_STATUS_ZERO_PIVOT 的错误代码,并将 position 设置为 j。否则,position 将设置为 -1。

integer(4) function cusparseXbsrsm2_zeroPivot(handle, info, position)
  type(cusparseHandle) :: handle
  type(cusparseBsrsm2Info) :: info
  integer(4), device :: position ! device or host variable

5.4.47. cusparseSgemmi

GEMMI 执行矩阵-矩阵运算 C := alpha*A*B + beta*C,其中 alpha 和 beta 是标量,A 是 m x k 稠密矩阵,B 是 k x n 稀疏矩阵,C 是 m x n 稠密矩阵。Fortran 程序员应注意,此函数仅对 B 使用从零开始的索引。

此函数已弃用,将在未来的版本中移除。建议改用 cusparseSpMM。

integer(4) function cusparseSgemmi(handle, m, n, k, nnz, alpha, &
           A, lda, cscValB, cscColPtrB, cscRowIndB, beta, C, ldc)
  type(cusparseHandle) :: handle
  integer :: m, n, k, nnz, lda, ldc
  real(4), device :: alpha, beta ! device or host variable
  real(4), device :: A(lda,*)
  real(4), device :: cscValB(*)
  real(4), device :: C(ldc,*)
  integer(4), device :: cscColPtrB(*), cscRowIndB(*)

5.4.48. cusparseDgemmi

GEMMI 执行矩阵-矩阵运算 C := alpha*A*B + beta*C,其中 alpha 和 beta 是标量,A 是 m x k 稠密矩阵,B 是 k x n 稀疏矩阵,C 是 m x n 稠密矩阵。Fortran 程序员应注意,此函数仅对 B 使用从零开始的索引。

此函数已弃用,将在未来的版本中移除。建议改用 cusparseSpMM。

integer(4) function cusparseDgemmi(handle, m, n, k, nnz, alpha, &
           A, lda, cscValB, cscColPtrB, cscRowIndB, beta, C, ldc)
  type(cusparseHandle) :: handle
  integer :: m, n, k, nnz, lda, ldc
  real(8), device :: alpha, beta ! device or host variable
  real(8), device :: A(lda,*)
  real(8), device :: cscValB(*)
  real(8), device :: C(ldc,*)
  integer(4), device :: cscColPtrB(*), cscRowIndB(*)

5.4.49. cusparseCgemmi

GEMMI 执行矩阵-矩阵运算 C := alpha*A*B + beta*C,其中 alpha 和 beta 是标量,A 是 m x k 稠密矩阵,B 是 k x n 稀疏矩阵,C 是 m x n 稠密矩阵。Fortran 程序员应注意,此函数仅对 B 使用从零开始的索引。

此函数已弃用,将在未来的版本中移除。建议改用 cusparseSpMM。

integer(4) function cusparseCgemmi(handle, m, n, k, nnz, alpha, &
           A, lda, cscValB, cscColPtrB, cscRowIndB, beta, C, ldc)
  type(cusparseHandle) :: handle
  integer :: m, n, k, nnz, lda, ldc
  complex(4), device :: alpha, beta ! device or host variable
  complex(4), device :: A(lda,*)
  complex(4), device :: cscValB(*)
  complex(4), device :: C(ldc,*)
  integer(4), device :: cscColPtrB(*), cscRowIndB(*)

5.4.50. cusparseZgemmi

GEMMI 执行矩阵-矩阵运算 C := alpha*A*B + beta*C,其中 alpha 和 beta 是标量,A 是 m x k 稠密矩阵,B 是 k x n 稀疏矩阵,C 是 m x n 稠密矩阵。Fortran 程序员应注意,此函数仅对 B 使用从零开始的索引。

此函数已弃用,将在未来的版本中移除。建议改用 cusparseSpMM。

integer(4) function cusparseZgemmi(handle, m, n, k, nnz, alpha, &
           A, lda, cscValB, cscColPtrB, cscRowIndB, beta, C, ldc)
  type(cusparseHandle) :: handle
  integer :: m, n, k, nnz, lda, ldc
  complex(8), device :: alpha, beta ! device or host variable
  complex(8), device :: A(lda,*)
  complex(8), device :: cscValB(*)
  complex(8), device :: C(ldc,*)
  integer(4), device :: cscColPtrB(*), cscRowIndB(*)

5.5. CUSPARSE 扩展函数

本节包含用于操作稀疏矩阵的扩展函数的接口。

5.5.1. cusparseXcsrgeamNnz

cusparseXcsrgeamNnz 计算 CSRGEAM 将生成的非零元素的数量。

此函数已在 CUDA 11.0 中移除。应将其替换为 cusparseXcsrgeam2Nnz

integer(4) function cusparseXcsrgeamNnz(handle, m, n, descrA, nnzA, csrRowPtrA, csrColIndA, descrB, nnzB, csrRowPtrB, csrColIndB, descrC, csrRowPtrC, nnzTotalDevHostPtr)
  type(cusparseHandle) :: handle
  integer :: m, n, nnzA, nnzB
  type(cusparseMatDescr) :: descrA, descrB, descrC
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrC(*)
  integer(4), device :: nnzTotalDevHostPtr ! device or host variable

5.5.2. cusparseScsrgeam

CSRGEAM 执行矩阵-矩阵运算 C := alpha * A + beta * B,alpha 和 beta 是标量。A、B 和 C 是 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C}、csrRowPtr{A|B|C} 和 csrColInd{A|B|C} 以 CSR 存储格式定义。应使用 cusparseXcsrgeamNnz 来确定 csrRowPtrC 和结果中非零元素的数量。

此函数已在 CUDA 11.0 中移除。应将其替换为 cusparseScsrgeam2 例程

integer(4) function cusparseScsrgeam(handle, m, n, &
           alpha, descrA, nnzA, csrValA, csrRowPtrA, csrColIndA, &
           beta, descrB, nnzB, csrValB, csrRowPtrB, csrColIndB, descrC, csrValC, csrRowPtrC, csrColIndC)
  type(cusparseHandle) :: handle
  integer :: m, n, nnzA, nnzB
  real(4), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr):: descrA, descrB, descrC
  real(4), device :: csrValA(*), csrValB(*), csrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrC(*), csrColIndC(*)

5.5.3. cusparseDcsrgeam

CSRGEAM 执行矩阵-矩阵运算 C := alpha * A + beta * B,alpha 和 beta 是标量。A、B 和 C 是 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C}、csrRowPtr{A|B|C} 和 csrColInd{A|B|C} 以 CSR 存储格式定义。应使用 cusparseXcsrgeamNnz 来确定 csrRowPtrC 和结果中非零元素的数量。

此函数已在 CUDA 11.0 中移除。应将其替换为 cusparseDcsrgeam2 例程

integer(4) function cusparseDcsrgeam(handle, m, n, &
           alpha, descrA, nnzA, csrValA, csrRowPtrA, csrColIndA, &
           beta, descrB, nnzB, csrValB, csrRowPtrB, csrColIndB, descrC, csrValC, csrRowPtrC, csrColIndC)
  type(cusparseHandle) :: handle
  integer :: m, n, nnzA, nnzB
  real(8), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr):: descrA, descrB, descrC
  real(8), device :: csrValA(*), csrValB(*), csrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrC(*), csrColIndC(*)

5.5.4. cusparseCcsrgeam

CSRGEAM 执行矩阵-矩阵运算 C := alpha * A + beta * B,alpha 和 beta 是标量。A、B 和 C 是 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C}、csrRowPtr{A|B|C} 和 csrColInd{A|B|C} 以 CSR 存储格式定义。应使用 cusparseXcsrgeamNnz 来确定 csrRowPtrC 和结果中非零元素的数量。

此函数已在 CUDA 11.0 中移除。应将其替换为 cusparseCcsrgeam2 例程

integer(4) function cusparseCcsrgeam(handle, m, n, &
        alpha, descrA, nnzA, csrValA, csrRowPtrA, csrColIndA, &
        beta, descrB, nnzB, csrValB, csrRowPtrB, csrColIndB, descrC, csrValC, csrRowPtrC, csrColIndC)
  type(cusparseHandle) :: handle
  integer :: m, n, nnzA, nnzB
  complex(4), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr):: descrA, descrB, descrC
  complex(4), device :: csrValA(*), csrValB(*), csrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrC(*), csrColIndC(*)

5.5.5. cusparseZcsrgeam

CSRGEAM 执行矩阵-矩阵运算 C := alpha * A + beta * B,alpha 和 beta 是标量。A、B 和 C 是 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C}、csrRowPtr{A|B|C} 和 csrColInd{A|B|C} 以 CSR 存储格式定义。应使用 cusparseXcsrgeamNnz 来确定 csrRowPtrC 和结果中非零元素的数量。

此函数已在 CUDA 11.0 中移除。应将其替换为 cusparseZcsrgeam2 例程

integer(4) function cusparseZcsrgeam(handle, m, n, alpha, descrA, nnzA, csrValA, csrRowPtrA, csrColIndA, &
           beta, descrB, nnzB, csrValB, csrRowPtrB, csrColIndB, descrC, csrValC, csrRowPtrC, csrColIndC)
  type(cusparseHandle) :: handle
  integer :: m, n, nnzA, nnzB
  complex(8), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr):: descrA, descrB, descrC
  complex(8), device :: csrValA(*), csrValB(*), csrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrC(*), csrColIndC(*)

5.5.6. cusparseScsrgeam2_bufferSizeExt

此函数确定 cusparseScsrgeam2 的工作缓冲区大小。CSRGEAM2 执行矩阵-矩阵运算 C := alpha * A + beta * B,alpha 和 beta 是标量。A、B 和 C 是 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C}、csrRowPtr{A|B|C} 和 csrColInd{A|B|C} 以 CSR 存储格式定义。应使用 cusparseXcsrgeam2Nnz 来确定 csrRowPtrC 和结果中非零元素的数量。

integer(4) function cusparseScsrgeam2_bufferSizeExt(handle, m, n, alpha, descrA, nnzA, csrValA, csrRowPtrA, csrColIndA, &
           beta, descrB, nnzB, csrValB, csrRowPtrB, csrColIndB, descrC, csrValC, csrRowPtrC, csrColIndC, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer :: m, n, nnzA, nnzB
  real(4), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr):: descrA, descrB, descrC
  real(4), device :: csrValA(*), csrValB(*), csrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrC(*), csrColIndC(*)
  integer(8) :: pBufferSizeInBytes

5.5.7. cusparseDcsrgeam2_bufferSizeExt

此函数确定 cusparseDcsrgeam2 的工作缓冲区大小。CSRGEAM2 执行矩阵-矩阵运算 C := alpha * A + beta * B,alpha 和 beta 是标量。A、B 和 C 是 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C}、csrRowPtr{A|B|C} 和 csrColInd{A|B|C} 以 CSR 存储格式定义。应使用 cusparseXcsrgeam2Nnz 来确定 csrRowPtrC 和结果中非零元素的数量。

integer(4) function cusparseDcsrgeam2_bufferSizeExt(handle, m, n, alpha, &
           descrA, nnzA, csrValA, csrRowPtrA, csrColIndA, beta, descrB, nnzB, &
           csrValB, csrRowPtrB, csrColIndB, descrC, csrValC, csrRowPtrC, csrColIndC, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer :: m, n, nnzA, nnzB
  real(8), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr):: descrA, descrB, descrC
  real(8), device :: csrValA(*), csrValB(*), csrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrC(*), csrColIndC(*)
  integer(8) :: pBufferSizeInBytes

5.5.8. cusparseCcsrgeam2_bufferSizeExt

此函数确定 cusparseCcsrgeam2 的工作缓冲区大小。CSRGEAM2 执行矩阵-矩阵运算 C := alpha * A + beta * B,alpha 和 beta 是标量。A、B 和 C 是 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C}、csrRowPtr{A|B|C} 和 csrColInd{A|B|C} 以 CSR 存储格式定义。应使用 cusparseXcsrgeam2Nnz 来确定 csrRowPtrC 和结果中非零元素的数量。

integer(4) function cusparseCcsrgeam2_bufferSizeExt(handle, m, n, alpha, &
           descrA, nnzA, csrValA, csrRowPtrA, csrColIndA, beta, descrB, nnzB, &
           csrValB, csrRowPtrB, csrColIndB, descrC, csrValC, csrRowPtrC, csrColIndC, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer :: m, n, nnzA, nnzB
  complex(4), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr):: descrA, descrB, descrC
  complex(4), device :: csrValA(*), csrValB(*), csrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrC(*), csrColIndC(*)
  integer(8) :: pBufferSizeInBytes

5.5.9. cusparseZcsrgeam2_bufferSizeExt

此函数确定 cusparseZcsrgeam2 的工作缓冲区大小。CSRGEAM2 执行矩阵-矩阵运算 C := alpha * A + beta * B,alpha 和 beta 是标量。A、B 和 C 是 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C}、csrRowPtr{A|B|C} 和 csrColInd{A|B|C} 以 CSR 存储格式定义。应使用 cusparseXcsrgeam2Nnz 来确定 csrRowPtrC 和结果中非零元素的数量。

integer(4) function cusparseZcsrgeam2_bufferSizeExt(handle, m, n, alpha, descrA, &
           nnzA, csrValA, csrRowPtrA, csrColIndA, beta, descrB, nnzB, csrValB, &
           csrRowPtrB, csrColIndB, descrC, csrValC, csrRowPtrC, csrColIndC, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer :: m, n, nnzA, nnzB
  complex(8), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr):: descrA, descrB, descrC
  complex(8), device :: csrValA(*), csrValB(*), csrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrC(*), csrColIndC(*)
  integer(8) :: pBufferSizeInBytes

5.5.10. cusparseXcsrgeam2Nnz

cusparseXcsrgeam2Nnz 计算 CSRGEAM2 将生成的非零元素的数量。

integer(4) function cusparseXcsrgeam2Nnz(handle, m, n, descrA, nnzA, csrRowPtrA, csrColIndA, &
           descrB, nnzB, csrRowPtrB, csrColIndB, descrC, csrRowPtrC, nnzTotalDevHostPtr, pBuffer)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA, descrB, descrC
  integer(4) :: m, n, nnzA, nnzB
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrC(*)
  integer(c_int) :: nnzTotalDevHostPtr
  character(c_char), device :: pBuffer(*)

5.5.11. cusparseScsrgeam2

CSRGEAM2 执行矩阵-矩阵运算 C := alpha * A + beta * B,alpha 和 beta 是标量。A、B 和 C 是 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C}、csrRowPtr{A|B|C} 和 csrColInd{A|B|C} 以 CSR 存储格式定义。应使用 cusparseXcsrgeam2Nnz 来确定 csrRowPtrC 和结果中非零元素的数量。

integer(4) function cusparseCcsrgeam2(handle, m, n, alpha, descrA, nnzA, csrValA, csrRowPtrA, &
           csrColIndA, beta, descrB, nnzB, csrValB, csrRowPtrB, csrColIndB, descrC, csrValC, csrRowPtrC, csrColIndC, pBuffer)
  type(cusparseHandle) :: handle
  integer :: m, n, nnzA, nnzB
  real(4), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr):: descrA, descrB, descrC
  real(4), device :: csrValA(*), csrValB(*), csrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrC(*), csrColIndC(*)
  integer(1), device :: pBuffer ! can be of any type

5.5.12. cusparseDcsrgeam2

CSRGEAM2 执行矩阵-矩阵运算 C := alpha * A + beta * B,alpha 和 beta 是标量。A、B 和 C 是 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C}、csrRowPtr{A|B|C} 和 csrColInd{A|B|C} 以 CSR 存储格式定义。应使用 cusparseXcsrgeam2Nnz 来确定 csrRowPtrC 和结果中非零元素的数量。

integer(4) function cusparseCcsrgeam2(handle, m, n, alpha, descrA, nnzA, csrValA, csrRowPtrA, &
           csrColIndA, beta, descrB, nnzB, csrValB, csrRowPtrB, csrColIndB, descrC, csrValC, csrRowPtrC, csrColIndC, pBuffer)
  type(cusparseHandle) :: handle
  integer :: m, n, nnzA, nnzB
  real(8), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr):: descrA, descrB, descrC
  real(8), device :: csrValA(*), csrValB(*), csrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrC(*), csrColIndC(*)
  integer(1), device :: pBuffer ! can be of any type

5.5.13. cusparseCcsrgeam2

CSRGEAM2 执行矩阵-矩阵运算 C := alpha * A + beta * B,alpha 和 beta 是标量。A、B 和 C 是 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C}、csrRowPtr{A|B|C} 和 csrColInd{A|B|C} 以 CSR 存储格式定义。应使用 cusparseXcsrgeam2Nnz 来确定 csrRowPtrC 和结果中非零元素的数量。

integer(4) function cusparseCcsrgeam2(handle, m, n, alpha, descrA, nnzA, csrValA, csrRowPtrA, csrColIndA, &
           beta, descrB, nnzB, csrValB, csrRowPtrB, csrColIndB, descrC, csrValC, csrRowPtrC, csrColIndC, pBuffer)
  type(cusparseHandle) :: handle
  integer :: m, n, nnzA, nnzB
  complex(4), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr):: descrA, descrB, descrC
  complex(4), device :: csrValA(*), csrValB(*), csrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrC(*), csrColIndC(*)
  integer(1), device :: pBuffer ! can be of any type

5.5.14. cusparseZcsrgeam2

CSRGEAM2 执行矩阵-矩阵运算 C := alpha * A + beta * B,alpha 和 beta 是标量。A、B 和 C 是 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C}、csrRowPtr{A|B|C} 和 csrColInd{A|B|C} 以 CSR 存储格式定义。应使用 cusparseXcsrgeam2Nnz 来确定 csrRowPtrC 和结果中非零元素的数量。

integer(4) function cusparseCcsrgeam2(handle, m, n, alpha, descrA, nnzA, csrValA, csrRowPtrA, csrColIndA, &
           beta, descrB, nnzB, csrValB, csrRowPtrB, csrColIndB, descrC, csrValC, csrRowPtrC, csrColIndC, pBuffer)
  type(cusparseHandle) :: handle
  integer :: m, n, nnzA, nnzB
  complex(8), device :: alpha, beta ! device or host variable
  type(cusparseMatDescr):: descrA, descrB, descrC
  complex(8), device :: csrValA(*), csrValB(*), csrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrC(*), csrColIndC(*)
  integer(1), device :: pBuffer ! can be of any type

5.5.15. cusparseXcsrgemmNnz

cusparseXcsrgemmNnz 计算 CSRGEMM 将生成的非零元素的数量。

此函数已在 CUDA 11.0 中移除。应将其替换为 cusparseXcsrgemm2Nnz 例程

integer(4) function cusparseXcsrgemmNnz(handle, transA, transB, m, n, k, &
           descrA, nnzA, csrRowPtrA, csrColIndA, &
           descrB, nnzB, csrRowPtrB, csrColIndB, descrC, csrRowPtrC, nnzTotalDevHostPtr)
  type(cusparseHandle) :: handle
  integer :: transA, transB, m, n, k, nnzA, nnzB
  type(cusparseMatDescr) :: descrA, descrB, descrC
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrC(*)
  integer(4), device :: nnzTotalDevHostPtr ! device or host variable

5.5.16. cusparseScsrgemm

CSRGEMM 执行矩阵-矩阵运算 C := op( A ) * op( B ),其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,A、B 和 C 是 m x k、k x n 和 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C}、csrRowPtr{A|B|C} 和 csrColInd{A|B|C} 以 CSR 存储格式定义。应使用 cusparseXcsrgemmNnz 来确定 csrRowPtrC 和结果中非零元素的数量。

此函数已在 CUDA 11.0 中移除。应将其替换为 cusparseScsrgemm2 例程

integer(4) function cusparseScsrgemm(handle, transA, transB, m, n, k, &
           descrA, nnzA, csrValA, csrRowPtrA, csrColIndA, &
           descrB, nnzB, csrValB, csrRowPtrB, csrColIndB, &
           descrC, csrValC, csrRowPtrC, csrColIndC)
  type(cusparseHandle) :: handle
  integer(4) :: transA, transB, m, n, k, nnzA, nnzB
  type(cusparseMatDescr) :: descrA, descrB, descrC
  real(4), device :: csrValA(*), csrValB(*), csrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrC(*), csrColIndC(*)

5.5.17. cusparseDcsrgemm

CSRGEMM 执行矩阵-矩阵运算 C := op( A ) * op( B ),其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,A、B 和 C 是 m x k、k x n 和 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C}、csrRowPtr{A|B|C} 和 csrColInd{A|B|C} 以 CSR 存储格式定义。应使用 cusparseXcsrgemmNnz 来确定 csrRowPtrC 和结果中非零元素的数量。

此函数已在 CUDA 11.0 中移除。应将其替换为 cusparseDcsrgemm2 例程

integer(4) function cusparseDcsrgemm(handle, transA, transB, m, n, k, &
           descrA, nnzA, csrValA, csrRowPtrA, csrColIndA, &
           descrB, nnzB, csrValB, csrRowPtrB, csrColIndB, &
           descrC, csrValC, csrRowPtrC, csrColIndC)
  type(cusparseHandle) :: handle
  integer(4) :: transA, transB, m, n, k, nnzA, nnzB
  type(cusparseMatDescr) :: descrA, descrB, descrC
  real(8), device :: csrValA(*), csrValB(*), csrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrC(*), csrColIndC(*)

5.5.18. cusparseCcsrgemm

CSRGEMM 执行矩阵-矩阵运算 C := op( A ) * op( B ),其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,A、B 和 C 是 m x k、k x n 和 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C}、csrRowPtr{A|B|C} 和 csrColInd{A|B|C} 以 CSR 存储格式定义。应使用 cusparseXcsrgemmNnz 来确定 csrRowPtrC 和结果中非零元素的数量。

此函数已在 CUDA 11.0 中移除。应将其替换为 cusparseCcsrgemm2 例程

integer(4) function cusparseCcsrgemm(handle, transA, transB, m, n, k, &
           descrA, nnzA, csrValA, csrRowPtrA, csrColIndA, &
           descrB, nnzB, csrValB, csrRowPtrB, csrColIndB, &
           descrC, csrValC, csrRowPtrC, csrColIndC)
  type(cusparseHandle) :: handle
  integer(4) :: transA, transB, m, n, k, nnzA, nnzB
  type(cusparseMatDescr) :: descrA, descrB, descrC
  complex(4), device :: csrValA(*), csrValB(*), csrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrC(*), csrColIndC(*)

5.5.19. cusparseZcsrgemm

CSRGEMM 执行矩阵-矩阵运算 C := op( A ) * op( B ),其中 op( X ) 是 op( X ) = X 或 op( X ) = X**T 之一,A、B 和 C 是 m x k、k x n 和 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C}、csrRowPtr{A|B|C} 和 csrColInd{A|B|C} 以 CSR 存储格式定义。应使用 cusparseXcsrgemmNnz 来确定 csrRowPtrC 和结果中非零元素的数量。

此函数已在 CUDA 11.0 中移除。应将其替换为 cusparseZcsrgemm2 例程

integer(4) function cusparseZcsrgemm(handle, transA, transB, m, n, k, &
           descrA, nnzA, csrValA, csrRowPtrA, csrColIndA, &
           descrB, nnzB, csrValB, csrRowPtrB, csrColIndB, &
           descrC, csrValC, csrRowPtrC, csrColIndC)
  type(cusparseHandle) :: handle
  integer(4) :: transA, transB, m, n, k, nnzA, nnzB
  type(cusparseMatDescr) :: descrA, descrB, descrC
  complex(8), device :: csrValA(*), csrValB(*), csrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrC(*), csrColIndC(*)

5.5.20. cusparseScsrgemm2_bufferSizeExt

此函数返回 csrgemm2 中使用的缓冲区大小。

integer(4) function cusparseScsrgemm2_bufferSizeExt(handle, m, n, k, alpha, &
           descrA, nnzA, csrRowPtrA, csrColIndA, &
           descrB, nnzB, csrRowPtrB, csrColIndB, beta, &
           descrD, nnzD, csrRowPtrD, csrColIndD, info, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  real(4), device :: alpha, beta ! device or host variable
  integer :: m, n, k, nnzA, nnzB, nnzD
  type(cusparseMatDescr) :: descrA, descrB, descrD
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrD(*), csrColIndD(*)
  type(cusparseCsrgemm2Info) :: info
  integer(8) :: pBufferSizeInBytes

5.5.21. cusparseDcsrgemm2_bufferSizeExt

此函数返回 csrgemm2 中使用的缓冲区大小。

integer(4) function cusparseDcsrgemm2_bufferSizeExt(handle, m, n, k, alpha, &
           descrA, nnzA, csrRowPtrA, csrColIndA, &
           descrB, nnzB, csrRowPtrB, csrColIndB, beta, &
           descrD, nnzD, csrRowPtrD, csrColIndD, info, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  real(8), device :: alpha, beta ! device or host variable
  integer :: m, n, k, nnzA, nnzB, nnzD
  type(cusparseMatDescr) :: descrA, descrB, descrD
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrD(*), csrColIndD(*)
  type(cusparseCsrgemm2Info) :: info
  integer(8) :: pBufferSizeInBytes

5.5.22. cusparseCcsrgemm2_bufferSizeExt

此函数返回 csrgemm2 中使用的缓冲区大小。

integer(4) function cusparseCcsrgemm2_bufferSizeExt(handle, m, n, k, alpha, &
           descrA, nnzA, csrRowPtrA, csrColIndA, &
           descrB, nnzB, csrRowPtrB, csrColIndB, beta, &
           descrD, nnzD, csrRowPtrD, csrColIndD, info, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  complex(4), device :: alpha, beta ! device or host variable
  integer :: m, n, k, nnzA, nnzB, nnzD
  type(cusparseMatDescr) :: descrA, descrB, descrD
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrD(*), csrColIndD(*)
  type(cusparseCsrgemm2Info) :: info
  integer(8) :: pBufferSizeInBytes

5.5.23. cusparseZcsrgemm2_bufferSizeExt

此函数返回 csrgemm2 中使用的缓冲区大小。

integer(4) function cusparseZcsrgemm2_bufferSizeExt(handle, m, n, k, alpha, &
           descrA, nnzA, csrRowPtrA, csrColIndA, &
           descrB, nnzB, csrRowPtrB, csrColIndB, beta, &
           descrD, nnzD, csrRowPtrD, csrColIndD, info, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  complex(8), device :: alpha, beta ! device or host variable
  integer :: m, n, k, nnzA, nnzB, nnzD
  type(cusparseMatDescr) :: descrA, descrB, descrD
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrD(*), csrColIndD(*)
  type(cusparseCsrgemm2Info) :: info
  integer(8) :: pBufferSizeInBytes

5.5.24. cusparseXcsrgemm2Nnz

cusparseXcsrgemm2Nnz 计算 CSRGEMM2 将生成的非零元素的数量。

integer(4) function cusparseXcsrgemm2Nnz(handle, m, n, k, &
           descrA, nnzA, csrRowPtrA, csrColIndA, &
           descrB, nnzB, csrRowPtrB, csrColIndB, &
           descrD, nnzD, csrRowPtrD, csrColIndD, &
           descrC, csrRowPtrC, nnzTotalDevHostPtr, info, pBuffer)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA, descrB, descrD, descrC
  type(cusparseCsrgemm2Info) :: info
  integer(4) :: m, n, k, nnzA, nnzB, nnzD
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrD(*), csrColIndD(*), csrRowPtrC(*)
  integer(c_int) :: nnzTotalDevHostPtr
  character(c_char), device :: pBuffer(*)

5.5.25. cusparseScsrgemm2

CSRGEMM2 执行矩阵-矩阵运算 C := alpha * A * B + beta * D alpha 和 beta 是标量。A、B 和 C 是 m x k、k x n 和 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C|D}、csrRowPtr{A|B|C|D} 和 csrColInd{A|B|C|D} 以 CSR 存储格式定义。应使用 cusparseXcsrgemm2Nnz 来确定 csrRowPtrC 和结果中非零元素的数量。

integer(4) function cusparseScsrgemm2(handle, m, n, k, alpha, &
           descrA, nnzA, csrValA, csrRowPtrA, csrColIndA, &
           descrB, nnzB, csrValB, csrRowPtrB, csrColIndB, beta, &
           descrD, nnzD, csrValD, csrRowPtrD, csrColIndD, &
           descrC, csrValC, csrRowPtrC, csrColIndC, info, pBuffer)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA, descrB, descrD, descrC
  type(cusparseCsrgemm2Info) :: info
  integer :: m, n, k, nnzA, nnzB, nnzD
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrD(*), csrColIndD(*), csrRowPtrC(*), csrColIndC(*)
  real(4), device :: csrValA(*), csrValB(*), csrValD(*), csrValC(*)
  real(4), device :: alpha, beta ! device or host variable
  integer(4), device :: nnzTotalDevHostPtr ! device or host variable
  character, device :: pBuffer(*)

5.5.26. cusparseDcsrgemm2

CSRGEMM2 执行矩阵-矩阵运算 C := alpha * A * B + beta * D alpha 和 beta 是标量。A、B 和 C 是 m x k、k x n 和 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C|D}、csrRowPtr{A|B|C|D} 和 csrColInd{A|B|C|D} 以 CSR 存储格式定义。应使用 cusparseXcsrgemm2Nnz 来确定 csrRowPtrC 和结果中非零元素的数量。

integer(4) function cusparseDcsrgemm2(handle, m, n, k, alpha, &
           descrA, nnzA, csrValA, csrRowPtrA, csrColIndA, &
           descrB, nnzB, csrValB, csrRowPtrB, csrColIndB, beta, &
           descrD, nnzD, csrValD, csrRowPtrD, csrColIndD, &
           descrC, csrValC, csrRowPtrC, csrColIndC, info, pBuffer)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA, descrB, descrD, descrC
  type(cusparseCsrgemm2Info) :: info
  integer :: m, n, k, nnzA, nnzB, nnzD
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrD(*), csrColIndD(*), csrRowPtrC(*), csrColIndC(*)
  real(8), device :: csrValA(*), csrValB(*), csrValD(*), csrValC(*)
  real(8), device :: alpha, beta ! device or host variable
  integer(4), device :: nnzTotalDevHostPtr ! device or host variable
  character, device :: pBuffer(*)

5.5.27. cusparseCcsrgemm2

CSRGEMM2 执行矩阵-矩阵运算 C := alpha * A * B + beta * D alpha 和 beta 是标量。A、B 和 C 是 m x k、k x n 和 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C|D}、csrRowPtr{A|B|C|D} 和 csrColInd{A|B|C|D} 以 CSR 存储格式定义。应使用 cusparseXcsrgemm2Nnz 来确定 csrRowPtrC 和结果中非零元素的数量。

integer(4) function cusparseCcsrgemm2(handle, m, n, k, alpha, &
           descrA, nnzA, csrValA, csrRowPtrA, csrColIndA, &
           descrB, nnzB, csrValB, csrRowPtrB, csrColIndB, beta, &
           descrD, nnzD, csrValD, csrRowPtrD, csrColIndD, &
           descrC, csrValC, csrRowPtrC, csrColIndC, info, pBuffer)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA, descrB, descrD, descrC
  type(cusparseCsrgemm2Info) :: info
  integer :: m, n, k, nnzA, nnzB, nnzD
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), csrRowPtrB(*), csrColIndB(*), csrRowPtrD(*), csrColIndD(*), csrRowPtrC(*), csrColIndC(*)
  complex(4), device :: csrValA(*), csrValB(*), csrValD(*), csrValC(*)
  complex(4), device :: alpha, beta ! device or host variable
  integer(4), device :: nnzTotalDevHostPtr ! device or host variable
  character, device :: pBuffer(*)

5.5.28. cusparseZcsrgemm2

CSRGEMM2 执行矩阵-矩阵运算 C := alpha * A * B + beta * D alpha 和 beta 是标量。A、B 和 C 是 m x k、k x n 和 m x n 稀疏矩阵,通过三个数组 csrVal{A|B|C|D}、csrRowPtr{A|B|C|D} 和 csrColInd{A|B|C|D} 以 CSR 存储格式定义。应使用 cusparseXcsrgemm2Nnz 来确定 csrRowPtrC 和结果中非零元素的数量。

integer(4) function cusparseZcsrgemm2(handle, m, n, k, alpha, descrA, nnzA, csrValA, csrRowPtrA, csrColIndA, descrB, nnzB, csrValB, csrRowPtrB, csrColIndB, beta, descrD, nnzD, csrValD, csrRowPtrD, csrColIndD, descrC, csrValC, csrRowPtrC, csrColIndC, info, pBuffer)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA, descrB, descrD, descrC
  type(cusparseCsrgemm2Info) :: info
  integer :: m, n, k, nnzA, nnzB, nnzD
  integer(4), device :: csrRowPtrA(*), csrColIndA(*),   csrRowPtrB(*), csrColIndB(*),   csrRowPtrD(*), csrColIndD(*), csrRowPtrC(*), csrColIndC(*)
  complex(8), device :: csrValA(*), csrValB(*), csrValD(*), csrValC(*)
  complex(8), device :: alpha, beta ! device or host variable
  integer(4), device :: nnzTotalDevHostPtr ! device or host variable
  character, device :: pBuffer(*)

5.6. CUSPARSE 预处理函数

本节包含用于处理稀疏矩阵的预处理函数的接口。

5.6.1. cusparseScsric0

CSRIC0 计算不完全 Cholesky 分解,零填充且无旋转。A 是一个 m x n Hermitian/对称正定稀疏矩阵,通过三个数组 csrValA、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。

integer(4) function cusparseScsric0(handle, trans, m, descrA, csrValM, csrRowPtrA, csrColIndA, info)
  type(cusparseHandle) :: handle
  integer(4) :: trans, m
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValM(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseSolveAnalysisInfo) :: info

5.6.2. cusparseDcsric0

CSRIC0 计算不完全 Cholesky 分解,零填充且无旋转。A 是一个 m x n Hermitian/对称正定稀疏矩阵,通过三个数组 csrValA、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。

integer(4) function cusparseDcsric0(handle, trans, m, descrA, csrValM, csrRowPtrA, csrColIndA, info)
  type(cusparseHandle) :: handle
  integer(4) :: trans, m
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValM(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseSolveAnalysisInfo) :: info

5.6.3. cusparseCcsric0

CSRIC0 计算不完全 Cholesky 分解,零填充且无旋转。A 是一个 m x n Hermitian/对称正定稀疏矩阵,通过三个数组 csrValA、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。

integer(4) function cusparseCcsric0(handle, trans, m, descrA, csrValM, csrRowPtrA, csrColIndA, info)
  type(cusparseHandle) :: handle
  integer(4) :: trans, m
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValM(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseSolveAnalysisInfo) :: info

5.6.4. cusparseZcsric0

CSRIC0 计算不完全 Cholesky 分解,零填充且无旋转。A 是一个 m x n Hermitian/对称正定稀疏矩阵,通过三个数组 csrValA、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。

integer(4) function cusparseZcsric0(handle, trans, m, descrA, csrValM, csrRowPtrA, csrColIndA, info)
  type(cusparseHandle) :: handle
  integer(4) :: trans, m
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValM(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseSolveAnalysisInfo) :: info

5.6.5. cusparseScsrilu0

CSRILU0 计算不完全 LU 分解,零填充且无旋转。A 是一个 m x n 稀疏矩阵,通过三个数组 csrValA、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。

integer(4) function cusparseScsrilu0(handle, trans, m, descrA, csrValM, csrRowPtrA, csrColIndA, info)
  type(cusparseHandle) :: handle
  integer(4) :: trans, m
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValM(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseSolveAnalysisInfo) :: info

5.6.6. cusparseDcsrilu0

CSRILU0 计算不完全 LU 分解,零填充且无旋转。A 是一个 m x n 稀疏矩阵,通过三个数组 csrValA、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。

integer(4) function cusparseDcsrilu0(handle, trans, m, descrA, csrValM, csrRowPtrA, csrColIndA, info)
  type(cusparseHandle) :: handle
  integer(4) :: trans, m
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValM(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseSolveAnalysisInfo) :: info

5.6.7. cusparseCcsrilu0

CSRILU0 计算不完全 LU 分解,零填充且无旋转。A 是一个 m x n 稀疏矩阵,通过三个数组 csrValA、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。

integer(4) function cusparseCcsrilu0(handle, trans, m, descrA, csrValM, csrRowPtrA, csrColIndA, info)
  type(cusparseHandle) :: handle
  integer(4) :: trans, m
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValM(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseSolveAnalysisInfo) :: info

5.6.8. cusparseZcsrilu0

CSRILU0 计算不完全 LU 分解,零填充且无旋转。A 是一个 m x n 稀疏矩阵,通过三个数组 csrValA、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。

integer(4) function cusparseZcsrilu0(handle, trans, m, descrA, csrValM, csrRowPtrA, csrColIndA, info)
  type(cusparseHandle) :: handle
  integer(4) :: trans, m
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValM(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseSolveAnalysisInfo) :: info

5.6.9. cusparseSgtsv

GTSV 计算具有多个右手侧的三对角线性系统的解:A * Y = a * x。此三对角线性系统的系数矩阵 A 由三个向量定义,分别对应于其下对角线 (dl)、主对角线 (d) 和上对角线 (du);右手侧存储在稠密矩阵 X 中。解 Y 在退出时覆盖右手侧矩阵 X。

此函数已在 CUDA 11.0 中移除。它和类似的例程应替换为 cusparseSgtsv2 变体。

integer(4) function cusparseSgtsv(handle, m, n, dl, d, du, B, ldb)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  real(4), device :: dl(*), d(*), du(*), B(*)

5.6.10. cusparseDgtsv

GTSV 计算具有多个右手侧的三对角线性系统的解:A * Y = a * x。此三对角线性系统的系数矩阵 A 由三个向量定义,分别对应于其下对角线 (dl)、主对角线 (d) 和上对角线 (du);右手侧存储在稠密矩阵 X 中。解 Y 在退出时覆盖右手侧矩阵 X。

此函数已在 CUDA 11.0 中移除。它和类似的例程应替换为 cusparseDgtsv2 变体。

integer(4) function cusparseDgtsv(handle, m, n, dl, d, du, B, ldb)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  real(8), device :: dl(*), d(*), du(*), B(*)

5.6.11. cusparseCgtsv

GTSV 计算具有多个右手侧的三对角线性系统的解:A * Y = a * x。此三对角线性系统的系数矩阵 A 由三个向量定义,分别对应于其下对角线 (dl)、主对角线 (d) 和上对角线 (du);右手侧存储在稠密矩阵 X 中。解 Y 在退出时覆盖右手侧矩阵 X。

此函数已在 CUDA 11.0 中移除。它和类似的例程应替换为 cusparseCgtsv2 变体。

integer(4) function cusparseCgtsv(handle, m, n, dl, d, du, B, ldb)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  complex(4), device :: dl(*), d(*), du(*), B(*)

5.6.12. cusparseZgtsv

GTSV 计算具有多个右手侧的三对角线性系统的解:A * Y = a * x。此三对角线性系统的系数矩阵 A 由三个向量定义,分别对应于其下对角线 (dl)、主对角线 (d) 和上对角线 (du);右手侧存储在稠密矩阵 X 中。解 Y 在退出时覆盖右手侧矩阵 X。

此函数已在 CUDA 11.0 中移除。它和类似的例程应替换为 cusparseZgtsv2 变体。

integer(4) function cusparseZgtsv(handle, m, n, dl, d, du, B, ldb)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  complex(8), device :: dl(*), d(*), du(*), B(*)

5.6.13. cusparseSgtsv2_buffersize

Sgtsv2_buffersize 返回 Sgtsv2() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseSgtsv2_bufferSize(handle, m, n, dl, d, du, B, ldb, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  real(4), device :: dl(m), d(m), du(m), B(ldb,n)
  integer(8) :: pBufferSizeInBytes

5.6.14. cusparseDgtsv2_buffersize

Dgtsv2_buffersize 返回 Dgtsv2() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseDgtsv2_bufferSize(handle, m, n, dl, d, du, B, ldb, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  real(8), device :: dl(m), d(m), du(m), B(ldb,n)
  integer(8) :: pBufferSizeInBytes

5.6.15. cusparseCgtsv2_buffersize

Cgtsv2_buffersize 返回 Cgtsv2() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseCgtsv2_bufferSize(handle, m, n, dl, d, du, B, ldb, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  complex(4), device :: dl(m), d(m), du(m), B(ldb,n)
  integer(8) :: pBufferSizeInBytes

5.6.16. cusparseZgtsv2_buffersize

Zgtsv2_buffersize 返回 Zgtsv2() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseZgtsv2_bufferSize(handle, m, n, dl, d, du, B, ldb, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  complex(8), device :: dl(m), d(m), du(m), B(ldb,n)
  integer(8) :: pBufferSizeInBytes

5.6.17. cusparseSgtsv2

Sgtsv2 计算具有多个右手侧的三对角线性系统的解:A * X = B。三对角线性系统的系数矩阵 A 由三个向量定义,分别对应于其下对角线 (dl)、主对角线 (d) 和上对角线 (du);右手侧存储在稠密矩阵 B 中。解 X 在退出时覆盖右手侧矩阵 B。输入 m 是线性系统的大小。输入 n 是 B 中右手侧的数量。

integer(4) function cusparseSgtsv2(handle, m, n, dl, d, du, B, ldb, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  real(4), device :: dl(m), d(m), du(m), B(ldb,n)
  character(1), device :: pBuffer(*)

5.6.18. cusparseDgtsv2

Dgtsv2 计算具有多个右手侧的三对角线性系统的解:A * X = B。三对角线性系统的系数矩阵 A 由三个向量定义,分别对应于其下对角线 (dl)、主对角线 (d) 和上对角线 (du);右手侧存储在稠密矩阵 B 中。解 X 在退出时覆盖右手侧矩阵 B。输入 m 是线性系统的大小。输入 n 是 B 中右手侧的数量。

integer(4) function cusparseDgtsv2(handle, m, n, dl, d, du, B, ldb, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  real(8), device :: dl(m), d(m), du(m), B(ldb,n)
  character(1), device :: pBuffer(*)

5.6.19. cusparseCgtsv2

Cgtsv2 计算具有多个右手侧的三对角线性系统的解:A * X = B。三对角线性系统的系数矩阵 A 由三个向量定义,分别对应于其下对角线 (dl)、主对角线 (d) 和上对角线 (du);右手侧存储在稠密矩阵 B 中。解 X 在退出时覆盖右手侧矩阵 B。输入 m 是线性系统的大小。输入 n 是 B 中右手侧的数量。

integer(4) function cusparseCgtsv2(handle, m, n, dl, d, du, B, ldb, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  complex(4), device :: dl(m), d(m), du(m), B(ldb,n)
  character(1), device :: pBuffer(*)

5.6.20. cusparseZgtsv2

Zgtsv2 计算具有多个右手侧的三对角线性系统的解:A * X = B。三对角线性系统的系数矩阵 A 由三个向量定义,分别对应于其下对角线 (dl)、主对角线 (d) 和上对角线 (du);右手侧存储在稠密矩阵 B 中。解 X 在退出时覆盖右手侧矩阵 B。输入 m 是线性系统的大小。输入 n 是 B 中右手侧的数量。

integer(4) function cusparseZgtsv2(handle, m, n, dl, d, du, B, ldb, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  complex(8), device :: dl(m), d(m), du(m), B(ldb,n)
  character(1), device :: pBuffer(*)

5.6.21. cusparseSgtsv2_nopivot_buffersize

Sgtsv2_nopivot_buffersize 返回 Sgtsv2_nopivot() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseSgtsv2_nopivot_bufferSize(handle, m, n, dl, d, du, B, ldb, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  real(4), device :: dl(m), d(m), du(m), B(ldb,n)
  integer(8) :: pBufferSizeInBytes

5.6.22. cusparseDgtsv2_nopivot_buffersize

Dgtsv2_nopivot_buffersize 返回 Dgtsv2_nopivot() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseDgtsv2_nopivot_bufferSize(handle, m, n, dl, d, du, B, ldb, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  real(8), device :: dl(m), d(m), du(m), B(ldb,n)
  integer(8) :: pBufferSizeInBytes

5.6.23. cusparseCgtsv2_nopivot_buffersize

Cgtsv2_nopivot_buffersize 返回 Cgtsv2_nopivot() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseCgtsv2_nopivot_bufferSize(handle, m, n, dl, d, du, B, ldb, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  complex(4), device :: dl(m), d(m), du(m), B(ldb,n)
  integer(8) :: pBufferSizeInBytes

5.6.24. cusparseZgtsv2_nopivot_buffersize

Zgtsv2_nopivot_buffersize 返回 Zgtsv2_nopivot() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseZgtsv2_nopivot_bufferSize(handle, m, n, dl, d, du, B, ldb, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  complex(8), device :: dl(m), d(m), du(m), B(ldb,n)
  integer(8) :: pBufferSizeInBytes

5.6.25. cusparseSgtsv2_nopivot

Sgtsv2_nopivot 计算具有多个右手侧的三对角线性系统的解,无需旋转:A * X = B。三对角线性系统的系数矩阵 A 由三个向量定义,分别对应于其下对角线 (dl)、主对角线 (d) 和上对角线 (du);右手侧存储在稠密矩阵 B 中。解 X 在退出时覆盖右手侧矩阵 B。输入 m 是线性系统的大小。输入 n 是 B 中右手侧的数量。

integer(4) function cusparseSgtsv2_nopivot(handle, m, n, dl, d, du, B, ldb, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  real(4), device :: dl(m), d(m), du(m), B(ldb,n)
  character(1), device :: pBuffer(*)

5.6.26. cusparseDgtsv2_nopivot

Dgtsv2_nopivot 计算具有多个右手侧的三对角线性系统的解,无需旋转:A * X = B。三对角线性系统的系数矩阵 A 由三个向量定义,分别对应于其下对角线 (dl)、主对角线 (d) 和上对角线 (du);右手侧存储在稠密矩阵 B 中。解 X 在退出时覆盖右手侧矩阵 B。输入 m 是线性系统的大小。输入 n 是 B 中右手侧的数量。

integer(4) function cusparseDgtsv2_nopivot(handle, m, n, dl, d, du, B, ldb, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  real(8), device :: dl(m), d(m), du(m), B(ldb,n)
  character(1), device :: pBuffer(*)

5.6.27. cusparseCgtsv2_nopivot

Cgtsv2_nopivot 计算具有多个右手侧的三对角线性系统的解,无需旋转:A * X = B。三对角线性系统的系数矩阵 A 由三个向量定义,分别对应于其下对角线 (dl)、主对角线 (d) 和上对角线 (du);右手侧存储在稠密矩阵 B 中。解 X 在退出时覆盖右手侧矩阵 B。输入 m 是线性系统的大小。输入 n 是 B 中右手侧的数量。

integer(4) function cusparseCgtsv2_nopivot(handle, m, n, dl, d, du, B, ldb, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  complex(4), device :: dl(m), d(m), du(m), B(ldb,n)
  character(1), device :: pBuffer(*)

5.6.28. cusparseZgtsv2_nopivot

Zgtsv2_nopivot 计算具有多个右手侧的三对角线性系统的解,无需旋转:A * X = B。三对角线性系统的系数矩阵 A 由三个向量定义,分别对应于其下对角线 (dl)、主对角线 (d) 和上对角线 (du);右手侧存储在稠密矩阵 B 中。解 X 在退出时覆盖右手侧矩阵 B。输入 m 是线性系统的大小。输入 n 是 B 中右手侧的数量。

integer(4) function cusparseZgtsv2_nopivot(handle, m, n, dl, d, du, B, ldb, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, ldb
  complex(8), device :: dl(m), d(m), du(m), B(ldb,n)
  character(1), device :: pBuffer(*)

5.6.29. cusparseSgtsv2StridedBatch_buffersize

Sgtsv2StridedBatch_buffersize 返回 Sgtsv2StridedBatch() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseSgtsv2StridedBatch_bufferSize(handle, m, dl, d, du, x, batchCount, batchStride, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: m, batchCount, batchStride
  real(4), device :: dl(*), d(*), du(*), x(*)
  integer(8) :: pBufferSizeInBytes

5.6.30. cusparseDgtsv2StridedBatch_buffersize

Dgtsv2StridedBatch_buffersize 返回 Dgtsv2StridedBatch() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseDgtsv2StridedBatch_bufferSize(handle, m, dl, d, du, x, batchCount, batchStride, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: m, batchCount, batchStride
  real(8), device :: dl(*), d(*), du(*), x(*)
  integer(8) :: pBufferSizeInBytes

5.6.31. cusparseCgtsv2StridedBatch_buffersize

Cgtsv2StridedBatch_buffersize 返回 Cgtsv2StridedBatch() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseCgtsv2StridedBatch_bufferSize(handle, m, dl, d, du, x, batchCount, batchStride, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: m, batchCount, batchStride
  complex(4), device :: dl(*), d(*), du(*), x(*)
  integer(8) :: pBufferSizeInBytes

5.6.32. cusparseZgtsv2StridedBatch_buffersize

Zgtsv2StridedBatch_buffersize 返回 Zgtsv2StridedBatch() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseZgtsv2StridedBatch_bufferSize(handle, m, dl, d, du, x, batchCount, batchStride, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: m, batchCount, batchStride
  complex(8), device :: dl(*), d(*), du(*), x(*)
  integer(8) :: pBufferSizeInBytes

5.6.33. cusparseSgtsv2StridedBatch

Sgtsv2StridedBatch 计算具有多个右手侧的多个三对角线性系统的解:A * X = B。每个三对角线性系统的系数矩阵 A 由三个向量定义,分别对应于其下对角线 (dl)、主对角线 (d) 和上对角线 (du);右手侧存储在稠密矩阵 B 中。解 X 在退出时覆盖右手侧矩阵 B。

integer(4) function cusparseSgtsv2StridedBatch(handle, m, dl, d, du, x, batchCount, batchStride, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, batchCount, batchStride
  real(4), device :: dl(*), d(*), du(*), x(*)
  character(1), device :: pBuffer(*)

5.6.34. cusparseDgtsv2StridedBatch

Dgtsv2StridedBatch 计算具有多个右端项的多个三对角线性系统的解:A * X = B。每个三对角线性系统的系数矩阵 A 由与其下对角线 (dl)、主对角线 (d) 和上对角线 (du) 相对应的三个向量定义;右端项存储在稠密矩阵 B 中。解 X 在退出时会覆盖右端项矩阵 B。

integer(4) function cusparseDgtsv2StridedBatch(handle, m, dl, d, du, x, batchCount, batchStride, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, batchCount, batchStride
  real(8), device :: dl(*), d(*), du(*), x(*)
  character(1), device :: pBuffer(*)

5.6.35. cusparseCgtsv2StridedBatch

Cgtsv2StridedBatch 计算具有多个右端项的多个三对角线性系统的解:A * X = B。每个三对角线性系统的系数矩阵 A 由与其下对角线 (dl)、主对角线 (d) 和上对角线 (du) 相对应的三个向量定义;右端项存储在稠密矩阵 B 中。解 X 在退出时会覆盖右端项矩阵 B。

integer(4) function cusparseCgtsv2StridedBatch(handle, m, dl, d, du, x, batchCount, batchStride, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, batchCount, batchStride
  complex(4), device :: dl(*), d(*), du(*), x(*)
  character(1), device :: pBuffer(*)

5.6.36. cusparseZgtsv2StridedBatch

Zgtsv2StridedBatch 计算具有多个右端项的多个三对角线性系统的解:A * X = B。每个三对角线性系统的系数矩阵 A 由与其下对角线 (dl)、主对角线 (d) 和上对角线 (du) 相对应的三个向量定义;右端项存储在稠密矩阵 B 中。解 X 在退出时会覆盖右端项矩阵 B。

integer(4) function cusparseZgtsv2StridedBatch(handle, m, dl, d, du, x, batchCount, batchStride, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, batchCount, batchStride
  complex(8), device :: dl(*), d(*), du(*), x(*)
  character(1), device :: pBuffer(*)

5.6.37. cusparseSgtsvInterleavedBatch_buffersize

SgtsvInterleavedBatch_buffersize 返回 SgtsvInterleavedBatch() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseSgtsvInterleavedBatch_bufferSize(handle, algo, m, dl, d, du, x, batchCount, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: algo, m, batchCount
  real(4), device :: dl(*), d(*), du(*), x(*)
  integer(8) :: pBufferSizeInBytes

5.6.38. cusparseDgtsvInterleavedBatch_buffersize

DgtsvInterleavedBatch_buffersize 返回 DgtsvInterleavedBatch() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseDgtsvInterleavedBatch_bufferSize(handle, algo, m, dl, d, du, x, batchCount, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: algo, m, batchCount
  real(8), device :: dl(*), d(*), du(*), x(*)
  integer(8) :: pBufferSizeInBytes

5.6.39. cusparseCgtsvInterleavedBatch_buffersize

CgtsvInterleavedBatch_buffersize 返回 CgtsvInterleavedBatch() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseCgtsvInterleavedBatch_bufferSize(handle, algo, m, dl, d, du, x, batchCount, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: algo, m, batchCount
  complex(4), device :: dl(*), d(*), du(*), x(*)
  integer(8) :: pBufferSizeInBytes

5.6.40. cusparseZgtsvInterleavedBatch_buffersize

ZgtsvInterleavedBatch_buffersize 返回 ZgtsvInterleavedBatch() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseZgtsvInterleavedBatch_bufferSize(handle, algo, m, dl, d, du, x, batchCount, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: algo, m, batchCount
  complex(8), device :: dl(*), d(*), du(*), x(*)
  integer(8) :: pBufferSizeInBytes

5.6.41. cusparseSgtsvInterleavedBatch

SgtsvInterleavedBatch 计算具有多个右端项的多个三对角线性系统的解:A * X = B。每个三对角线性系统的系数矩阵 A 由与其下对角线 (dl)、主对角线 (d) 和上对角线 (du) 相对应的三个向量定义;右端项存储在稠密矩阵 B 中。解 X 在退出时会覆盖右端项矩阵 B。此例程与 SgtsvStridedBatch 例程的不同之处在于,对角线、RHS 和解向量的数据是交错存储的,从一个批次到 batchCount,而不是一个接一个地存储。有关当前支持的 algo 值,请参阅 cuSPARSE 库文档。

integer(4) function cusparseSgtsvInterleavedBatch(handle, algo, m, dl, d, du, x, batchCount, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: algo, m, batchCount
  real(4), device :: dl(*), d(*), du(*), x(*)
  character(1), device :: pBuffer(*)

5.6.42. cusparseDgtsvInterleavedBatch

DgtsvInterleavedBatch 计算具有多个右端项的多个三对角线性系统的解:A * X = B。每个三对角线性系统的系数矩阵 A 由与其下对角线 (dl)、主对角线 (d) 和上对角线 (du) 相对应的三个向量定义;右端项存储在稠密矩阵 B 中。解 X 在退出时会覆盖右端项矩阵 B。此例程与 DgtsvStridedBatch 例程的不同之处在于,对角线、RHS 和解向量的数据是交错存储的,从一个批次到 batchCount,而不是一个接一个地存储。有关当前支持的 algo 值,请参阅 cuSPARSE 库文档。

integer(4) function cusparseDgtsvInterleavedBatch(handle, algo, m, dl, d, du, x, batchCount, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: algo, m, batchCount
  real(8), device :: dl(*), d(*), du(*), x(*)
  character(1), device :: pBuffer(*)

5.6.43. cusparseCgtsvInterleavedBatch

CgtsvInterleavedBatch 计算具有多个右端项的多个三对角线性系统的解:A * X = B。每个三对角线性系统的系数矩阵 A 由与其下对角线 (dl)、主对角线 (d) 和上对角线 (du) 相对应的三个向量定义;右端项存储在稠密矩阵 B 中。解 X 在退出时会覆盖右端项矩阵 B。此例程与 CgtsvStridedBatch 例程的不同之处在于,对角线、RHS 和解向量的数据是交错存储的,从一个批次到 batchCount,而不是一个接一个地存储。有关当前支持的 algo 值,请参阅 cuSPARSE 库文档。

integer(4) function cusparseCgtsvInterleavedBatch(handle, algo, m, dl, d, du, x, batchCount, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: algo, m, batchCount
  complex(4), device :: dl(*), d(*), du(*), x(*)
  character(1), device :: pBuffer(*)

5.6.44. cusparseZgtsvInterleavedBatch

ZgtsvInterleavedBatch 计算具有多个右端项的多个三对角线性系统的解:A * X = B。每个三对角线性系统的系数矩阵 A 由与其下对角线 (dl)、主对角线 (d) 和上对角线 (du) 相对应的三个向量定义;右端项存储在稠密矩阵 B 中。解 X 在退出时会覆盖右端项矩阵 B。此例程与 ZgtsvStridedBatch 例程的不同之处在于,对角线、RHS 和解向量的数据是交错存储的,从一个批次到 batchCount,而不是一个接一个地存储。有关当前支持的 algo 值,请参阅 cuSPARSE 库文档。

integer(4) function cusparseZgtsvInterleavedBatch(handle, algo, m, dl, d, du, x, batchCount, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: algo, m, batchCount
  complex(8), device :: dl(*), d(*), du(*), x(*)
  character(1), device :: pBuffer(*)

5.6.45. cusparseSgpsvInterleavedBatch_buffersize

SgpsvInterleavedBatch_buffersize 返回 SgpsvInterleavedBatch() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseSgpsvInterleavedBatch_bufferSize(handle, algo, m, ds, dl, d, du, dw, x, batchCount, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: algo, m, batchCount
  real(4), device :: ds(*), dl(*), d(*), du(*), dw(*), x(*)
  integer(8) :: pBufferSizeInBytes

5.6.46. cusparseDgpsvInterleavedBatch_buffersize

DgpsvInterleavedBatch_buffersize 返回 DgpsvInterleavedBatch() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseDgpsvInterleavedBatch_bufferSize(handle, algo, m, ds, dl, d, du, dw, x, batchCount, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: algo, m, batchCount
  real(8), device :: ds(*), dl(*), d(*), du(*), dw(*), x(*)
  integer(8) :: pBufferSizeInBytes

5.6.47. cusparseCgpsvInterleavedBatch_buffersize

CgpsvInterleavedBatch_buffersize 返回 CgpsvInterleavedBatch() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseCgpsvInterleavedBatch_bufferSize(handle, algo, m, ds, dl, d, du, dw, x, batchCount, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: algo, m, batchCount
  complex(4), device :: ds(*), dl(*), d(*), du(*), dw(*), x(*)
  integer(8) :: pBufferSizeInBytes

5.6.48. cusparseZgpsvInterleavedBatch_buffersize

ZgpsvInterleavedBatch_buffersize 返回 ZgpsvInterleavedBatch() 中所需的缓冲区大小(以字节为单位)。

integer(4) function cusparseZgpsvInterleavedBatch_bufferSize(handle, algo, m, ds, dl, d, du, dw, x, batchCount, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: algo, m, batchCount
  complex(8), device :: ds(*), dl(*), d(*), du(*), dw(*), x(*)
  integer(8) :: pBufferSizeInBytes

5.6.49. cusparseSgpsvInterleavedBatch

SgpsvInterleavedBatch 计算具有多个右端项的多个五对角线性系统的解:A * X = B。每个五对角线性系统的系数矩阵 A 由与其下对角线 (ds, dl)、主对角线 (d) 和上对角线 (du, dw) 相对应的五个向量定义;右端项存储在稠密矩阵 B 中。解 X 在退出时会覆盖右端项矩阵 B。此例程与 StridedBatch 例程的不同之处在于,对角线、RHS 和解向量的数据是交错存储的,从一个批次到 batchCount,而不是一个接一个地存储。有关当前支持的 algo 值,请参阅 cuSPARSE 库文档。

integer(4) function cusparseSgpsvInterleavedBatch(handle, algo, m, ds, dl, d, du, dw, x, batchCount, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: algo, m, batchCount
  real(4), device :: ds(*), dl(*), d(*), du(*), dw(*), x(*)
  character(1), device :: pBuffer(*)

5.6.50. cusparseDgpsvInterleavedBatch

DgpsvInterleavedBatch 计算具有多个右端项的多个五对角线性系统的解:A * X = B。每个五对角线性系统的系数矩阵 A 由与其下对角线 (ds, dl)、主对角线 (d) 和上对角线 (du, dw) 相对应的五个向量定义;右端项存储在稠密矩阵 B 中。解 X 在退出时会覆盖右端项矩阵 B。此例程与 StridedBatch 例程的不同之处在于,对角线、RHS 和解向量的数据是交错存储的,从一个批次到 batchCount,而不是一个接一个地存储。有关当前支持的 algo 值,请参阅 cuSPARSE 库文档。

integer(4) function cusparseDgpsvInterleavedBatch(handle, algo, m, ds, dl, d, du, dw, x, batchCount, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: algo, m, batchCount
  real(8), device :: ds(*), dl(*), d(*), du(*), dw(*), x(*)
  character(1), device :: pBuffer(*)

5.6.51. cusparseCgpsvInterleavedBatch

CgpsvInterleavedBatch 计算具有多个右端项的多个五对角线性系统的解:A * X = B。每个五对角线性系统的系数矩阵 A 由与其下对角线 (ds, dl)、主对角线 (d) 和上对角线 (du, dw) 相对应的五个向量定义;右端项存储在稠密矩阵 B 中。解 X 在退出时会覆盖右端项矩阵 B。此例程与 StridedBatch 例程的不同之处在于,对角线、RHS 和解向量的数据是交错存储的,从一个批次到 batchCount,而不是一个接一个地存储。有关当前支持的 algo 值,请参阅 cuSPARSE 库文档。

integer(4) function cusparseCgpsvInterleavedBatch(handle, algo, m, ds, dl, d, du, dw, x, batchCount, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: algo, m, batchCount
  complex(4), device :: ds(*), dl(*), d(*), du(*), dw(*), x(*)
  character(1), device :: pBuffer(*)

5.6.52. cusparseZgpsvInterleavedBatch

ZgpsvInterleavedBatch 计算具有多个右端项的多个五对角线性系统的解:A * X = B。每个五对角线性系统的系数矩阵 A 由与其下对角线 (ds, dl)、主对角线 (d) 和上对角线 (du, dw) 相对应的五个向量定义;右端项存储在稠密矩阵 B 中。解 X 在退出时会覆盖右端项矩阵 B。此例程与 StridedBatch 例程的不同之处在于,对角线、RHS 和解向量的数据是交错存储的,从一个批次到 batchCount,而不是一个接一个地存储。有关当前支持的 algo 值,请参阅 cuSPARSE 库文档。

integer(4) function cusparseZgpsvInterleavedBatch(handle, algo, m, ds, dl, d, du, dw, x, batchCount, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: algo, m, batchCount
  complex(8), device :: ds(*), dl(*), d(*), du(*), dw(*), x(*)
  character(1), device :: pBuffer(*)

5.6.53. cusparseScsric02_bufferSize

此函数返回 csric02 中使用的缓冲区大小。

integer(4) function cusparseScsric02_bufferSize(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsric02Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.6.54. cusparseDcsric02_bufferSize

此函数返回 csric02 中使用的缓冲区大小。

integer(4) function cusparseDcsric02_bufferSize(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsric02Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.6.55. cusparseCcsric02_bufferSize

此函数返回 csric02 中使用的缓冲区大小。

integer(4) function cusparseCcsric02_bufferSize(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsric02Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.6.56. cusparseZcsric02_bufferSize

此函数返回 csric02 中使用的缓冲区大小。

integer(4) function cusparseZcsric02_bufferSize(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsric02Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.6.57. cusparseScsric02_analysis

此函数执行 csric02 的分析阶段。

integer(4) function cusparseScsric02_analysis(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsric02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.58. cusparseDcsric02_analysis

此函数执行 csric02 的分析阶段。

integer(4) function cusparseDcsric02_analysis(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsric02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.59. cusparseCcsric02_analysis

此函数执行 csric02 的分析阶段。

integer(4) function cusparseCcsric02_analysis(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsric02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.60. cusparseZcsric02_analysis

此函数执行 csric02 的分析阶段。

integer(4) function cusparseZcsric02_analysis(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsric02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.61. cusparseScsric02

CSRIC02 执行计算不完全 Cholesky 分解的求解阶段,该分解具有零填充且无旋转。

integer(4) function cusparseScsric02(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsric02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.62. cusparseDcsric02

CSRIC02 执行计算不完全 Cholesky 分解的求解阶段,该分解具有零填充且无旋转。

integer(4) function cusparseDcsric02(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsric02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.63. cusparseCcsric02

CSRIC02 执行计算不完全 Cholesky 分解的求解阶段,该分解具有零填充且无旋转。

integer(4) function cusparseCcsric02(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsric02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.64. cusparseZcsric02

CSRIC02 执行计算不完全 Cholesky 分解的求解阶段,该分解具有零填充且无旋转。

integer(4) function cusparseZcsric02(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsric02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.65. cusparseXcsric02_zeroPivot

当 A(j,j) 是结构零或数值零时,此函数返回等于 CUSPARSE_STATUS_ZERO_PIVOT 的错误代码,并将 position 设置为 j。否则,position 将设置为 -1。

integer(4) function cusparseXcsric02_zeroPivot(handle, info, position)
  type(cusparseHandle) :: handle
  type(cusparseCsric02Info) :: info
  integer(4), device :: position ! device or host variable

5.6.66. cusparseScsrilu02_numericBoost

此函数根据 tol 输入参数,提升值以替换不完全 LU 分解中的数值。

integer(4) function cusparseScsrilu02_numericBoost(handle, info, enable_boost, tol, boost_val)
  type(cusparseHandle) :: handle
  type(cusparseCsrilu02Info) :: info
  integer :: enable_boost
  real(8), device :: tol ! device or host variable
  real(4), device :: boost_val ! device or host variable

5.6.67. cusparseDcsrilu02_numericBoost

此函数根据 tol 输入参数,提升值以替换不完全 LU 分解中的数值。

integer(4) function cusparseDcsrilu02_numericBoost(handle, info, enable_boost, tol, boost_val)
  type(cusparseHandle) :: handle
  type(cusparseCsrilu02Info) :: info
  integer :: enable_boost
  real(8), device :: tol ! device or host variable
  real(8), device :: boost_val ! device or host variable

5.6.68. cusparseCcsrilu02_numericBoost

此函数根据 tol 输入参数,提升值以替换不完全 LU 分解中的数值。

integer(4) function cusparseCcsrilu02_numericBoost(handle, info, enable_boost, tol, boost_val)
  type(cusparseHandle) :: handle
  type(cusparseCsrilu02Info) :: info
  integer :: enable_boost
  real(8), device :: tol ! device or host variable
  complex(4), device :: boost_val ! device or host variable

5.6.69. cusparseZcsrilu02_numericBoost

此函数根据 tol 输入参数,提升值以替换不完全 LU 分解中的数值。

integer(4) function cusparseZcsrilu02_numericBoost(handle, info, enable_boost, tol, boost_val)
  type(cusparseHandle) :: handle
  type(cusparseCsrilu02Info) :: info
  integer :: enable_boost
  real(8), device :: tol ! device or host variable
  complex(8), device :: boost_val ! device or host variable

5.6.70. cusparseScsrilu02_bufferSize

此函数返回 csrilu02 中使用的缓冲区大小。

integer(4) function cusparseScsrilu02_bufferSize(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrilu02Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.6.71. cusparseDcsrilu02_bufferSize

此函数返回 csrilu02 中使用的缓冲区大小。

integer(4) function cusparseDcsrilu02_bufferSize(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrilu02Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.6.72. cusparseCcsrilu02_bufferSize

此函数返回 csrilu02 中使用的缓冲区大小。

integer(4) function cusparseCcsrilu02_bufferSize(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrilu02Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.6.73. cusparseZcsrilu02_bufferSize

此函数返回 csrilu02 中使用的缓冲区大小。

integer(4) function cusparseZcsrilu02_bufferSize(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrilu02Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.6.74. cusparseScsrilu02_analysis

此函数执行 csrilu02 的分析阶段。

integer(4) function cusparseScsrilu02_analysis(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrilu02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.75. cusparseDcsrilu02_analysis

此函数执行 csrilu02 的分析阶段。

integer(4) function cusparseDcsrilu02_analysis(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrilu02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.76. cusparseCcsrilu02_analysis

此函数执行 csrilu02 的分析阶段。

integer(4) function cusparseCcsrilu02_analysis(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrilu02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.77. cusparseZcsrilu02_analysis

此函数执行 csrilu02 的分析阶段。

integer(4) function cusparseZcsrilu02_analysis(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrilu02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.78. cusparseScsrilu02

CSRILU02 执行不完全 LU 分解的求解阶段,该分解具有零填充且无旋转。A 是一个 m x m 稀疏矩阵,它由三个数组 csrValA_valM、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。

integer(4) function cusparseScsrilu02(handle, m, nnz, descrA,
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrilu02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.79. cusparseDcsrilu02

CSRILU02 执行不完全 LU 分解的求解阶段,该分解具有零填充且无旋转。A 是一个 m x m 稀疏矩阵,它由三个数组 csrValA_valM、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。

integer(4) function cusparseDcsrilu02(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrilu02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.80. cusparseCcsrilu02

CSRILU02 执行不完全 LU 分解的求解阶段,该分解具有零填充且无旋转。A 是一个 m x m 稀疏矩阵,它由三个数组 csrValA_valM、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。

integer(4) function cusparseCcsrilu02(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrilu02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.81. cusparseZcsrilu02

CSRILU02 执行不完全 LU 分解的求解阶段,该分解具有零填充且无旋转。A 是一个 m x m 稀疏矩阵,它由三个数组 csrValA_valM、csrRowPtrA 和 csrColIndA 以 CSR 存储格式定义。

integer(4) function cusparseZcsrilu02(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, nnz
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseCsrilu02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.82. cusparseXcsrilu02_zeroPivot

当 A(j,j) 是结构零或数值零时,此函数返回等于 CUSPARSE_STATUS_ZERO_PIVOT 的错误代码,并将 position 设置为 j。否则,position 将设置为 -1。

integer(4) function cusparseXcsrilu02_zeroPivot(handle, info, position)
  type(cusparseHandle) :: handle
  type(cusparseCsrilu02Info) :: info
  integer(4), device :: position ! device or host variable

5.6.83. cusparseSbsric02_bufferSize

此函数返回 bsric02 中使用的缓冲区大小。

integer(4) function cusparseSbsric02_bufferSize(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  real(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsric02Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.6.84. cusparseDbsric02_bufferSize

此函数返回 bsric02 中使用的缓冲区大小。

integer(4) function cusparseDbsric02_bufferSize(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  real(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsric02Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.6.85. cusparseCbsric02_bufferSize

此函数返回 bsric02 中使用的缓冲区大小。

integer(4) function cusparseCbsric02_bufferSize(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsric02Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.6.86. cusparseZbsric02_bufferSize

此函数返回 bsric02 中使用的缓冲区大小。

integer(4) function cusparseZbsric02_bufferSize(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsric02Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.6.87. cusparseSbsric02_analysis

此函数执行 bsric02 的分析阶段。

integer(4) function cusparseSbsric02_analysis(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  real(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsric02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.88. cusparseDbsric02_analysis

此函数执行 bsric02 的分析阶段。

integer(4) function cusparseDbsric02_analysis(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  real(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsric02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.89. cusparseCbsric02_analysis

此函数执行 bsric02 的分析阶段。

integer(4) function cusparseCbsric02_analysis(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsric02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.90. cusparseZbsric02_analysis

此函数执行 bsric02 的分析阶段。

integer(4) function cusparseZbsric02_analysis(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsric02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.91. cusparseSbsric02

BSRIC02 执行不完全 Cholesky 分解的求解阶段,该分解具有零填充且无旋转。A 是一个 (mb*blockDim) x (mb*blockDim) 稀疏矩阵,它由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 以 BSR 存储格式定义。

integer(4) function cusparseSbsric02(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  real(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsric02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.92. cusparseDbsric02

BSRIC02 执行不完全 Cholesky 分解的求解阶段,该分解具有零填充且无旋转。A 是一个 (mb*blockDim) x (mb*blockDim) 稀疏矩阵,它由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 以 BSR 存储格式定义。

integer(4) function cusparseDbsric02(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  real(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsric02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.93. cusparseCbsric02

BSRIC02 执行不完全 Cholesky 分解的求解阶段,该分解具有零填充且无旋转。A 是一个 (mb*blockDim) x (mb*blockDim) 稀疏矩阵,它由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 以 BSR 存储格式定义。

integer(4) function cusparseCbsric02(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsric02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.94. cusparseZbsric02

BSRIC02 执行不完全 Cholesky 分解的求解阶段,该分解具有零填充且无旋转。A 是一个 (mb*blockDim) x (mb*blockDim) 稀疏矩阵,它由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 以 BSR 存储格式定义。

integer(4) function cusparseZbsric02(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsric02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.95. cusparseXbsric02_zeroPivot

当 A(j,j) 是结构零或数值零时,此函数返回等于 CUSPARSE_STATUS_ZERO_PIVOT 的错误代码,并将 position 设置为 j。否则,position 将设置为 -1。

integer(4) function cusparseXbsric02_zeroPivot(handle, info, position)
  type(cusparseHandle) :: handle
  type(cusparseBsric02Info) :: info
  integer(4), device :: position ! device or host variable

5.6.96. cusparseSbsrilu02_numericBoost

此函数根据 tol 输入参数,提升值以替换不完全 LU 分解中的数值。

integer(4) function cusparseSbsrilu02_numericBoost(handle, info, enable_boost, tol, boost_val)
  type(cusparseHandle) :: handle
  type(cusparseBsrilu02Info) :: info
  integer :: enable_boost
  real(8), device :: tol ! device or host variable
  real(4), device :: boost_val ! device or host variable

5.6.97. cusparseDbsrilu02_numericBoost

此函数根据 tol 输入参数,提升值以替换不完全 LU 分解中的数值。

integer(4) function cusparseDbsrilu02_numericBoost(handle, info, enable_boost, tol, boost_val)
  type(cusparseHandle) :: handle
  type(cusparseBsrilu02Info) :: info
  integer :: enable_boost
  real(8), device :: tol ! device or host variable
  real(8), device :: boost_val ! device or host variable

5.6.98. cusparseCbsrilu02_numericBoost

此函数根据 tol 输入参数,提升值以替换不完全 LU 分解中的数值。

integer(4) function cusparseCbsrilu02_numericBoost(handle, info, enable_boost, tol, boost_val)
  type(cusparseHandle) :: handle
  type(cusparseBsrilu02Info) :: info
  integer :: enable_boost
  real(8), device :: tol ! device or host variable
  complex(4), device :: boost_val ! device or host variable

5.6.99. cusparseZbsrilu02_numericBoost

此函数根据 tol 输入参数,提升值以替换不完全 LU 分解中的数值。

integer(4) function cusparseZbsrilu02_numericBoost(handle, info, enable_boost, tol, boost_val)
  type(cusparseHandle) :: handle
  type(cusparseBsrilu02Info) :: info
  integer :: enable_boost
  real(8), device :: tol ! device or host variable
  complex(8), device :: boost_val ! device or host variable

5.6.100. cusparseSbsrilu02_bufferSize

此函数返回 bsrilu02 中使用的缓冲区大小。

integer(4) function cusparseSbsrilu02_bufferSize(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  real(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrilu02Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.6.101. cusparseDbsrilu02_bufferSize

此函数返回 bsrilu02 中使用的缓冲区大小。

integer(4) function cusparseDbsrilu02_bufferSize(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  real(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrilu02Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.6.102. cusparseCbsrilu02_bufferSize

此函数返回 bsrilu02 中使用的缓冲区大小。

integer(4) function cusparseCbsrilu02_bufferSize(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrilu02Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.6.103. cusparseZbsrilu02_bufferSize

此函数返回 bsrilu02 中使用的缓冲区大小。

integer(4) function cusparseZbsrilu02_bufferSize(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrilu02Info) :: info
  integer(4) :: pBufferSize ! integer(8) also accepted

5.6.104. cusparseSbsrilu02_analysis

此函数执行 bsrilu02 的分析阶段。

integer(4) function cusparseSbsrilu02_analysis(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  real(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrilu02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.105. cusparseDbsrilu02_analysis

此函数执行 bsrilu02 的分析阶段。

integer(4) function cusparseDbsrilu02_analysis(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  real(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrilu02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.106. cusparseCbsrilu02_analysis

此函数执行 bsrilu02 的分析阶段。

integer(4) function cusparseCbsrilu02_analysis(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrilu02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.107. cusparseZbsrilu02_analysis

此函数执行 bsrilu02 的分析阶段。

integer(4) function cusparseZbsrilu02_analysis(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrilu02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.108. cusparseSbsrilu02

BSRILU02 执行不完全 LU 分解的求解阶段,该分解具有零填充且无旋转。A 是一个 (mb*blockDim) x (mb*blockDim) 稀疏矩阵,它由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 以 BSR 存储格式定义。

integer(4) function cusparseSbsrilu02(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  real(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrilu02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.109. cusparseDbsrilu02

BSRILU02 执行不完全 LU 分解的求解阶段,该分解具有零填充且无旋转。A 是一个 (mb*blockDim) x (mb*blockDim) 稀疏矩阵,它由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 以 BSR 存储格式定义。

integer(4) function cusparseDbsrilu02(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  real(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrilu02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.110. cusparseCbsrilu02

BSRILU02 执行不完全 LU 分解的求解阶段,该分解具有零填充且无旋转。A 是一个 (mb*blockDim) x (mb*blockDim) 稀疏矩阵,它由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 以 BSR 存储格式定义。

integer(4) function cusparseCbsrilu02(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(4), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrilu02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.111. cusparseZbsrilu02

BSRILU02 执行不完全 LU 分解的求解阶段,该分解具有零填充且无旋转。A 是一个 (mb*blockDim) x (mb*blockDim) 稀疏矩阵,它由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 以 BSR 存储格式定义。

integer(4) function cusparseZbsrilu02(handle, dirA, mb, nnzb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, info, policy, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dirA
  integer(4) :: mb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(8), device :: bsrValA(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: blockDim
  type(cusparseBsrilu02Info) :: info
  integer(4) :: policy
  character(c_char), device :: pBuffer(*)

5.6.112. cusparseXbsrilu02_zeroPivot

当 A(j,j) 是结构零或数值零时,此函数返回等于 CUSPARSE_STATUS_ZERO_PIVOT 的错误代码,并将 position 设置为 j。否则,position 将设置为 -1。

integer(4) function cusparseXbsrilu02_zeroPivot(handle, info, position)
  type(cusparseHandle) :: handle
  type(cusparseBsrilu02Info) :: info
  integer(4), device :: position ! device or host variable

5.7. CUSPARSE 重排序函数

本节包含用于操作稀疏矩阵的重排序函数的接口。

5.7.1. cusparseScsrColor

此函数执行与以 CSR 格式存储的矩阵 A 关联的邻接图的着色。

integer(4) function cusparseScsrColor(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, fractionToColor, ncolors, coloring, reordering, info)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA
  type(cusparseColorInfo) :: info
  integer :: m, nnz
  real(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), coloring(*), reordering(*)
  real(4), device :: fractionToColor ! device or host variable
  integer(4), device :: ncolors ! device or host variable

5.7.2. cusparseDcsrColor

此函数执行与以 CSR 格式存储的矩阵 A 关联的邻接图的着色。

integer(4) function cusparseDcsrColor(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, fractionToColor, ncolors, coloring, reordering, info)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA
  type(cusparseColorInfo) :: info
  integer :: m, nnz
  real(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), coloring(*), reordering(*)
  real(8), device :: fractionToColor ! device or host variable
  integer(4), device :: ncolors ! device or host variable

5.7.3. cusparseCcsrColor

此函数执行与以 CSR 格式存储的矩阵 A 关联的邻接图的着色。

integer(4) function cusparseCcsrColor(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, fractionToColor, ncolors, coloring, reordering, info)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA
  type(cusparseColorInfo) :: info
  integer :: m, nnz
  complex(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), coloring(*), reordering(*)
  real(4), device :: fractionToColor ! device or host variable
  integer(4), device :: ncolors ! device or host variable

5.7.4. cusparseZcsrColor

此函数执行与以 CSR 格式存储的矩阵 A 关联的邻接图的着色。

integer(4) function cusparseZcsrColor(handle, m, nnz, descrA, csrValA, csrRowPtrA, csrColIndA, fractionToColor, ncolors, coloring, reordering, info)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA
  type(cusparseColorInfo) :: info
  integer :: m, nnz
  complex(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), coloring(*), reordering(*)
  real(8), device :: fractionToColor ! device or host variable
  integer(4), device :: ncolors ! device or host variable

5.8. CUSPARSE 格式转换函数

本节包含用于在不同稀疏和稠密矩阵存储格式之间切换的转换函数的接口。

5.8.1. cusparseSbsr2csr

此函数将以 BSR 格式(由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 定义)表示的稀疏矩阵转换为以 CSR 格式(由数组 csrValC、csrRowPtrC 和 csrColIndC 定义)表示的稀疏矩阵。

integer(4) function cusparseSbsr2csr(handle, dirA, nm, nb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, descrC, csrValC, csrRowPtrC, csrColIndC)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, mb, nb, blockDim
  type(cusparseMatDescr) :: descrA, descrC
  real(4), device :: bsrValA(*), csrValC(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*), csrRowPtrC(*), csrColIndC(*)

5.8.2. cusparseDbsr2csr

此函数将以 BSR 格式(由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 定义)表示的稀疏矩阵转换为以 CSR 格式(由数组 csrValC、csrRowPtrC 和 csrColIndC 定义)表示的稀疏矩阵。

integer(4) function cusparseDbsr2csr(handle, dirA, nm, nb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, descrC, csrValC, csrRowPtrC, csrColIndC)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, mb, nb, blockDim
  type(cusparseMatDescr) :: descrA, descrC
  real(8), device :: bsrValA(*), csrValC(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*), csrRowPtrC(*), csrColIndC(*)

5.8.3. cusparseCbsr2csr

此函数将以 BSR 格式(由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 定义)表示的稀疏矩阵转换为以 CSR 格式(由数组 csrValC、csrRowPtrC 和 csrColIndC 定义)表示的稀疏矩阵。

integer(4) function cusparseCbsr2csr(handle, dirA, nm, nb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, descrC, csrValC, csrRowPtrC, csrColIndC)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, mb, nb, blockDim
  type(cusparseMatDescr) :: descrA, descrC
  complex(4), device :: bsrValA(*), csrValC(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*), csrRowPtrC(*), csrColIndC(*)

5.8.4. cusparseZbsr2csr

此函数将以 BSR 格式(由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 定义)表示的稀疏矩阵转换为以 CSR 格式(由数组 csrValC、csrRowPtrC 和 csrColIndC 定义)表示的稀疏矩阵。

integer(4) function cusparseZbsr2csr(handle, dirA, nm, nb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockDim, descrC, csrValC, csrRowPtrC, csrColIndC)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, mb, nb, blockDim
  type(cusparseMatDescr) :: descrA, descrC
  complex(8), device :: bsrValA(*), csrValC(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*), csrRowPtrC(*), csrColIndC(*)

5.8.5. cusparseXcoo2csr

此函数将包含未压缩行索引(对应于 COO 格式)的数组转换为压缩行指针(对应于 CSR 格式)的数组。

integer(4) function cusparseXcoo2csr(handle, cooRowInd, nnz, m, csrRowPtr, idxBase)
  type(cusparseHandle) :: handle
  integer(4) :: nnz, m, idxBase
  integer(4), device :: cooRowInd(*), csrRowPtr(*)

5.8.6. cusparseScsc2dense

此函数将以 CSC 格式(由三个数组 cscValA、cscColPtrA 和 cscRowIndA 定义)表示的稀疏矩阵转换为稠密格式的矩阵 A。稠密矩阵 A 用稀疏矩阵的值填充,其余位置用零填充。

integer(4) function cusparseScsc2dense(handle, m, n, descrA, cscValA, cscRowIndA, cscColPtrA, A, lda)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda
  type(cusparseMatDescr) :: descrA
  real(4), device :: cscValA(*), A(*)
  integer(4), device :: cscRowIndA(*), cscColPtrA(*)

5.8.7. cusparseDcsc2dense

此函数将以 CSC 格式(由三个数组 cscValA、cscColPtrA 和 cscRowIndA 定义)表示的稀疏矩阵转换为稠密格式的矩阵 A。稠密矩阵 A 用稀疏矩阵的值填充,其余位置用零填充。

integer(4) function cusparseDcsc2dense(handle, m, n, descrA, cscValA, cscRowIndA, cscColPtrA, A, lda)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda
  type(cusparseMatDescr) :: descrA
  real(8), device :: cscValA(*), A(*)
  integer(4), device :: cscRowIndA(*), cscColPtrA(*)

5.8.8. cusparseCcsc2dense

此函数将以 CSC 格式(由三个数组 cscValA、cscColPtrA 和 cscRowIndA 定义)表示的稀疏矩阵转换为稠密格式的矩阵 A。稠密矩阵 A 用稀疏矩阵的值填充,其余位置用零填充。

integer(4) function cusparseCcsc2dense(handle, m, n, descrA, cscValA, cscRowIndA, cscColPtrA, A, lda)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda
  type(cusparseMatDescr) :: descrA
  complex(4), device :: cscValA(*), A(*)
  integer(4), device :: cscRowIndA(*), cscColPtrA(*)

5.8.9. cusparseZcsc2dense

此函数将以 CSC 格式(由三个数组 cscValA、cscColPtrA 和 cscRowIndA 定义)表示的稀疏矩阵转换为稠密格式的矩阵 A。稠密矩阵 A 用稀疏矩阵的值填充,其余位置用零填充。

integer(4) function cusparseZcsc2dense(handle, m, n, descrA, cscValA, cscRowIndA, cscColPtrA, A, lda)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda
  type(cusparseMatDescr) :: descrA
  complex(8), device :: cscValA(*), A(*)
  integer(4), device :: cscRowIndA(*), cscColPtrA(*)

5.8.10. cusparseScsc2hyb

此函数将以 CSC 格式(由三个数组 cscValA、cscColPtrA 和 cscRowIndA 定义)表示的稀疏矩阵转换为 HYB 格式的稀疏矩阵 A。

integer(4) function cusparseScsc2hyb(handle, m, n, descrA, cscValA, cscRowIndA, cscColPtrA, hybA, userEllWidth, partitionType)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, userEllWidth, partitionType
  type(cusparseMatDescr) :: descrA
  real(4), device :: cscValA(*)
  integer(4), device :: cscRowIndA(*), cscColPtrA(*)
  type(cusparseHybMat) :: hybA

5.8.11. cusparseDcsc2hyb

此函数将以 CSC 格式(由三个数组 cscValA、cscColPtrA 和 cscRowIndA 定义)表示的稀疏矩阵转换为 HYB 格式的稀疏矩阵 A。

integer(4) function cusparseDcsc2hyb(handle, m, n, descrA, cscValA, cscRowIndA, cscColPtrA, hybA, userEllWidth, partitionType)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, userEllWidth, partitionType
  type(cusparseMatDescr) :: descrA
  real(8), device :: cscValA(*)
  integer(4), device :: cscRowIndA(*), cscColPtrA(*)
  type(cusparseHybMat) :: hybA

5.8.12. cusparseCcsc2hyb

此函数将以 CSC 格式(由三个数组 cscValA、cscColPtrA 和 cscRowIndA 定义)表示的稀疏矩阵转换为 HYB 格式的稀疏矩阵 A。

integer(4) function cusparseCcsc2hyb(handle, m, n, descrA, cscValA, cscRowIndA, cscColPtrA, hybA, userEllWidth, partitionType)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, userEllWidth, partitionType
  type(cusparseMatDescr) :: descrA
  complex(4), device :: cscValA(*)
  integer(4), device :: cscRowIndA(*), cscColPtrA(*)
  type(cusparseHybMat) :: hybA

5.8.13. cusparseZcsc2hyb

此函数将以 CSC 格式(由三个数组 cscValA、cscColPtrA 和 cscRowIndA 定义)表示的稀疏矩阵转换为 HYB 格式的稀疏矩阵 A。

integer(4) function cusparseZcsc2hyb(handle, m, n, descrA, cscValA, cscRowIndA, cscColPtrA, hybA, userEllWidth, partitionType)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, userEllWidth, partitionType
  type(cusparseMatDescr) :: descrA
  complex(8), device :: cscValA(*)
  integer(4), device :: cscRowIndA(*), cscColPtrA(*)
  type(cusparseHybMat) :: hybA

5.8.14. cusparseXcsr2bsrNnz

cusparseXcsrgeamNnz 计算 CSRGEAM 将生成的非零元素的数量。

integer(4) function cusparseXcsr2bsrNnz(handle, dirA, m, n, descrA, csrRowPtrA, csrColIndA, blockDim, descrC, bsrRowPtrC, nnzTotalDevHostPtr)
  type(cusparseHandle) :: handle
  integer :: dirA, m, n, blockdim
  type(cusparseMatDescr) :: descrA, descrC
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), bsrRowPtrC(*)
  integer(4), device :: nnzTotalDevHostPtr ! device or host variable

5.8.15. cusparseScsr2bsr

此函数将以 CSR 存储格式(由三个数组 csrValA、csrRowPtrA 和 csrColIndA 定义)表示的稀疏矩阵转换为以 BSR 格式(由数组 bsrValC、bsrRowPtrC 和 bsrColIndC 定义)表示的稀疏矩阵。

integer(4) function cusparseScsr2bsr(handle, dirA, m, n, descrA, csrValA, csrRowPtrA, csrColIndA, blockDim, descrC, bsrValC, bsrRowPtrC, bsrColIndC)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, m, n, blockdim
  type(cusparseMatDescr) :: descrA, descrC
  real(4), device :: csrValA(*), bsrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), bsrRowPtrC(*), bsrColIndC(*)

5.8.16. cusparseDcsr2bsr

此函数将以 CSR 存储格式(由三个数组 csrValA、csrRowPtrA 和 csrColIndA 定义)表示的稀疏矩阵转换为以 BSR 格式(由数组 bsrValC、bsrRowPtrC 和 bsrColIndC 定义)表示的稀疏矩阵。

integer(4) function cusparseDcsr2bsr(handle, dirA, m, n, descrA, csrValA, csrRowPtrA, csrColIndA, blockDim, descrC, bsrValC, bsrRowPtrC, bsrColIndC)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, m, n, blockdim
  type(cusparseMatDescr) :: descrA, descrC
  real(8), device :: csrValA(*), bsrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), bsrRowPtrC(*), bsrColIndC(*)

5.8.17. cusparseCcsr2bsr

此函数将以 CSR 存储格式(由三个数组 csrValA、csrRowPtrA 和 csrColIndA 定义)表示的稀疏矩阵转换为以 BSR 格式(由数组 bsrValC、bsrRowPtrC 和 bsrColIndC 定义)表示的稀疏矩阵。

integer(4) function cusparseCcsr2bsr(handle, dirA, m, n, descrA, csrValA, csrRowPtrA, csrColIndA, blockDim, descrC, bsrValC, bsrRowPtrC, bsrColIndC)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, m, n, blockdim
  type(cusparseMatDescr) :: descrA, descrC
  complex(4), device :: csrValA(*), bsrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), bsrRowPtrC(*), bsrColIndC(*)

5.8.18. cusparseZcsr2bsr

此函数将以 CSR 存储格式(由三个数组 csrValA、csrRowPtrA 和 csrColIndA 定义)表示的稀疏矩阵转换为以 BSR 格式(由数组 bsrValC、bsrRowPtrC 和 bsrColIndC 定义)表示的稀疏矩阵。

integer(4) function cusparseZcsr2bsr(handle, dirA, m, n, descrA, csrValA, csrRowPtrA, csrColIndA, blockDim, descrC, bsrValC, bsrRowPtrC, bsrColIndC)
  type(cusparseHandle) :: handle
  integer(4) :: dirA, m, n, blockdim
  type(cusparseMatDescr) :: descrA, descrC
  complex(8), device :: csrValA(*), bsrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*), bsrRowPtrC(*), bsrColIndC(*)

5.8.19. cusparseXcsr2coo

此函数将包含压缩行指针(对应于 CSR 格式)的数组转换为未压缩行索引(对应于 COO 格式)的数组。

integer(4) function cusparseXcsr2coo(handle, csrRowPtr, nnz, m, cooRowInd, idxBase)
  type(cusparseHandle) :: handle
  integer(4) :: nnz, m, idxBase
  integer(4), device :: csrRowPtr(*), cooRowInd(*)

5.8.20. cusparseScsr2csc

此函数将以 CSR 存储格式(由三个数组 csrVal、csrRowPtr 和 csrColInd 定义)表示的稀疏矩阵转换为以 CSC 格式(由数组 cscVal、cscRowInd 和 cscColPtr 定义)表示的稀疏矩阵。

此函数已在 CUDA 11.0 中移除。请改用 cusparseCsr2cscEx2 例程。

integer(4) function cusparseScsr2csc(handle, m, n, nnz, csrVal, csrRowPtr, csrColInd, cscVal, cscRowInd, cscColPtr, copyValues, idxBase)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz, copyValues, idxBase
  real(4), device :: csrVal(*), cscVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*), cscRowInd(*), cscColPtr(*)

5.8.21. cusparseDcsr2csc

此函数将以 CSR 存储格式(由三个数组 csrVal、csrRowPtr 和 csrColInd 定义)表示的稀疏矩阵转换为以 CSC 格式(由数组 cscVal、cscRowInd 和 cscColPtr 定义)表示的稀疏矩阵。

此函数已在 CUDA 11.0 中移除。请改用 cusparseCsr2cscEx2 例程。

integer(4) function cusparseDcsr2csc(handle, m, n, nnz, csrVal, csrRowPtr, csrColInd, cscVal, cscRowInd, cscColPtr, copyValues, idxBase)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz, copyValues, idxBase
  real(8), device :: csrVal(*), cscVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*), cscRowInd(*), cscColPtr(*)

5.8.22. cusparseCcsr2csc

此函数将以 CSR 存储格式(由三个数组 csrVal、csrRowPtr 和 csrColInd 定义)表示的稀疏矩阵转换为以 CSC 格式(由数组 cscVal、cscRowInd 和 cscColPtr 定义)表示的稀疏矩阵。

此函数已在 CUDA 11.0 中移除。请改用 cusparseCsr2cscEx2 例程。

integer(4) function cusparseCcsr2csc(handle, m, n, nnz, csrVal, csrRowPtr, csrColInd, cscVal, cscRowInd, cscColPtr, copyValues, idxBase)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz, copyValues, idxBase
  complex(4), device :: csrVal(*), cscVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*), cscRowInd(*), cscColPtr(*)

5.8.23. cusparseZcsr2csc

此函数将以 CSR 存储格式(由三个数组 csrVal、csrRowPtr 和 csrColInd 定义)表示的稀疏矩阵转换为以 CSC 格式(由数组 cscVal、cscRowInd 和 cscColPtr 定义)表示的稀疏矩阵。

此函数已在 CUDA 11.0 中移除。请改用 cusparseCsr2cscEx2 例程。

integer(4) function cusparseZcsr2csc(handle, m, n, nnz, csrVal, csrRowPtr, csrColInd, cscVal, cscRowInd, cscColPtr, copyValues, idxBase)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz, copyValues, idxBase
  complex(8), device :: csrVal(*), cscVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*), cscRowInd(*), cscColPtr(*)

5.8.24. cusparseCsr2cscEx2_bufferSize

此函数确定 cusparseCsr2cscEx2 所需的工作缓冲区的大小。

integer(4) function cusparseScsr2cscEx2_bufferSize(handle, m, n, nnz, csrVal, csrRowPtr, csrColInd, cscVal, &
           cscColPtr, cscRowInd, valType, copyValues, idxBase, alg, bufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz, valType, copyValues, idxBase, alg
  real(4), device :: csrVal(*), cscVal(*)  ! Can be any supported type
  integer(4), device :: csrRowPtr(*), csrColInd(*), cscRowInd(*), cscColPtr(*)
  integer(8) :: bufferSize

5.8.25. cusparseCsr2cscEx2

此函数将以 CSR 存储格式(由三个数组 csrVal、csrRowPtr 和 csrColInd 定义)表示的稀疏矩阵转换为以 CSC 格式(由数组 cscVal、cscRowInd 和 cscColPtr 定义)表示的稀疏矩阵。数组的类型由 valType 参数设置。

integer(4) function cusparseScsr2cscEx2(handle, m, n, nnz, csrVal, csrRowPtr, csrColInd, cscVal, &
           cscColPtr, cscRowInd, valType, copyValues, idxBase, alg, buffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz, valType, copyValues, idxBase, alg
  real(4), device :: csrVal(*), cscVal(*)  ! Can be any supported type
  integer(4), device :: csrRowPtr(*), csrColInd(*), cscRowInd(*), cscColPtr(*)
  integer(1), device :: buffer ! Can be any type

5.8.26. cusparseScsr2dense

此函数将以 CSR 格式(由三个数组 cscValA、cscRowPtrA 和 cscColIndA 定义)表示的稀疏矩阵转换为稠密格式的矩阵 A。稠密矩阵 A 用稀疏矩阵的值填充,其余位置用零填充。

integer(4) function cusparseScsr2dense(handle, m, n, descrA, csrValA, csrRowPtrA, csrColIndA, A, lda)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValA(*), A(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)

5.8.27. cusparseDcsr2dense

此函数将以 CSR 格式(由三个数组 cscValA、cscRowPtrA 和 cscColIndA 定义)表示的稀疏矩阵转换为稠密格式的矩阵 A。稠密矩阵 A 用稀疏矩阵的值填充,其余位置用零填充。

integer(4) function cusparseDcsr2dense(handle, m, n, descrA, csrValA, csrRowPtrA, csrColIndA, A, lda)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValA(*), A(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)

5.8.28. cusparseCcsr2dense

此函数将以 CSR 格式(由三个数组 cscValA、cscRowPtrA 和 cscColIndA 定义)表示的稀疏矩阵转换为稠密格式的矩阵 A。稠密矩阵 A 用稀疏矩阵的值填充,其余位置用零填充。

integer(4) function cusparseCcsr2dense(handle, m, n, descrA, csrValA, csrRowPtrA, csrColIndA, A, lda)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValA(*), A(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)

5.8.29. cusparseZcsr2dense

此函数将以 CSR 格式(由三个数组 cscValA、cscRowPtrA 和 cscColIndA 定义)表示的稀疏矩阵转换为稠密格式的矩阵 A。稠密矩阵 A 用稀疏矩阵的值填充,其余位置用零填充。

integer(4) function cusparseZcsr2dense(handle, m, n, descrA, csrValA, csrRowPtrA, csrColIndA, A, lda)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValA(*), A(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)

5.8.30. cusparseScsr2hyb

此函数将以 CSR 格式(由三个数组 cscValA、cscRowPtrA 和 cscColIndA 定义)表示的稀疏矩阵转换为 HYB 格式的稀疏矩阵。

integer(4) function cusparseScsr2hyb(handle, m, n, descrA, csrValA, csrRowPtrA, csrColIndA, hybA, userEllWidth, partitionType)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, userEllWidth, partitionType
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  real(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)

5.8.31. cusparseDcsr2hyb

此函数将以 CSR 格式(由三个数组 cscValA、cscRowPtrA 和 cscColIndA 定义)表示的稀疏矩阵转换为 HYB 格式的稀疏矩阵。

integer(4) function cusparseDcsr2hyb(handle, m, n, descrA, csrValA, csrRowPtrA, csrColIndA, hybA, userEllWidth, partitionType)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, userEllWidth, partitionType
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  real(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)

5.8.32. cusparseCcsr2hyb

此函数将以 CSR 格式(由三个数组 cscValA、cscRowPtrA 和 cscColIndA 定义)表示的稀疏矩阵转换为 HYB 格式的稀疏矩阵。

integer(4) function cusparseCcsr2hyb(handle, m, n, descrA, csrValA, csrRowPtrA, csrColIndA, hybA, userEllWidth, partitionType)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, userEllWidth, partitionType
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  complex(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)

5.8.33. cusparseZcsr2hyb

此函数将以 CSR 格式(由三个数组 cscValA、cscRowPtrA 和 cscColIndA 定义)表示的稀疏矩阵转换为 HYB 格式的稀疏矩阵。

integer(4) function cusparseZcsr2hyb(handle, m, n, descrA, csrValA, csrRowPtrA, csrColIndA, hybA, userEllWidth, partitionType)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, userEllWidth, partitionType
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  complex(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)

5.8.34. cusparseSdense2csc

此函数将稠密格式的矩阵 A 转换为 CSC 格式的稀疏矩阵。

integer(4) function cusparseSdense2csc(handle, m, n, descrA, A, lda, nnzPerCol, cscValA, cscRowIndA, cscColPtrA)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda
  type(cusparseMatDescr) :: descrA
  real(4), device :: A(*), cscValA(*)
  integer(4), device :: nnzPerCol(*), cscRowIndA(*), cscColPtrA(*)

5.8.35. cusparseDdense2csc

此函数将稠密格式的矩阵 A 转换为 CSC 格式的稀疏矩阵。

integer(4) function cusparseDdense2csc(handle, m, n, descrA, A, lda, nnzPerCol, cscValA, cscRowIndA, cscColPtrA)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda
  type(cusparseMatDescr) :: descrA
  real(8), device :: A(*), cscValA(*)
  integer(4), device :: nnzPerCol(*), cscRowIndA(*), cscColPtrA(*)

5.8.36. cusparseCdense2csc

此函数将稠密格式的矩阵 A 转换为 CSC 格式的稀疏矩阵。

integer(4) function cusparseCdense2csc(handle, m, n, descrA, A, lda, nnzPerCol, cscValA, cscRowIndA, cscColPtrA)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda
  type(cusparseMatDescr) :: descrA
  complex(4), device :: A(*), cscValA(*)
  integer(4), device :: nnzPerCol(*), cscRowIndA(*), cscColPtrA(*)

5.8.37. cusparseZdense2csc

此函数将稠密格式的矩阵 A 转换为 CSC 格式的稀疏矩阵。

integer(4) function cusparseZdense2csc(handle, m, n, descrA, A, lda, nnzPerCol, cscValA, cscRowIndA, cscColPtrA)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda
  type(cusparseMatDescr) :: descrA
  complex(8), device :: A(*), cscValA(*)
  integer(4), device :: nnzPerCol(*), cscRowIndA(*), cscColPtrA(*)

5.8.38. cusparseSdense2csr

此函数将稠密格式的矩阵 A 转换为 CSR 格式的稀疏矩阵。

integer(4) function cusparseSdense2csr(handle, m, n, descrA, A, lda, nnzPerRow, csrValA, csrRowPtrA, csrColIndA)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda
  type(cusparseMatDescr) :: descrA
  real(4), device :: A(*), csrValA(*)
  integer(4), device :: nnzPerRow(*), csrRowPtrA(*), csrColIndA(*)

5.8.39. cusparseDdense2csr

此函数将稠密格式的矩阵 A 转换为 CSR 格式的稀疏矩阵。

integer(4) function cusparseDdense2csr(handle, m, n, descrA, A, lda, nnzPerRow, csrValA, csrRowPtrA, csrColIndA)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda
  type(cusparseMatDescr) :: descrA
  real(8), device :: A(*), csrValA(*)
  integer(4), device :: nnzPerRow(*), csrRowPtrA(*), csrColIndA(*)

5.8.40. cusparseCdense2csr

此函数将稠密格式的矩阵 A 转换为 CSR 格式的稀疏矩阵。

integer(4) function cusparseCdense2csr(handle, m, n, descrA, A, lda, nnzPerRow, csrValA, csrRowPtrA, csrColIndA)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda
  type(cusparseMatDescr) :: descrA
  complex(4), device :: A(*), csrValA(*)
  integer(4), device :: nnzPerRow(*), csrRowPtrA(*), csrColIndA(*)

5.8.41. cusparseZdense2csr

此函数将稠密格式的矩阵 A 转换为 CSR 格式的稀疏矩阵。

integer(4) function cusparseZdense2csr(handle, m, n, descrA, A, lda, nnzPerRow, csrValA, csrRowPtrA, csrColIndA)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda
  type(cusparseMatDescr) :: descrA
  complex(8), device :: A(*), csrValA(*)
  integer(4), device :: nnzPerRow(*), csrRowPtrA(*), csrColIndA(*)

5.8.42. cusparseSdense2hyb

此函数将稠密格式的矩阵 A 转换为 HYB 格式的稀疏矩阵。

integer(4) function cusparseSdense2hyb(handle, m, n, descrA, A, lda, nnzPerRow, hybA, userEllWidth, partitionType)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda, userEllWidth, partitionType
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  real(4), device :: A(*)
  integer(4), device :: nnzPerRow(*)

5.8.43. cusparseDdense2hyb

此函数将稠密格式的矩阵 A 转换为 HYB 格式的稀疏矩阵。

integer(4) function cusparseDdense2hyb(handle, m, n, descrA, A, lda, nnzPerRow, hybA, userEllWidth, partitionType)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda, userEllWidth, partitionType
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  real(8), device :: A(*)
  integer(4), device :: nnzPerRow(*)

5.8.44. cusparseCdense2hyb

此函数将稠密格式的矩阵 A 转换为 HYB 格式的稀疏矩阵。

integer(4) function cusparseCdense2hyb(handle, m, n, descrA, A, lda, nnzPerRow, hybA, userEllWidth, partitionType)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda, userEllWidth, partitionType
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  complex(4), device :: A(*)
  integer(4), device :: nnzPerRow(*)

5.8.45. cusparseZdense2hyb

此函数将稠密格式的矩阵 A 转换为 HYB 格式的稀疏矩阵。

integer(4) function cusparseZdense2hyb(handle, m, n, descrA, A, lda, nnzPerRow, hybA, userEllWidth, partitionType)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, lda, userEllWidth, partitionType
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  complex(8), device :: A(*)
  integer(4), device :: nnzPerRow(*)

5.8.46. cusparseShyb2csc

此函数将 HYB 格式的稀疏矩阵 A 转换为 CSC 格式的稀疏矩阵。

integer(4) function cusparseShyb2csc(handle, descrA, hybA, cscValA, cscRowIndA, cscColPtrA)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  real(4), device :: cscValA(*)
  integer(4), device :: cscRowIndA(*), cscColPtrA(*)

5.8.47. cusparseDhyb2csc

此函数将 HYB 格式的稀疏矩阵 A 转换为 CSC 格式的稀疏矩阵。

integer(4) function cusparseDhyb2csc(handle, descrA, hybA, cscValA, cscRowIndA, cscColPtrA)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  real(8), device :: cscValA(*)
  integer(4), device :: cscRowIndA(*), cscColPtrA(*)

5.8.48. cusparseChyb2csc

此函数将 HYB 格式的稀疏矩阵 A 转换为 CSC 格式的稀疏矩阵。

integer(4) function cusparseChyb2csc(handle, descrA, hybA, cscValA, cscRowIndA, cscColPtrA)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  complex(4), device :: cscValA(*)
  integer(4), device :: cscRowIndA(*), cscColPtrA(*)

5.8.49. cusparseZhyb2csc

此函数将 HYB 格式的稀疏矩阵 A 转换为 CSC 格式的稀疏矩阵。

integer(4) function cusparseZhyb2csc(handle, descrA, hybA, cscValA, cscRowIndA, cscColPtrA)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  complex(8), device :: cscValA(*)
  integer(4), device :: cscRowIndA(*), cscColPtrA(*)

5.8.50. cusparseShyb2csr

此函数将 HYB 格式的稀疏矩阵 A 转换为 CSR 格式的稀疏矩阵。

integer(4) function cusparseShyb2csr(handle, descrA, hybA, csrValA, csrRowPtrA, csrColIndA)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  real(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)

5.8.51. cusparseDhyb2csr

此函数将 HYB 格式的稀疏矩阵 A 转换为 CSR 格式的稀疏矩阵。

integer(4) function cusparseDhyb2csr(handle, descrA, hybA, csrValA, csrRowPtrA, csrColIndA)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  real(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)

5.8.52. cusparseChyb2csr

此函数将 HYB 格式的稀疏矩阵 A 转换为 CSR 格式的稀疏矩阵。

integer(4) function cusparseChyb2csr(handle, descrA, hybA, csrValA, csrRowPtrA, csrColIndA)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  complex(4), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)

5.8.53. cusparseZhyb2csr

此函数将 HYB 格式的稀疏矩阵 A 转换为 CSR 格式的稀疏矩阵。

integer(4) function cusparseZhyb2csr(handle, descrA, hybA, csrValA, csrRowPtrA, csrColIndA)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  complex(8), device :: csrValA(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)

5.8.54. cusparseShyb2dense

此函数将 HYB 格式的稀疏矩阵转换为稠密格式的矩阵 A。稠密矩阵 A 用稀疏矩阵的值填充,其余位置用零填充。

integer(4) function cusparseShyb2dense(handle, descrA, hybA, A, lda)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  real(4), device :: A(*)
  integer(4) :: lda

5.8.55. cusparseDhyb2dense

此函数将 HYB 格式的稀疏矩阵转换为稠密格式的矩阵 A。稠密矩阵 A 用稀疏矩阵的值填充,其余位置用零填充。

integer(4) function cusparseDhyb2dense(handle, descrA, hybA, A, lda)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  real(8), device :: A(*)
  integer(4) :: lda

5.8.56. cusparseChyb2dense

此函数将 HYB 格式的稀疏矩阵转换为稠密格式的矩阵 A。稠密矩阵 A 用稀疏矩阵的值填充,其余位置用零填充。

integer(4) function cusparseChyb2dense(handle, descrA, hybA, A, lda)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  complex(4), device :: A(*)
  integer(4) :: lda

5.8.57. cusparseZhyb2dense

此函数将 HYB 格式的稀疏矩阵转换为稠密格式的矩阵 A。稠密矩阵 A 用稀疏矩阵的值填充,其余位置用零填充。

integer(4) function cusparseZhyb2dense(handle, descrA, hybA, A, lda)
  type(cusparseHandle) :: handle
  type(cusparseMatDescr) :: descrA
  type(cusparseHybMat) :: hybA
  complex(8), device :: A(*)
  integer(4) :: lda

5.8.58. cusparseSnnz

此函数计算稠密矩阵中每行或每列的非零元素数量以及非零元素的总数。

integer(4) function cusparseSnnz(handle, dirA, m, n, descrA, A, lda, nnzPerRowColumn, nnzTotalDevHostPtr)
  type(cusparseHandle) :: handle
  integer :: dirA, m, n, lda
  type(cusparseMatDescr) :: descrA
  real(4), device :: A(*)
  integer(4), device :: nnzPerRowColumn(*)
  integer(4), device :: nnzTotalDevHostPtr ! device or host variable

5.8.59. cusparseDnnz

此函数计算稠密矩阵中每行或每列的非零元素数量以及非零元素的总数。

integer(4) function cusparseDnnz(handle, dirA, m, n, descrA, A, lda, nnzPerRowColumn, nnzTotalDevHostPtr)
  type(cusparseHandle) :: handle
  integer :: dirA, m, n, lda
  type(cusparseMatDescr) :: descrA
  real(8), device :: A(*)
  integer(4), device :: nnzPerRowColumn(*)
  integer(4), device :: nnzTotalDevHostPtr ! device or host variable

5.8.60. cusparseCnnz

此函数计算稠密矩阵中每行或每列的非零元素数量以及非零元素的总数。

integer(4) function cusparseCnnz(handle, dirA, m, n, descrA, A, lda, nnzPerRowColumn, nnzTotalDevHostPtr)
  type(cusparseHandle) :: handle
  integer :: dirA, m, n, lda
  type(cusparseMatDescr) :: descrA
  complex(4), device :: A(*)
  integer(4), device :: nnzPerRowColumn(*)
  integer(4), device :: nnzTotalDevHostPtr ! device or host variable

5.8.61. cusparseZnnz

此函数计算稠密矩阵中每行或每列的非零元素数量以及非零元素的总数。

integer(4) function cusparseZnnz(handle, dirA, m, n, descrA, A, lda, nnzPerRowColumn, nnzTotalDevHostPtr)
  type(cusparseHandle) :: handle
  integer :: dirA, m, n, lda
  type(cusparseMatDescr) :: descrA
  complex(8), device :: A(*)
  integer(4), device :: nnzPerRowColumn(*)
  integer(4), device :: nnzTotalDevHostPtr ! device or host variable

5.8.62. cusparseSgebsr2gebsc_bufferSize

此函数返回 gebsr2gebsc 中使用的缓冲区大小。

integer(4) function cusparseSgebsr2gebsc_bufferSize(handle, mb, nb, nnzb, bsrVal, bsrRowPtr, bsrColInd, rowBlockDim, colBlockDim, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: mb, nb, nnzb
  real(4), device :: bsrVal(*)
  integer(4), device :: bsrRowPtr(*), bsrColInd(*)
  integer(4) :: rowBlockDim, colBlockDim
  integer(4) :: pBufferSize ! integer(8) also accepted

5.8.63. cusparseDgebsr2gebsc_bufferSize

此函数返回 gebsr2gebsc 中使用的缓冲区大小。

integer(4) function cusparseDgebsr2gebsc_bufferSize(handle, mb, nb, nnzb, bsrVal, bsrRowPtr, bsrColInd, rowBlockDim, colBlockDim, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: mb, nb, nnzb
  real(8), device :: bsrVal(*)
  integer(4), device :: bsrRowPtr(*), bsrColInd(*)
  integer(4) :: rowBlockDim, colBlockDim
  integer(4) :: pBufferSize ! integer(8) also accepted

5.8.64. cusparseCgebsr2gebsc_bufferSize

此函数返回 gebsr2gebsc 中使用的缓冲区大小。

integer(4) function cusparseCgebsr2gebsc_bufferSize(handle, mb, nb, nnzb, bsrVal, bsrRowPtr, bsrColInd, rowBlockDim, colBlockDim, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: mb, nb, nnzb
  complex(4), device :: bsrVal(*)
  integer(4), device :: bsrRowPtr(*), bsrColInd(*)
  integer(4) :: rowBlockDim, colBlockDim
  integer(4) :: pBufferSize ! integer(8) also accepted

5.8.65. cusparseZgebsr2gebsc_bufferSize

此函数返回 gebsr2gebsc 中使用的缓冲区大小。

integer(4) function cusparseZgebsr2gebsc_bufferSize(handle, mb, nb, nnzb, bsrVal, bsrRowPtr, bsrColInd, rowBlockDim, colBlockDim, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: mb, nb, nnzb
  complex(8), device :: bsrVal(*)
  integer(4), device :: bsrRowPtr(*), bsrColInd(*)
  integer(4) :: rowBlockDim, colBlockDim
  integer(4) :: pBufferSize ! integer(8) also accepted

5.8.66. cusparseSgebsr2gebsc

此函数将一般块 CSR 存储格式的稀疏矩阵转换为一般块 CSC 存储格式的稀疏矩阵。

integer(4) function cusparseSgebsr2gebsc(handle, mb, nb, nnzb, bsrVal, bsrRowPtr, &
           bsrColInd, rowBlockDim, colBlockDim, bscVal, bscRowInd, bscColPtr, copyValues, baseIdx, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: mb, nb, nnzb
  real(4), device :: bsrVal(*)
  integer(4), device :: bsrRowPtr(*), bsrColInd(*)
  integer(4) :: rowBlockDim, colBlockDim
  real(4), device :: bscVal(*)
  integer(4), device :: bscRowInd(*), bscColPtr(*)
  integer(4) :: copyValues, baseIdx
  character(c_char), device :: pBuffer(*)

5.8.67. cusparseDgebsr2gebsc

此函数将一般块 CSR 存储格式的稀疏矩阵转换为一般块 CSC 存储格式的稀疏矩阵。

integer(4) function cusparseDgebsr2gebsc(handle, mb, nb, nnzb, bsrVal, bsrRowPtr, &
           bsrColInd, rowBlockDim, colBlockDim, bscVal, bscRowInd, bscColPtr, copyValues, baseIdx, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: mb, nb, nnzb
  real(8), device :: bsrVal(*)
  integer(4), device :: bsrRowPtr(*), bsrColInd(*)
  integer(4) :: rowBlockDim, colBlockDim
  real(8), device :: bscVal(*)
  integer(4), device :: bscRowInd(*), bscColPtr(*)
  integer(4) :: copyValues, baseIdx
  character(c_char), device :: pBuffer(*)

5.8.68. cusparseCgebsr2gebsc

此函数将一般块 CSR 存储格式的稀疏矩阵转换为一般块 CSC 存储格式的稀疏矩阵。

integer(4) function cusparseCgebsr2gebsc(handle, mb, nb, nnzb, bsrVal, bsrRowPtr, &
           bsrColInd, rowBlockDim, colBlockDim, bscVal, bscRowInd, bscColPtr, copyValues, baseIdx, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: mb, nb, nnzb
  complex(4), device :: bsrVal(*)
  integer(4), device :: bsrRowPtr(*), bsrColInd(*)
  integer(4) :: rowBlockDim, colBlockDim
  complex(4), device :: bscVal(*)
  integer(4), device :: bscRowInd(*), bscColPtr(*)
  integer(4) :: copyValues, baseIdx
  character(c_char), device :: pBuffer(*)

5.8.69. cusparseZgebsr2gebsc

此函数将一般块 CSR 存储格式的稀疏矩阵转换为一般块 CSC 存储格式的稀疏矩阵。

integer(4) function cusparseZgebsr2gebsc(handle, mb, nb, nnzb, bsrVal, bsrRowPtr, &
           bsrColInd, rowBlockDim, colBlockDim, bscVal, bscRowInd, bscColPtr, copyValues, baseIdx, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: mb, nb, nnzb
  complex(8), device :: bsrVal(*)
  integer(4), device :: bsrRowPtr(*), bsrColInd(*)
  integer(4) :: rowBlockDim, colBlockDim
  complex(8), device :: bscVal(*)
  integer(4), device :: bscRowInd(*), bscColPtr(*)
  integer(4) :: copyValues, baseIdx
  character(c_char), device :: pBuffer(*)

5.8.70. cusparseSgebsr2gebsr_bufferSize

此函数返回 gebsr2gebsrnnz 和 gebsr2gebsr 中使用的缓冲区大小。

integer(4) function cusparseSgebsr2gebsr_bufferSize(handle, mb, nb, nnzb, bsrVal, bsrRowPtr, &
           bsrColInd, rowBlockDimA, colBlockDimA, rowBlockDimC, colBlockDimC, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: mb, nb, nnzb
  real(4), device :: bsrVal(*)
  integer(4), device :: bsrRowPtr(*), bsrColInd(*)
  integer(4) :: rowBlockDimA, colBlockDimA, rowBlockDimC, colBlockDimC
  integer(4) :: pBufferSize ! integer(8) also accepted

5.8.71. cusparseDgebsr2gebsr_bufferSize

此函数返回 gebsr2gebsrnnz 和 gebsr2gebsr 中使用的缓冲区大小。

integer(4) function cusparseDgebsr2gebsr_bufferSize(handle, mb, nb, nnzb, bsrVal, bsrRowPtr, &
           bsrColInd, rowBlockDimA, colBlockDimA, rowBlockDimC, colBlockDimC, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: mb, nb, nnzb
  real(8), device :: bsrVal(*)
  integer(4), device :: bsrRowPtr(*), bsrColInd(*)
  integer(4) :: rowBlockDimA, colBlockDimA, rowBlockDimC, colBlockDimC
  integer(4) :: pBufferSize ! integer(8) also accepted

5.8.72. cusparseCgebsr2gebsr_bufferSize

此函数返回 gebsr2gebsrnnz 和 gebsr2gebsr 中使用的缓冲区大小。

integer(4) function cusparseCgebsr2gebsr_bufferSize(handle, mb, nb, nnzb, bsrVal, bsrRowPtr, &
           bsrColInd, rowBlockDimA, colBlockDimA, rowBlockDimC, colBlockDimC, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: mb, nb, nnzb
  complex(4), device :: bsrVal(*)
  integer(4), device :: bsrRowPtr(*), bsrColInd(*)
  integer(4) :: rowBlockDimA, colBlockDimA, rowBlockDimC, colBlockDimC
  integer(4) :: pBufferSize ! integer(8) also accepted

5.8.73. cusparseZgebsr2gebsr_bufferSize

此函数返回 gebsr2gebsrnnz 和 gebsr2gebsr 中使用的缓冲区大小。

integer(4) function cusparseZgebsr2gebsr_bufferSize(handle, mb, nb, nnzb, bsrVal, bsrRowPtr, &
           bsrColInd, rowBlockDimA, colBlockDimA, rowBlockDimC, colBlockDimC, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: mb, nb, nnzb
  complex(8), device :: bsrVal(*)
  integer(4), device :: bsrRowPtr(*), bsrColInd(*)
  integer(4) :: rowBlockDimA, colBlockDimA, rowBlockDimC, colBlockDimC
  integer(4) :: pBufferSize ! integer(8) also accepted

5.8.74. cusparseXgebsr2gebsrNnz

cusparseXcsrgeamNnz 计算 CSRGEAM 将生成的非零元素的数量。

integer(4) function cusparseXgebsr2gebsrNnz(handle, dir, mb, nb, nnzb, descrA, bsrRowPtrA, &
           bsrColIndA, rowBlockDimA, colBlockDimA, descrC, bsrRowPtrC, rowBlockDimC, colBlockDimC, nnzTotalDevHostPtr, pBuffer)
  type(cusparseHandle) :: handle
  integer :: dir, mb, nb, nnzb
  type(cusparseMatDescr) :: descrA
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer :: rowBlockDimA, colBlockDimA
  type(cusparseMatDescr) :: descrC
  integer(4), device :: bsrRowPtrC(*)
  integer :: rowBlockDimC, colBlockDimC
  integer(4), device :: nnzTotalDevHostPtr ! device or host variable
  character, device :: pBuffer(*)

5.8.75. cusparseSgebsr2gebsr

此函数将由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 定义的一般 BSR 存储格式的稀疏矩阵转换为由数组 bsrValC、bsrRowPtrC 和 bsrColIndC 定义的另一种一般 BSR 格式的稀疏矩阵。

integer(4) function cusparseSgebsr2gebsr(handle, dir, mb, nb, nnzb, descrA, bsrValA, bsrRowPtrA, &
           bsrColIndA, rowBlockDimA, colBlockDimA, descrC, bsrValC, bsrRowPtrC, bsrColIndC, rowBlockDimC, colBlockDimC, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dir, mb, nb, nnzb
  type(cusparseMatDescr) :: descrA
  real(4), device :: bsrValA(*), bsrValC(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: rowBlockDimA, colBlockDimA
  type(cusparseMatDescr) :: descrC
  integer(4), device :: bsrRowPtrC(*), bsrColIndC(*)
  integer(4) :: rowBlockDimC, colBlockDimC
  character(c_char), device :: pBuffer(*)

5.8.76. cusparseDgebsr2gebsr

此函数将由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 定义的一般 BSR 存储格式的稀疏矩阵转换为由数组 bsrValC、bsrRowPtrC 和 bsrColIndC 定义的另一种一般 BSR 格式的稀疏矩阵。

integer(4) function cusparseDgebsr2gebsr(handle, dir, mb, nb, nnzb, descrA, bsrValA, bsrRowPtrA, &
           bsrColIndA, rowBlockDimA, colBlockDimA, descrC, bsrValC, bsrRowPtrC, bsrColIndC, rowBlockDimC, colBlockDimC, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dir, mb, nb, nnzb
  type(cusparseMatDescr) :: descrA
  real(8), device :: bsrValA(*), bsrValC(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: rowBlockDimA, colBlockDimA
  type(cusparseMatDescr) :: descrC
  integer(4), device :: bsrRowPtrC(*), bsrColIndC(*)
  integer(4) :: rowBlockDimC, colBlockDimC
  character(c_char), device :: pBuffer(*)

5.8.77. cusparseCgebsr2gebsr

此函数将由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 定义的一般 BSR 存储格式的稀疏矩阵转换为由数组 bsrValC、bsrRowPtrC 和 bsrColIndC 定义的另一种一般 BSR 格式的稀疏矩阵。

integer(4) function cusparseCgebsr2gebsr(handle, dir, mb, nb, nnzb, descrA, bsrValA, bsrRowPtrA, &
           bsrColIndA, rowBlockDimA, colBlockDimA, descrC, bsrValC, bsrRowPtrC, bsrColIndC, rowBlockDimC, colBlockDimC, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dir, mb, nb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(4), device :: bsrValA(*), bsrValC(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: rowBlockDimA, colBlockDimA
  type(cusparseMatDescr) :: descrC
  integer(4), device :: bsrRowPtrC(*), bsrColIndC(*)
  integer(4) :: rowBlockDimC, colBlockDimC
  character(c_char), device :: pBuffer(*)

5.8.78. cusparseZgebsr2gebsr

此函数将由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 定义的一般 BSR 存储格式的稀疏矩阵转换为由数组 bsrValC、bsrRowPtrC 和 bsrColIndC 定义的另一种一般 BSR 格式的稀疏矩阵。

integer(4) function cusparseZgebsr2gebsr(handle, dir, mb, nb, nnzb, descrA, bsrValA, bsrRowPtrA, &
           bsrColIndA, rowBlockDimA, colBlockDimA, descrC, bsrValC, bsrRowPtrC, bsrColIndC, rowBlockDimC, colBlockDimC, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dir, mb, nb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(8), device :: bsrValA(*), bsrValC(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: rowBlockDimA, colBlockDimA
  type(cusparseMatDescr) :: descrC
  integer(4), device :: bsrRowPtrC(*), bsrColIndC(*)
  integer(4) :: rowBlockDimC, colBlockDimC
  character(c_char), device :: pBuffer(*)

5.8.79. cusparseSgebsr2csr

此函数将由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 定义的一般 BSR 存储格式的稀疏矩阵转换为由数组 csrValC、csrRowPtrC 和 csrColIndC 定义的 CSR 格式的稀疏矩阵。

integer(4) function cusparseSgebsr2csr(handle, dir, mb, nb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, &
           rowBlockDimA, colBlockDimA, descrC, csrValC, csrRowPtrC, csrColIndC)
  type(cusparseHandle) :: handle
  integer(4) :: dir, mb, nb, nnzb
  type(cusparseMatDescr) :: descrA
  real(4), device :: bsrValA(*), csrValC(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: rowBlockDimA, colBlockDimA
  type(cusparseMatDescr) :: descrC
  integer(4), device :: csrRowPtrC(*), csrColIndC(*)

5.8.80. cusparseDgebsr2csr

此函数将由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 定义的一般 BSR 存储格式的稀疏矩阵转换为由数组 csrValC、csrRowPtrC 和 csrColIndC 定义的 CSR 格式的稀疏矩阵。

integer(4) function cusparseDgebsr2csr(handle, dir, mb, nb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, &
           rowBlockDimA, colBlockDimA, descrC, csrValC, csrRowPtrC, csrColIndC)
  type(cusparseHandle) :: handle
  integer(4) :: dir, mb, nb, nnzb
  type(cusparseMatDescr) :: descrA
  real(8), device :: bsrValA(*), csrValC(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: rowBlockDimA, colBlockDimA
  type(cusparseMatDescr) :: descrC
  integer(4), device :: csrRowPtrC(*), csrColIndC(*)

5.8.81. cusparseCgebsr2csr

此函数将由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 定义的一般 BSR 存储格式的稀疏矩阵转换为由数组 csrValC、csrRowPtrC 和 csrColIndC 定义的 CSR 格式的稀疏矩阵。

integer(4) function cusparseCgebsr2csr(handle, dir, mb, nb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, &
           rowBlockDimA, colBlockDimA, descrC, csrValC, csrRowPtrC, csrColIndC)
  type(cusparseHandle) :: handle
  integer(4) :: dir, mb, nb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(4), device :: bsrValA(*), csrValC(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: rowBlockDimA, colBlockDimA
  type(cusparseMatDescr) :: descrC
  integer(4), device :: csrRowPtrC(*), csrColIndC(*)

5.8.82. cusparseZgebsr2csr

此函数将由三个数组 bsrValA、bsrRowPtrA 和 bsrColIndA 定义的一般 BSR 存储格式的稀疏矩阵转换为由数组 csrValC、csrRowPtrC 和 csrColIndC 定义的 CSR 格式的稀疏矩阵。

integer(4) function cusparseZgebsr2csr(handle, dir, mb, nb, descrA, bsrValA, bsrRowPtrA, bsrColIndA, &
           rowBlockDimA, colBlockDimA, descrC, csrValC, csrRowPtrC, csrColIndC)
  type(cusparseHandle) :: handle
  integer(4) :: dir, mb, nb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(8), device :: bsrValA(*), csrValC(*)
  integer(4), device :: bsrRowPtrA(*), bsrColIndA(*)
  integer(4) :: rowBlockDimA, colBlockDimA
  type(cusparseMatDescr) :: descrC
  integer(4), device :: csrRowPtrC(*), csrColIndC(*)

5.8.83. cusparseScsr2gebsr_bufferSize

此函数返回 csr2gebsrnnz 和 csr2gebsr 中使用的缓冲区大小。

integer(4) function cusparseScsr2gebsr_bufferSize(handle, dir, m, n, descrA, csrVal, csrRowPtr, csrColInd, rowBlockDim, colBlockDim, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dir, m, n
  real(4), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*)
  integer(4) :: rowBlockDim, colBlockDim
  integer(4) :: pBufferSize ! integer(8) also accepted

5.8.84. cusparseDcsr2gebsr_bufferSize

此函数返回 csr2gebsrnnz 和 csr2gebsr 中使用的缓冲区大小。

integer(4) function cusparseDcsr2gebsr_bufferSize(handle, dir, m, n, descrA, csrVal, csrRowPtr, csrColInd, rowBlockDim, colBlockDim, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dir, m, n
  real(8), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*)
  integer(4) :: rowBlockDim, colBlockDim
  integer(4) :: pBufferSize ! integer(8) also accepted

5.8.85. cusparseCcsr2gebsr_bufferSize

此函数返回 csr2gebsrnnz 和 csr2gebsr 中使用的缓冲区大小。

integer(4) function cusparseCcsr2gebsr_bufferSize(handle, dir, m, n, descrA, csrVal, csrRowPtr, csrColInd, rowBlockDim, colBlockDim, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dir, m, n
  complex(4), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*)
  integer(4) :: rowBlockDim, colBlockDim
  integer(4) :: pBufferSize ! integer(8) also accepted

5.8.86. cusparseZcsr2gebsr_bufferSize

此函数返回 csr2gebsrnnz 和 csr2gebsr 中使用的缓冲区大小。

integer(4) function cusparseZcsr2gebsr_bufferSize(handle, dir, m, n, descrA, csrVal, csrRowPtr, csrColInd, rowBlockDim, colBlockDim, pBufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: dir, m, n
  complex(8), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*)
  integer(4) :: rowBlockDim, colBlockDim
  integer(4) :: pBufferSize ! integer(8) also accepted

5.8.87. cusparseXcsr2gebsrNnz

cusparseXcsrgeamNnz 计算 CSRGEAM 将生成的非零元素的数量。

integer(4) function cusparseXcsr2gebsrNnz(handle, dir, m, n, descrA, csrRowPtrA, csrColIndA, &
           descrC, bsrRowPtrC, rowBlockDimC, colBlockDimC, nnzTotalDevHostPtr, pBuffer)
  type(cusparseHandle) :: handle
  integer :: dir, m, n
  type(cusparseMatDescr) :: descrA
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseMatDescr) :: descrC
  integer(4), device :: bsrRowPtrC(*)
  integer :: rowBlockDimC, colBlockDimC
  integer(4), device :: nnzTotalDevHostPtr ! device or host variable
  character, device :: pBuffer(*)

5.8.88. cusparseScsr2gebsr

此函数将由三个数组 csrValA、csrRowPtrA 和 csrColIndA 定义的 CSR 存储格式的稀疏矩阵转换为由数组 bsrValC、bsrRowPtrC 和 bsrColIndC 定义的一般 BSR 格式的稀疏矩阵。

integer(4) function cusparseScsr2gebsr(handle, dir, m, n, descrA, csrValA, csrRowPtrA, csrColIndA, &
           descrC, bsrValC, bsrRowPtrC, bsrColIndC, rowBlockDimC, colBlockDimC, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dir, mb, nb, nnzb
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrValA(*), bsrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseMatDescr) :: descrC
  integer(4), device :: bsrRowPtrC(*), bsrColIndC(*)
  integer(4) :: rowBlockDimC, colBlockDimC
  character(c_char), device :: pBuffer(*)

5.8.89. cusparseDcsr2gebsr

此函数将由三个数组 csrValA、csrRowPtrA 和 csrColIndA 定义的 CSR 存储格式的稀疏矩阵转换为由数组 bsrValC、bsrRowPtrC 和 bsrColIndC 定义的一般 BSR 格式的稀疏矩阵。

integer(4) function cusparseDcsr2gebsr(handle, dir, m, n, descrA, csrValA, csrRowPtrA, csrColIndA, &
           descrC, bsrValC, bsrRowPtrC, bsrColIndC, rowBlockDimC, colBlockDimC, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dir, mb, nb, nnzb
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrValA(*), bsrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseMatDescr) :: descrC
  integer(4), device :: bsrRowPtrC(*), bsrColIndC(*)
  integer(4) :: rowBlockDimC, colBlockDimC
  character(c_char), device :: pBuffer(*)

5.8.90. cusparseCcsr2gebsr

此函数将由三个数组 csrValA、csrRowPtrA 和 csrColIndA 定义的 CSR 存储格式的稀疏矩阵转换为由数组 bsrValC、bsrRowPtrC 和 bsrColIndC 定义的一般 BSR 格式的稀疏矩阵。

integer(4) function cusparseCcsr2gebsr(handle, dir, m, n, descrA, csrValA, csrRowPtrA, csrColIndA, &
           descrC, bsrValC, bsrRowPtrC, bsrColIndC, rowBlockDimC, colBlockDimC, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dir, mb, nb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrValA(*), bsrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseMatDescr) :: descrC
  integer(4), device :: bsrRowPtrC(*), bsrColIndC(*)
  integer(4) :: rowBlockDimC, colBlockDimC
  character(c_char), device :: pBuffer(*)

5.8.91. cusparseZcsr2gebsr

此函数将由三个数组 csrValA、csrRowPtrA 和 csrColIndA 定义的 CSR 存储格式的稀疏矩阵转换为由数组 bsrValC、bsrRowPtrC 和 bsrColIndC 定义的一般 BSR 格式的稀疏矩阵。

integer(4) function cusparseZcsr2gebsr(handle, dir, m, n, descrA, csrValA, csrRowPtrA, csrColIndA, &
           descrC, bsrValC, bsrRowPtrC, bsrColIndC, rowBlockDimC, colBlockDimC, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: dir, mb, nb, nnzb
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrValA(*), bsrValC(*)
  integer(4), device :: csrRowPtrA(*), csrColIndA(*)
  type(cusparseMatDescr) :: descrC
  integer(4), device :: bsrRowPtrC(*), bsrColIndC(*)
  integer(4) :: rowBlockDimC, colBlockDimC
  character(c_char), device :: pBuffer(*)

5.8.92. cusparseCreateIdentityPermutation

此函数创建恒等映射。输出参数 p 通过 p = 0:1:(n-1) 表示此映射。此函数通常与 coosort、csrsort、cscsort 和 csr2csc_indexOnly 一起使用。

integer(4) function cusparseCreateIdentityPermutation(handle, n, p)
  type(cusparseHandle) :: handle
  integer(4) :: n
  integer(4), device :: p(*)

5.8.93. cusparseXcoosort_bufferSize

此函数返回 coosort 中使用的缓冲区大小。

integer(4) function cusparseXcoosort_bufferSize(handle, m, n, nnz, cooRows, cooCols, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz
  integer(4), device :: cooRows(*), cooCols(*)
  integer(8) :: pBufferSizeInBytes

5.8.94. cusparseXcoosortByRow

此函数对以 COO 格式存储的稀疏矩阵进行排序。

integer(4) function cusparseXcoosortByRow(handle, m, n, nnz, cooRows, cooCols, P, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz
  integer(4), device :: cooRows(*), cooCols(*), P(*)
  character(c_char), device :: pBuffer(*)

5.8.95. cusparseXcoosortByColumn

此函数对以 COO 格式存储的稀疏矩阵进行排序。

integer(4) function cusparseXcoosortByColumn(handle, m, n, nnz, cooRows, cooCols, P, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz
  integer(4), device :: cooRows(*), cooCols(*), P(*)
  character(c_char), device :: pBuffer(*)

5.8.96. cusparseXcsrsort_bufferSize

此函数返回 csrsort 中使用的缓冲区大小。

integer(4) function cusparseXcsrsort_bufferSize(handle, m, n, nnz, csrRowInd, csrColInd, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz
  integer(4), device :: csrRowInd(*), csrColInd(*)
  integer(8) :: pBufferSizeInBytes

5.8.97. cusparseXcsrsort

此函数对以 CSR 格式存储的稀疏矩阵进行排序。

integer(4) function cusparseXcsrsort(handle, m, n, nnz, csrRowInd, csrColInd, P, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz
  integer(4), device :: csrRowInd(*), csrColInd(*), P(*)
  character(c_char), device :: pBuffer(*)

5.8.98. cusparseXcscsort_bufferSize

此函数返回 cscsort 中使用的缓冲区大小。

integer(4) function cusparseXcscsort_bufferSize(handle, m, n, nnz, cscColPtr, cscRowInd, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz
  integer(4), device :: cscColPtr(*), cscRowInd(*)
  integer(8) :: pBufferSizeInBytes

5.8.99. cusparseXcscsort

此函数对以 CSC 格式存储的稀疏矩阵进行排序。

integer(4) function cusparseXcscsort(handle, m, n, nnz, cscColPtr, cscRowInd, P, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz
  integer(4), device :: cscColPtr(*), cscRowInd(*), P(*)
  character(c_char), device :: pBuffer(*)

5.8.100. cusparseScsru2csr_bufferSize

此函数返回 csru2csr 中使用的缓冲区大小。

integer(4) function cusparseScsru2csr_bufferSize(handle, m, n, nnz, csrVal, csrRowPtr, csrColInd, info, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz
  real(4), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*)
  type(cusparseCsru2csrInfo) :: info
  integer(8) :: pBufferSizeInBytes

5.8.101. cusparseDcsru2csr_bufferSize

此函数返回 csru2csr 中使用的缓冲区大小。

integer(4) function cusparseDcsru2csr_bufferSize(handle, m, n, nnz, csrVal, csrRowPtr, csrColInd, info, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz
  real(8), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*)
  type(cusparseCsru2csrInfo) :: info
  integer(8) :: pBufferSizeInBytes

5.8.102. cusparseCcsru2csr_bufferSize

此函数返回 csru2csr 中使用的缓冲区大小。

integer(4) function cusparseCcsru2csr_bufferSize(handle, m, n, nnz, csrVal, csrRowPtr, csrColInd, info, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz
  complex(4), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*)
  type(cusparseCsru2csrInfo) :: info
  integer(8) :: pBufferSizeInBytes

5.8.103. cusparseZcsru2csr_bufferSize

此函数返回 csru2csr 中使用的缓冲区大小。

integer(4) function cusparseZcsru2csr_bufferSize(handle, m, n, nnz, csrVal, csrRowPtr, csrColInd, info, pBufferSizeInBytes)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz
  complex(8), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*)
  type(cusparseCsru2csrInfo) :: info
  integer(8) :: pBufferSizeInBytes

5.8.104. cusparseScsru2csr

此函数将未排序的 CSR 格式转换为 CSR 格式。

integer(4) function cusparseScsru2csr(handle, m, n, nnz, descrA, csrVal, csrRowPtr, csrColInd, info, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*)
  type(cusparseCsru2csrInfo) :: info
  character(c_char), device :: pBuffer(*)

5.8.105. cusparseDcsru2csr

此函数将未排序的 CSR 格式转换为 CSR 格式。

integer(4) function cusparseDcsru2csr(handle, m, n, nnz, descrA, csrVal, csrRowPtr, csrColInd, info, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*)
  type(cusparseCsru2csrInfo) :: info
  character(c_char), device :: pBuffer(*)

5.8.106. cusparseCcsru2csr

此函数将未排序的 CSR 格式转换为 CSR 格式。

integer(4) function cusparseCcsru2csr(handle, m, n, nnz, descrA, csrVal, csrRowPtr, csrColInd, info, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*)
  type(cusparseCsru2csrInfo) :: info
  character(c_char), device :: pBuffer(*)

5.8.107. cusparseZcsru2csr

此函数将未排序的 CSR 格式转换为 CSR 格式。

integer(4) function cusparseZcsru2csr(handle, m, n, nnz, descrA, csrVal, csrRowPtr, csrColInd, info, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*)
  type(cusparseCsru2csrInfo) :: info
  character(c_char), device :: pBuffer(*)

5.8.108. cusparseScsr2csru

此函数执行从排序的 CSR 格式到未排序的 CSR 格式的反向转换。

integer(4) function cusparseScsr2csru(handle, m, n, nnz, descrA, csrVal, csrRowPtr, csrColInd, info, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz
  type(cusparseMatDescr) :: descrA
  real(4), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*)
  type(cusparseCsru2csrInfo) :: info
  character(c_char), device :: pBuffer(*)

5.8.109. cusparseDcsr2csru

此函数执行从排序的 CSR 格式到未排序的 CSR 格式的反向转换。

integer(4) function cusparseDcsr2csru(handle, m, n, nnz, descrA, csrVal, csrRowPtr, csrColInd, info, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz
  type(cusparseMatDescr) :: descrA
  real(8), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*)
  type(cusparseCsru2csrInfo) :: info
  character(c_char), device :: pBuffer(*)

5.8.110. cusparseCcsr2csru

此函数执行从排序的 CSR 格式到未排序的 CSR 格式的反向转换。

integer(4) function cusparseCcsr2csru(handle, m, n, nnz, descrA, csrVal, csrRowPtr, csrColInd, info, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz
  type(cusparseMatDescr) :: descrA
  complex(4), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*)
  type(cusparseCsru2csrInfo) :: info
  character(c_char), device :: pBuffer(*)

5.8.111. cusparseZcsr2csru

此函数执行从排序的 CSR 格式到未排序的 CSR 格式的反向转换。

integer(4) function cusparseZcsr2csru(handle, m, n, nnz, descrA, csrVal, csrRowPtr, csrColInd, info, pBuffer)
  type(cusparseHandle) :: handle
  integer(4) :: m, n, nnz
  type(cusparseMatDescr) :: descrA
  complex(8), device :: csrVal(*)
  integer(4), device :: csrRowPtr(*), csrColInd(*)
  type(cusparseCsru2csrInfo) :: info
  character(c_char), device :: pBuffer(*)

5.9. CUSPARSE 通用 API 函数

本节包含用于执行向量-向量 (SpVV)、矩阵-向量 (SpMV) 和矩阵-矩阵 (SpMM) 运算的通用 API 函数的接口。

5.9.1. cusparseDenseToSparse_bufferSize

此函数返回 cusparseDenseToSparse_analysis() 所需的工作空间大小。返回的值以字节为单位。

integer(4) function cusparseDenseToSparse_bufferSize(handle, matA, matB, alg, bufferSize)
  type(cusparseHandle) :: handle
  type(cusparseDnMatDescr) :: MatA
  type(cusparseSpMatDescr) :: matB
  integer(4) :: alg
  integer(8), intent(out) :: bufferSize

5.9.2. cusparseDenseToSparse_analysis

此函数更新稀疏矩阵描述符 matB 中所需的非零元素数量。

integer(4) function cusparseDenseToSparse_analysis(handle, matA, matB, alg, buffer)
  type(cusparseHandle) :: handle
  type(cusparseDnMatDescr) :: matA
  type(cusparseSpMatDescr) :: matB
  integer(4) :: alg
  integer(4), device :: buffer(*)

5.9.3. cusparseDenseToSparse_convert

此函数在描述符 matB 中提供的区域中填充稀疏矩阵值。

integer(4) function cusparseDenseToSparse_convert(handle, matA, matB, alg, buffer)
  type(cusparseHandle) :: handle
  type(cusparseDnMatDescr) :: matA
  type(cusparseSpMatDescr) :: matB
  integer(4) :: alg
  integer(4), device :: buffer(*)

5.9.4. cusparseSparseToDense_bufferSize

此函数返回 cusparseSparseToDense_analysis() 所需的工作空间大小。返回的值以字节为单位。

integer(4) function cusparseSparseToDense_bufferSize(handle, matA, matB, alg, bufferSize)
  type(cusparseHandle) :: handle
  type(cusparseSpMatDescr) :: MatA
  type(cusparseDnMatDescr) :: matB
  integer(4) :: alg
  integer(8), intent(out) :: bufferSize

5.9.5. cusparseSparseToDense

此函数在描述符 matB 中提供的区域中填充稠密值。

integer(4) function cusparseSparseToDense(handle, matA, matB, alg, buffer)
  type(cusparseHandle) :: handle
  type(cusparseSpMatDescr) :: matA
  type(cusparseDnMatDescr) :: matB
  integer(4) :: alg
  integer(4), device :: buffer(*)

5.9.6. cusparseCreateSpVec

此函数初始化通用 API 中使用的稀疏向量描述符。输入参数 indicesvalues 的类型、种类和秩实际上被忽略,并从输入参数 idxTypevalueType 中获取。向量被假定为连续的。idxBase 参数在 Fortran 中通常为 CUSPARSE_INDEX_BASE_ONE。

integer(4) function cusparseCreateSpVec(descr, size, nnz, indices, values, idxType, idxBase, valueType)
  type(cusparseSpVecDescr) :: descr
  integer(8) :: size, nnz
  integer(4), device :: indices(*)
  real(4), device    :: values(*)
  integer(4) :: idxType, idxBase, valueType

5.9.7. cusparseDestroySpVec

此函数释放与通用 API 中使用的稀疏向量描述符关联的主机内存。

integer(4) function cusparseDestroySpVec(descr)
  type(cusparseSpVecDescr) :: descr

5.9.8. cusparseSpVecGet

此函数返回通用 API 中使用的稀疏向量描述符中的字段。

integer(4) function cusparseSpVecGet(descr, size, nnz, indices, values, idxType, idxBase, valueType)
  type(cusparseSpVecDescr) :: descr
  integer(8) :: size, nnz
  type(c_devptr) :: indices
  type(c_devptr) :: values
  integer(4) :: idxType, idxBase, valueType

5.9.9. cusparseSpVecGetIndexBase

此函数返回通用 API 中使用的稀疏向量描述符中的 idxBase 字段。

integer(4) function cusparseSpVecGetIndexBase(descr, idxBase)
  type(cusparseSpVecDescr) :: descr
  integer(4) :: idxBase

5.9.10. cusparseSpVecGetValues

此函数返回通用 API 中使用的稀疏向量描述符中的 values 字段。

integer(4) function cusparseSpVecGetValues(descr, values)
  type(cusparseSpVecDescr) :: descr
  type(c_devptr) :: values

5.9.11. cusparseSpVecSetValues

此函数设置通用 API 中使用的稀疏向量描述符中的 values 字段。values 参数的类型、种类和秩被忽略;类型由描述符中的 valueType 字段确定。

integer(4) function cusparseSpVecSetValues(descr, values)
  type(cusparseSpVecDescr) :: descr
  real(4), device :: values(*)

5.9.12. cusparseCreateDnVec

此函数初始化通用 API 中使用的稠密向量描述符。values 输入参数的类型、种类和秩被忽略,并从输入参数 valueType 中获取。向量被假定为连续的。

integer(4) function cusparseCreateDnVec(descr, size, values, valueType)
  type(cusparseDnVecDescr) :: descr
  integer(8) :: size
  real(4), device    :: values(*)
  integer(4) :: valueType

5.9.13. cusparseDestroyDnVec

此函数释放与通用 API 中使用的稠密向量描述符关联的主机内存。

integer(4) function cusparseDestroyDnVec(descr)
  type(cusparseDnVecDescr) :: descr

5.9.14. cusparseDnVecGet

此函数返回通用 API 中使用的稠密向量描述符中的字段。

integer(4) function cusparseDnVecGet(descr, size, values, valueType)
  type(cusparseDnVecDescr) :: descr
  integer(8) :: size
  type(c_devptr) :: values
  integer(4) :: valueType

5.9.15. cusparseDnVecGetValues

此函数返回通用 API 中使用的稠密向量描述符中的 values 字段。

integer(4) function cusparseDnVecGetValues(descr, values)
  type(cusparseDnVecDescr) :: descr
  type(c_devptr) :: values

5.9.16. cusparseDnVecSetValues

此函数设置通用 API 中使用的稠密向量描述符中的 values 字段。values 参数的类型、种类和秩被忽略;类型由描述符中的 valueType 字段确定。

integer(4) function cusparseDnVecSetValues(descr, values)
  type(cusparseDnVecDescr) :: descr
  real(4), device :: values(*)

5.9.17. cusparseCreateCoo

此函数初始化通用 API 中使用的 COO 格式的稀疏矩阵描述符。输入参数 cooRowIndcooColIndcooValues 的类型、种类和秩实际上被忽略,并从输入参数 idxTypevalueType 中获取。idxBase 参数在 Fortran 中通常为 CUSPARSE_INDEX_BASE_ONE。

integer(4) function cusparseCreateCoo(descr, rows, cols, nnz, cooRowInd, cooColInd, cooValues, idxType, idxBase, valueType)
  type(cusparseSpMatDescr) :: descr
  integer(8) :: rows, cols, nnz
  integer(4), device :: cooRowInd(*), cooColInd(*)
  real(4), device    :: cooValues(*)
  integer(4) :: idxType, idxBase, valueType

5.9.18. cusparseCreateCooAoS

此函数初始化通用 API 中使用的具有结构数组布局的 COO 格式的稀疏矩阵描述符。输入参数 cooIndcooValues 的类型、种类和秩实际上被忽略,并从输入参数 idxTypevalueType 中获取。idxBase 参数在 Fortran 中通常为 CUSPARSE_INDEX_BASE_ONE。

integer(4) function cusparseCreateCooAoS(descr, rows, cols, nnz, cooInd, cooValues, idxType, idxBase, valueType)
  type(cusparseSpMatDescr) :: descr
  integer(8) :: rows, cols, nnz
  integer(4), device :: cooInd(*)
  real(4), device    :: cooValues(*)
  integer(4) :: idxType, idxBase, valueType

5.9.19. cusparseCreateCsr

此函数初始化通用 API 中使用的 CSR 格式的稀疏矩阵描述符。输入参数 csrRowOffsetscsrColIndcsrValues 的类型、种类和秩实际上被忽略,并从输入参数 csrRowOffsetsTypecsrColIndTypevalueType 中获取。idxBase 参数在 Fortran 中通常为 CUSPARSE_INDEX_BASE_ONE。

integer(4) function cusparseCreateCsr(descr, rows, cols, nnz, csrRowOffsets, csrColInd, csrValues, &
           csrRowOffsetsType, csrColIndType, idxBase, valueType)
  type(cusparseSpMatDescr) :: descr
  integer(8) :: rows, cols, nnz
  integer(4), device :: csrRowOffsets(*), csrColInd(*)
  real(4), device    :: csrValues(*)
  integer(4) :: csrRowOffsetsType, csrColIndType, idxBase, valueType

5.9.20. cusparseCreateBlockedEll

此函数初始化通用 API 中使用的 Blocked-Ellpack (ELL) 格式的稀疏矩阵描述符。输入参数 ellColIndellValues 的类型、种类和秩实际上被忽略,并从输入参数 ellIdxTypevalueType 中获取。idxBase 参数在 Fortran 中通常为 CUSPARSE_INDEX_BASE_ONE。

integer(4) function cusparseCreateBlockedEll(descr, rows, cols, &
       ellBlockSize, ellCols, ellColInd, ellValues, ellIdxType, idxBase, valueType)
  type(cusparseSpMatDescr) :: descr
  integer(8) :: rows, cols, ellBlockSize, ellCols
  integer(4), device :: ellColInd(*)
  real(4), device    :: ellValues(*)
  integer(4) :: ellIdxType, idxBase, valueType

5.9.21. cusparseDestroySpMat

此函数释放与通用 API 中使用的稀疏矩阵描述符关联的主机内存。

integer(4) function cusparseDestroySpMat(descr)
  type(cusparseSpMatDescr) :: descr

5.9.22. cusparseCooGet

此函数返回通用 API 中使用的 COO 格式的稀疏矩阵描述符中的字段。

integer(4) function cusparseCooGet(descr, rows, cols, nnz, cooRowInd, cooColInd, cooValues, idxType, idxBase, valueType)
  type(cusparseSpMatDescr) :: descr
  integer(8) :: rows, cols, nnz
  type(c_devptr) :: cooRowInd, cooColInd, cooValues
  integer(4) :: idxType, idxBase, valueType

5.9.23. cusparseCooAoSGet

此函数返回通用 API 中使用的结构数组布局的 COO 格式的稀疏矩阵描述符中的字段。

integer(4) function cusparseCooAoSGet(descr, rows, cols, nnz, cooInd, cooValues, idxType, idxBase, valueType)
  type(cusparseSpMatDescr) :: descr
  integer(8) :: rows, cols, nnz
  type(c_devptr) :: cooInd, cooValues
  integer(4) :: idxType, idxBase, valueType

5.9.24. cusparseCsrGet

此函数返回通用 API 中使用的 CSR 格式的稀疏矩阵描述符中的字段。

integer(4) function cusparseCsrGet(descr, rows, cols, nnz, csrRowOffsets, csrColInd, csrValues, &
           csrRowOffsetsType, crsColIndType, idxBase, valueType)
  type(cusparseSpMatDescr) :: descr
  integer(8) :: rows, cols, nnz
  type(c_devptr) :: csrRowOffsets, csrColInd, csrValues
  integer(4) :: csrRowOffsetsType, csrColIndType, idxBase, valueType

5.9.25. cusparseBlockedEllGet

此函数返回以 Blocked-Ellpack (ELL) 格式存储的稀疏矩阵描述符中的字段。

integer(4) function cusparseBlockedEllGet(descr, rows, cols, &
       ellBlockSize, ellCols, ellColInd, ellValues, ellIdxType, idxBase, valueType)
  type(cusparseSpMatDescr) :: descr
  integer(8) :: rows, cols, ellBlockSize, ellCols
  type(c_devptr) :: ellColInd, ellValues
  integer(4) :: ellIdxType, idxBase, valueType

5.9.26. cusparseCsrSetPointers

此函数设置通用 API 中使用的 CSR 格式的稀疏矩阵描述符中的指针。接受行偏移、列索引和值的任何类型。

integer(4) function cusparseCsrSetPointers(descr, csrRowOffsets, csrColInd, csrValues)
  type(cusparseSpMatDescr) :: descr
  integer(4), device :: csrRowOffsets(*), csrColInd(*)
  real(4), device :: csrValues(*)

5.9.27. cusparseCscSetPointers

此函数设置通用 API 中使用的 CSC 格式的稀疏矩阵描述符中的指针。接受列偏移、行索引和值的任何类型。

integer(4) function cusparseCscSetPointers(descr, cscColOffsets, cscRowInd, cscValues)
  type(cusparseSpMatDescr) :: descr
  integer(4), device :: cscColOffsets(*), cscRowInd(*)
  real(4), device :: cscValues(*)

5.9.28. cusparseSpMatGetFormat

此函数返回通用 API 中使用的稀疏矩阵描述符中的 format 字段。通用 API 的有效格式为 CUSPARSE_FORMAT_CSR、CUSPARSE_FORMAT_COO 和 CUSPARSE_FORMAT_COO_AOS。

integer(4) function cusparseSpMatGetFormat(descr, format)
  type(cusparseSpMatDescr) :: descr
  integer(4) :: format

5.9.29. cusparseSpMatGetIndexBase

此函数返回通用 API 中使用的稀疏矩阵描述符中的 idxBase 字段。

integer(4) function cusparseSpMatGetIndexBase(descr, idxBase)
  type(cusparseSpMatDescr) :: descr
  integer(4) :: idxBase

5.9.30. cusparseSpMatGetSize

此函数返回通用 API 中使用的稀疏矩阵描述符中的稀疏矩阵大小。

integer(4) function cusparseSpMatGetSize(descr, rows, cols, nnz)
  type(cusparseSpMatDescr) :: descr
  integer(8) :: rows, cols, nnz

5.9.31. cusparseSpMatGetValues

此函数返回通用 API 中使用的稀疏矩阵描述符中的 values 字段。

integer(4) function cusparseSpMatGetValues(descr, values)
  type(cusparseSpMatDescr) :: descr
  type(c_devptr) :: values

5.9.32. cusparseSpMatSetValues

此函数设置通用 API 中使用的稀疏矩阵描述符中的 values 字段。values 参数的类型、种类和秩被忽略;类型由描述符中的 valueType 字段确定。

integer(4) function cusparseSpMatSetValues(descr, values)
  type(cusparseSpMatDescr) :: descr
  real(4), device :: values(*)

5.9.33. cusparseSpMatGetStridedBatch

此函数返回通用 API 中使用的稀疏矩阵描述符中的 batchCount 字段。

integer(4) function cusparseSpMatGetStridedBatch(descr, batchCount)
  type(cusparseSpMatDescr) :: descr
  integer(4) :: batchCount

5.9.34. cusparseSpMatSetStridedBatch

此函数设置通用 API 中使用的稀疏矩阵描述符中的 batchCount 字段。它在版本 >= CUDA 12.0 中被移除。

integer(4) function cusparseSpMatSetStridedBatch(descr, batchCount)
  type(cusparseSpMatDescr) :: descr
  integer(4) :: batchCount

5.9.35. cusparseCooSetStridedBatch

此函数设置 COO 稀疏矩阵描述符中的 batchCountbatchStride 字段。

integer(4) function cusparseCooSetStridedBatch(descr, batchCount, &
      batchStride)
  type(cusparseSpMatDescr) :: descr
  integer(4) :: batchCount
  integer(8) :: batchStride

5.9.36. cusparseCsrSetStridedBatch

此函数设置 CSR 稀疏矩阵描述符中的 batchCountbatchStride 字段。

integer(4) function cusparseCsrSetStridedBatch(descr, batchCount, &
      offsetsBatchStride, columnsValuesBatchStride)
  type(cusparseSpMatDescr) :: descr
  integer(4) :: batchCount
  integer(8) :: offsetsBatchStride, columnsValuesBatchStride

5.9.37. cusparseBsrSetStridedBatch

此函数设置 BSR 稀疏矩阵描述符中的 batchCountbatchStride 字段。

integer(4) function cusparseBsrSetStridedBatch(descr, batchCount, &
      offsetsBatchStride, columnsBatchStride, valuesBatchStride)
  type(cusparseSpMatDescr) :: descr
  integer(4) :: batchCount
  integer(8) :: offsetsBatchStride, columnsBatchStride
  integer(8) :: valuesBatchStride

5.9.38. cusparseSpMatGetAttribute

此函数从通用 API 中使用的稀疏矩阵描述符返回稀疏矩阵属性。属性当前可以是 CUSPARSE_SPMAT_FILL_MODE 或 CUSPARSE_SPMAT_DIAG_TYPE。

integer(4) function cusparseSpMatGetAttribute(descr, attribute, data, dataSize)
  type(cusparseSpMatDescr), intent(in) :: descr
  integer(4), intent(in)  :: attribute
  integer(4), intent(out) :: data
  integer(8), intent(in)  :: dataSize

5.9.39. cusparseSpMatSetAttribute

此函数为通用 API 中使用的稀疏矩阵描述符设置稀疏矩阵属性。属性当前可以是 CUSPARSE_SPMAT_FILL_MODE 或 CUSPARSE_SPMAT_DIAG_TYPE。

integer(4) function cusparseSpMatSetAttribute(descr, attribute, data, dataSize)
  type(cusparseSpMatDescr), intent(out) :: descr
  integer(4), intent(in) :: attribute
  integer(4), intent(in) :: data
  integer(8), intent(in) :: dataSize

5.9.40. cusparseCreateDnMat

此函数初始化通用 API 中使用的稠密矩阵描述符。values 输入参数的类型、种类和秩被忽略,并从输入参数 valueType 中获取。Fortran 中的 order 参数通常应为 CUSPARSE_ORDER_COL。

integer(4) function cusparseCreateDnMat(descr, rows, cols, ld, values, valueType, order)
  type(cusparseDnMatDescr) :: descr
  integer(8) :: rows, cols, ld
  real(4), device    :: values(*)
  integer(4), value  :: valueType, order

5.9.41. cusparseDestroyDnMat

此函数释放与通用 API 中使用的稠密矩阵描述符关联的主机内存。

integer(4) function cusparseDestroyDnMat(descr)
  type(cusparseDnMatDescr) :: descr

5.9.42. cusparseDnMatGet

此函数返回通用 API 中使用的稠密矩阵描述符中的字段。

integer(4) function cusparseDnMatGet(descr, rows, cols, ld, values, valueType, order)
  type(cusparseDnMatDescr) :: descr
  integer(8) :: rows, cols, ld
  type(c_devptr) :: values
  integer(4) :: valueType, order

5.9.43. cusparseDnMatGetValues

此函数返回通用 API 中使用的稠密矩阵描述符中的 values 字段。

integer(4) function cusparseDnMatGetValues(descr, values)
  type(cusparseDnMatDescr) :: descr
  type(c_devptr) :: values

5.9.44. cusparseDnMatSetValues

此函数设置通用 API 中使用的稠密矩阵描述符中的 values 字段。values 参数的类型、种类和秩被忽略;类型由描述符中的 valueType 字段确定。

integer(4) function cusparseDnMatSetValues(descr, values)
  type(cusparseDnMatDescr) :: descr
  real(4), device :: values(*)

5.9.45. cusparseDnMatGetStridedBatch

此函数返回通用 API 中使用的稠密矩阵描述符中的 batchCount 字段。

integer(4) function cusparseDnMatGetStridedBatch(descr, batchCount)
  type(cusparseDnMatDescr) :: descr
  integer(4) :: batchCount

5.9.46. cusparseDnMatSetStridedBatch

此函数设置通用 API 中使用的稠密矩阵描述符中的 batchCount 字段。

integer(4) function cusparseDnMatSetStridedBatch(descr, batchCount)
  type(cusparseDnMatDescr) :: descr
  integer(4) :: batchCount

5.9.47. cusparseSpVV_bufferSize

此函数返回 cusparseSpVV() 所需的工作空间大小。返回的值以字节为单位。

integer(4) function cusparseSpVV_bufferSize(handle, opX, vecX, vecY, result, computeType, bufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: opX
  type(cusparseSpVecDescr) :: vecX
  type(cusparseDnVecDescr) :: vecY
  real(4), device    :: result ! device or host variable
  integer(4) :: computeType
  integer(8), intent(out) :: bufferSize

5.9.48. cusparseSpVV

此函数形成稀疏向量 vecX 和稠密向量 vecY 的点积。buffer 参数可以是任何类型,但大小应大于或等于从 cusparseSpVV_buffersize() 返回的大小。有关每个版本中支持的数据类型和 computetype 组合,请参阅 cuSPARSE 库文档。

integer(4) function cusparseSpVV(handle, opX, vecX, vecY, result, computeType, buffer)
  type(cusparseHandle) :: handle
  integer(4) :: opX
  type(cusparseSpVecDescr) :: vecX
  type(cusparseDnVecDescr) :: vecY
  real(4), device    :: result ! device or host variable
  integer(4) :: computeType
  integer(4), device :: buffer(*)

5.9.49. cusparseSpMV_bufferSize

此函数返回 cusparseSpMV() 所需的工作空间大小。返回的值以字节为单位。

integer(4) function cusparseSpMV_bufferSize(handle, opA, alpha, matA, vecX, beta, vecY, computeType, alg, bufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: opA
  real(4) :: alpha, beta ! device or host variable
  type(cusparseSpMatDescr) :: matA
  type(cusparseDnVecDescr) :: vecX, vecY
  integer(4) :: computeType, alg
  integer(8), intent(out) :: bufferSize

5.9.50. cusparseSpMV

此函数形成稀疏矩阵 matA 和稠密向量 vecX 的乘法,以生成稠密向量 vecYbuffer 参数可以是任何类型,但大小应大于或等于从 cusparseSpMV_buffersize() 返回的大小。参数 alphabeta 的类型应与 computeType 参数匹配。有关每个版本中支持的数据类型、computeType、稀疏格式和 alg 组合,请参阅 cuSPARSE 库文档。

integer(4) function cusparseSpMV(handle, opA, alpha, matA, vecX, beta, vecY, computeType, alg, buffer)
  type(cusparseHandle) :: handle
  integer(4) :: opA
  real(4), device :: alpha, beta ! device or host variable
  type(cusparseSpMatDescr) :: matA
  type(cusparseDnVecDescr) :: vecX, vecY
  integer(4) :: computeType, alg
  integer(4), device :: buffer(*)

5.9.51. cusparseSpSV_CreateDescr

此函数初始化用于求解稀疏三角系统的稀疏矩阵描述符。

integer(4) function cusparseSpSV_CreateDescr(descr)
  type(cusparseSpSVDescr) :: descr

5.9.52. cusparseSpSV_DestroyDescr

此函数释放并销毁用于求解稀疏三角系统的稀疏矩阵描述符。

integer(4) function cusparseSpSV_DestroyDescr(descr)
  type(cusparseSpSVDescr) :: descr

5.9.53. cusparseSpSV_bufferSize

此函数返回 cusparseSpSV() 所需的工作空间大小。返回的值以字节为单位。

integer(4) function cusparseSpSV_bufferSize(handle, opA, alpha, matA, vecX, vecY, &
  computeType, alg, spsvDescr, bufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: opA
  real(4) :: alpha ! device or host variable
  type(cusparseSpMatDescr) :: matA
  type(cusparseDnVecDescr) :: vecX, vecY
  integer(4) :: computeType, alg
  type(cusparseSpSVDescr) :: spsvDescr
  integer(8), intent(out) :: bufferSize

5.9.54. cusparseSpSV_analysis

此函数执行 cusparseSpSV() 所需的分析阶段。

integer(4) function cusparseSpSV_analysis(handle, opA, alpha, matA, vecX, vecY, &
  computeType, alg, spsvDescr, buffer)
  type(cusparseHandle) :: handle
  integer(4) :: opA
  real(4) :: alpha ! device or host variable
  type(cusparseSpMatDescr) :: matA
  type(cusparseDnVecDescr) :: vecX, vecY
  integer(4) :: computeType, alg
  type(cusparseSpSVDescr) :: spsvDescr
  integer(4), device :: buffer(*)

5.9.55. cusparseSpSV_solve

此函数执行稀疏三角线性系统的求解阶段。

integer(4) function cusparseSpSV_analysis(handle, opA, alpha, matA, vecX, vecY, &
  computeType, alg, spsvDescr)
  type(cusparseHandle) :: handle
  integer(4) :: opA
  real(4) :: alpha ! device or host variable
  type(cusparseSpMatDescr) :: matA
  type(cusparseDnVecDescr) :: vecX, vecY
  integer(4) :: computeType, alg
  type(cusparseSpSVDescr) :: spsvDescr

5.9.56. cusparseSpSV_updateMatrix

此函数更新 cusparseSpSV() 使用的稀疏矩阵中的值。值类型应与稀疏矩阵类型匹配。更新可以是针对整个矩阵 CUSPARSE_SPSV_UPDATE_GENERAL,也可以是针对对角线 CUSPARSE_SPSV_UPDATE_DIAGONAL。

integer(4) function cusparseSpSV_updateMatrix(handle, spsvDescr, &
      newValues, updatePart)
  type(cusparseHandle) :: handle
  type(cusparseSpSVDescr) :: spsvDescr
  real(4), device :: newValues(*)  ! Any type, same as the Matrix
  integer(4) :: updatePart  ! General or Diagonal

5.9.57. cusparseSpMM_bufferSize

此函数返回 cusparseSpMM() 所需的工作空间大小。返回的值以字节为单位。

integer(4) function cusparseSpMM_bufferSize(handle, opA, opB, alpha, matA, matB, beta, matC, computeType, alg, bufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: opA, opB
  real(4), device :: alpha, beta ! device or host variable
  type(cusparseSpMatDescr) :: matA
  type(cusparseDnMatDescr) :: matB, matC
  integer(4) :: computeType, alg
  integer(8), intent(out) :: bufferSize

5.9.58. cusparseSpMM_preprocess

此函数可用于加速 cusparseSpMM 计算。有关每个版本中支持的功能,请参阅 cuSPARSE 库文档。

integer(4) function cusparseSpMM_preprocess(handle, opA, opB, alpha, matA, matB, beta, matC, computeType, alg, buffer)
  type(cusparseHandle) :: handle
  integer(4) :: opA, opB
  real(4), device :: alpha, beta ! device or host variable
  type(cusparseSpMatDescr) :: matA
  type(cusparseDnMatDescr) :: matB, matC
  integer(4) :: computeType, alg
  integer(4), device :: buffer(*)

5.9.59. cusparseSpMM

此函数形成稀疏矩阵 matA 和稠密矩阵 matB 的乘法,以生成稠密矩阵 matCbuffer 参数可以是任何类型,但大小应大于或等于从 cusparseSpMM_buffersize() 返回的大小。参数 alphabeta 的类型应与 computeType 参数匹配。有关每个版本中支持的数据类型、computeType、稀疏格式和 alg 组合,请参阅 cuSPARSE 库文档。

integer(4) function cusparseSpMM(handle, opA, opB, alpha, matA, matB, beta, matC, computeType, alg, buffer)
  type(cusparseHandle) :: handle
  integer(4) :: opA, opB
  real(4), device :: alpha, beta ! device or host variable
  type(cusparseSpMatDescr) :: matA
  type(cusparseDnMatDescr) :: matB, matC
  integer(4) :: computeType, alg
  integer(4), device :: buffer(*)

5.9.60. cusparseSpSM_CreateDescr

此函数初始化用于求解稀疏三角系统的稀疏矩阵描述符,当存在多个 RHS 向量时。

integer(4) function cusparseSpSM_CreateDescr(descr)
  type(cusparseSpSMDescr) :: descr

5.9.61. cusparseSpSM_DestroyDescr

此函数释放并销毁用于求解稀疏三角系统的稀疏矩阵描述符。

integer(4) function cusparseSpSM_DestroyDescr(descr)
  type(cusparseSpSMDescr) :: descr

5.9.62. cusparseSpSM_bufferSize

此函数返回 cusparseSpSM() 所需的工作空间大小。返回的值以字节为单位。

integer(4) function cusparseSpSM_bufferSize(handle, opA, opB, alpha, matA, matB, matC, &
  computeType, alg, spsmDescr, bufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: opA, opB
  real(4) :: alpha ! device or host variable
  type(cusparseSpMatDescr) :: matA
  type(cusparseDnMatDescr) :: MatB, MatC
  integer(4) :: computeType, alg
  type(cusparseSpSMDescr) :: spsmDescr
  integer(8), intent(out) :: bufferSize

5.9.63. cusparseSpSM_analysis

此函数执行 cusparseSpSM() 所需的分析阶段。

integer(4) function cusparseSpSM_analysis(handle, opA, opB, alpha, &
  matA, matB, matC, computeType, alg, spsmDescr, buffer)
  type(cusparseHandle) :: handle
  integer(4) :: opA, opB
  real(4) :: alpha ! device or host variable
  type(cusparseSpMatDescr) :: matA
  type(cusparseDnMatDescr) :: matB, matC
  integer(4) :: computeType, alg
  type(cusparseSpMVDescr) :: spsmDescr
  integer(4), device :: buffer(*)

5.9.64. cusparseSpSM_solve

此函数执行稀疏三角线性系统的求解阶段。

integer(4) function cusparseSpSM_analysis(handle, opA, opB, &
  alpha, matA, matB, matC, computeType, alg, spsmDescr)
  type(cusparseHandle) :: handle
  integer(4) :: opA, opB
  real(4) :: alpha ! device or host variable
  type(cusparseSpMatDescr) :: matA
  type(cusparseDnMatDescr) :: matB, matC
  integer(4) :: computeType, alg
  type(cusparseSpSMDescr) :: spsmDescr

5.9.65. cusparseSDDMM_bufferSize

此函数返回 cusparseSDDMM() 所需的工作空间大小。返回的值以字节为单位。

integer(4) function cusparseSDDMM_bufferSize(handle, opA, opB, alpha, matA, matB, beta, matC, computeType, alg, bufferSize)
  type(cusparseHandle) :: handle
  integer(4) :: opA, opB
  real(4), device :: alpha, beta ! device or host variable
  type(cusparseDnMatDescr) :: matA, matB
  type(cusparseSpMatDescr) :: matC
  integer(4) :: computeType, alg
  integer(8), intent(out) :: bufferSize

5.9.66. cusparseSDDMM_preprocess

此函数可用于加速 cusparseSDDMM 计算。有关每个版本中支持的功能,请参阅 cuSPARSE 库文档。

integer(4) function cusparseSDDMM_preprocess(handle, opA, opB, alpha, matA, matB, beta, matC, computeType, alg, buffer)
  type(cusparseHandle) :: handle
  integer(4) :: opA, opB
  real(4), device :: alpha, beta ! device or host variable
  type(cusparseDnMatDescr) :: matA, matB
  type(cusparseSpMatDescr) :: matC
  integer(4) :: computeType, alg
  integer(4), device :: buffer(*)

5.9.67. cusparseSDDMM

此函数形成稠密矩阵 matA 和稠密矩阵 matB 的乘法,然后与矩阵 matC 的稀疏模式进行逐元素乘法。buffer 参数可以是任何类型,但大小应大于或等于从 cusparseSDDMM_buffersize() 返回的大小。参数 alphabeta 的类型应与 computeType 参数匹配。有关每个版本中支持的数据类型、computeType、稀疏格式和 alg 组合,请参阅 cuSPARSE 库文档。

integer(4) function cusparseSDDMM(handle, opA, opB, alpha, matA, matB, beta, matC, computeType, alg, buffer)
  type(cusparseHandle) :: handle
  integer(4) :: opA, opB
  real(4), device :: alpha, beta ! device or host variable
  type(cusparseDnMatDescr) :: matA, matB
  type(cusparseSpMatDescr) :: matC
  integer(4) :: computeType, alg
  integer(4), device :: buffer(*)

5.9.68. cusparseSpGEMM_CreateDescr

此函数初始化用于将两个稀疏矩阵相乘的稀疏矩阵描述符。

integer(4) function cusparseSpGEMM_CreateDescr(descr)
  type(cusparseSpGEMMDescr) :: descr

5.9.69. cusparseSpGEMM_DestroyDescr

此函数释放并销毁用于将两个稀疏矩阵相乘的稀疏矩阵描述符。

integer(4) function cusparseSpGEMM_DestroyDescr(descr)
  type(cusparseSpGEMMDescr) :: descr

5.9.70. cusparseSpGEMM_workEstimation

此函数以及 cusparseSpGEMM_compute() 都用于确定缓冲区需求和执行实际计算。在典型用法中,对 cusparseSgGEMM_workEstimation() 的第一次调用应为 buffer1 传递空指针。该函数将返回所需的大小要求。分配该空间后,应使用实际分配的 buffer1 参数再次调用 cusparseSpGEMM_workEstimation()

integer(4) function cusparseSpGEMM_workEstimation(handle, opA, opB, &
  alpha, matA, matB, beta, matC, computeType, alg, spgemmDescr, bufferSize1, buffer1)
  type(cusparseHandle) :: handle
  integer(4) :: opA, opB
  real(4) :: alpha, beta ! device or host variable
  type(cusparseSpMatDescr) :: matA, MatB, MatC
  integer(4) :: computeType, alg
  type(cusparseSpGEMMDescr) :: spgemmDescr
  integer(8) :: bufferSize1
  integer(4), device :: buffer1

5.9.71. cusparseSpGEMM_getNumProducts

此函数查询稀疏矩阵描述符以获取中间产品的数量。

integer(4) function cusparseSpGEMM_getNumProducts(descr, num_prods)
  type(cusparseSpGEMMDescr) :: descr
  integer(8) :: num_prods

5.9.72. cusparseSpGEMM_estimateMemory

此函数以及 cusparseSpGEMM_compute()cusparseSpGEMM_workEstimation() 用于确定执行 SpGEMM 算法 2 和 3 的内存需求。

integer(4) function cusparseSpGEMM_estimateMemory(handle, opA, opB, &
  alpha, matA, matB, beta, matC, computeType, alg, spgemmDescr, &
  chunk_fraction, bufferSize3, buffer3, bufferSize2)
  type(cusparseHandle) :: handle
  integer(4) :: opA, opB
  real(4) :: alpha, beta ! device or host variable
  type(cusparseSpMatDescr) :: matA, MatB, MatC
  integer(4) :: computeType, alg
  type(cusparseSpGEMMDescr) :: spgemmDescr
  real(4) :: chunk_fraction
  integer(8) :: bufferSize3
  integer(4), device :: buffer3  ! Any type is okay
  integer(8) :: bufferSize2

5.9.73. cusparseSpGEMM_compute

此函数与 cusparseSpGEMM_workEstimation() 一起使用,用于确定缓冲区需求和执行实际计算。在典型用法中,首次调用 cusparseSgGEMM_compute() 时,应为 buffer2 传递空指针。该函数将返回所需的空间大小。一旦分配了该空间,应使用实际分配的 buffer2 参数再次调用 cusparseSpGEMM_compute()

integer(4) function cusparseSpGEMM_compute(handle, opA, opB, &
  alpha, matA, matB, beta, matC, computeType, alg, spgemmDescr, bufferSize2, buffer2)
  type(cusparseHandle) :: handle
  integer(4) :: opA, opB
  real(4) :: alpha, beta ! device or host variable
  type(cusparseSpMatDescr) :: matA, MatB, MatC
  integer(4) :: computeType, alg
  type(cusparseSpGEMMDescr) :: spgemmDescr
  integer(8) :: bufferSize2
  integer(4), device :: buffer2

5.9.74. cusparseSpGEMM_copy

此函数与 cusparseSpGEMM_workEstimation()cusparseSgGEMM_compute() 一起用于执行稀疏矩阵乘法。工作缓冲区的指针保存在 spgemmDescr 参数中。

integer(4) function cusparseSpGEMM_copy(handle, opA, opB, &
  alpha, matA, matB, beta, matC, computeType, alg, spgemmDescr)
  type(cusparseHandle) :: handle
  integer(4) :: opA, opB
  real(4) :: alpha, beta ! device or host variable
  type(cusparseSpMatDescr) :: matA, MatB, MatC
  integer(4) :: computeType, alg
  type(cusparseSpGEMMDescr) :: spgemmDescr

以下是执行稀疏矩阵乘法所需的一组调用的示例

! Create a csr descriptor for sparse C.  Sizes unknown
status = cusparseCreateCsr(matC, nd, nd, 0, nullp, nullp, &
           nullp, CUSPARSE_INDEX_32I, CUSPARSE_INDEX_32I, &
           CUSPARSE_INDEX_BASE_ONE, CUDA_R_64F)
call printStatus('cusparseCreateCsr', status, CUSPARSE_STATUS_SUCCESS)

status = cusparseSpGEMM_workEstimation(h, CUSPARSE_OPERATION_NON_TRANSPOSE, &
         CUSPARSE_OPERATION_NON_TRANSPOSE, Dalpha, matA, matB, Dbeta, &
         matC, CUDA_R_64F, CUSPARSE_SPGEMM_DEFAULT, spgemmd, bsize, nullp)
call printStatus('cusparseSpGEMM_workEstimation', status, CUSPARSE_STATUS_SUCCESS)

print *,"SpGEMM buffersize1 required: ",bsize
if (bsize.gt.0) allocate(buffer_d(bsize))

status = cusparseSpGEMM_workEstimation(h, CUSPARSE_OPERATION_NON_TRANSPOSE, &
         CUSPARSE_OPERATION_NON_TRANSPOSE, Dalpha, matA, matB, Dbeta, &
         matC, CUDA_R_64F, CUSPARSE_SPGEMM_DEFAULT, spgemmd, bsize, buffer_d)
call printStatus('cusparseSpGEMM_workEstimation', status, CUSPARSE_STATUS_SUCCESS)

status = cusparseSpGEMM_compute(h, CUSPARSE_OPERATION_NON_TRANSPOSE, &
         CUSPARSE_OPERATION_NON_TRANSPOSE, Dalpha, matA, matB, Dbeta, &
         matC, CUDA_R_64F, CUSPARSE_SPGEMM_DEFAULT, spgemmd, bsize2, nullp)
call printStatus('cusparseSpGEMM_compute', status, CUSPARSE_STATUS_SUCCESS)

print *,"SpGEMM buffersize2 required: ",bsize2
if (bsize2.gt.0) allocate(buffer2_d(bsize2))

status = cusparseSpGEMM_compute(h, CUSPARSE_OPERATION_NON_TRANSPOSE, &
         CUSPARSE_OPERATION_NON_TRANSPOSE, Dalpha, matA, matB, Dbeta, &
         matC, CUDA_R_64F, CUSPARSE_SPGEMM_DEFAULT, spgemmd, bsize2, buffer2_d)
call printStatus('cusparseSpGEMM_compute', status, CUSPARSE_STATUS_SUCCESS)

status = cusparseSpMatGetSize(matC, nrows, ncols, nnz)
print *,"SpGEMM C matrix sizes: ",nrows, ncols, nnz
if (nrows.gt.0) allocate(csrRowPtrC_d(nrows+1))
if (nnz.gt.0) allocate(csrColIndC_d(nnz))
if (nnz.gt.0) allocate(csrValDC_d(nnz))

status = cusparseCsrSetPointers(matC, csrRowPtrC_d, csrColIndC_d, csrValDC_d)
call printStatus('cusparseCsrSetPointers', status, CUSPARSE_STATUS_SUCCESS)

status = cusparseSpGEMM_copy(h, CUSPARSE_OPERATION_NON_TRANSPOSE, &
         CUSPARSE_OPERATION_NON_TRANSPOSE, Dalpha, matA, matB, Dbeta, &
         matC, CUDA_R_64F, CUSPARSE_SPGEMM_DEFAULT, spgemmd)
call printStatus('cusparseSpGEMM_copy', status, CUSPARSE_STATUS_SUCCESS)

if (bsize.gt.0) deallocate(buffer_d)
if (bsize2.gt.0) deallocate(buffer2_d)

5.9.75. cusparseSpGEMMreuse_workEstimation

此函数以及 cusparseSpGEMM_compute() 都用于确定缓冲区需求和执行实际计算。在典型用法中,对 cusparseSgGEMM_workEstimation() 的第一次调用应为 buffer1 传递空指针。该函数将返回所需的大小要求。分配该空间后,应使用实际分配的 buffer1 参数再次调用 cusparseSpGEMM_workEstimation()

integer(4) function cusparseSpGEMMreuse_workEstimation(handle, opA, opB, &
  alpha, matA, matB, beta, matC, computeType, alg, spgemmDescr, bufferSize1, buffer1)
  type(cusparseHandle) :: handle
  integer(4) :: opA, opB
  real(4) :: alpha, beta ! device or host variable
  type(cusparseSpMatDescr) :: matA, MatB, MatC
  integer(4) :: computeType, alg
  type(cusparseSpGEMMDescr) :: spgemmDescr
  integer(8) :: bufferSize1
  integer(4), device :: buffer1

5.9.76. cusparseSpGEMMreuse_nnz

此函数以及 cusparseSpGEMM_compute() 都用于确定缓冲区需求和执行实际计算。在典型用法中,对 cusparseSgGEMM_workEstimation() 的第一次调用应为 buffer1 传递空指针。该函数将返回所需的大小要求。分配该空间后,应使用实际分配的 buffer1 参数再次调用 cusparseSpGEMM_workEstimation()

integer(4) function cusparseSpGEMMreuse_nnz(handle, opA, opB, &
      alpha, matA, matB, beta, matC, computeType, alg, spgemmDescr, bufferSize2, buffer2, &
      bufferSize3, buffer3, bufferSize4, buffer4)
  type(cusparseHandle) :: handle
  integer(4) :: opA, opB
  real(4) :: alpha, beta ! device or host variable
  type(cusparseSpMatDescr) :: matA, MatB, MatC
  integer(4) :: computeType, alg
  type(cusparseSpGEMMDescr) :: spgemmDescr
  integer(8) :: bufferSize2, bufferSize3, bufferSize4
  integer(4), device :: buffer2, buffer3, buffer4

5.9.77. cusparseSpGEMMreuse_copy

此函数以及 cusparseSpGEMM_compute() 都用于确定缓冲区需求和执行实际计算。在典型用法中,对 cusparseSgGEMM_workEstimation() 的第一次调用应为 buffer1 传递空指针。该函数将返回所需的大小要求。分配该空间后,应使用实际分配的 buffer1 参数再次调用 cusparseSpGEMM_workEstimation()

integer(4) function cusparseSpGEMMreuse_copy(handle, opA, opB, &
  alpha, matA, matB, beta, matC, computeType, alg, spgemmDescr, bufferSize5, buffer5)
  type(cusparseHandle) :: handle
  integer(4) :: opA, opB
  real(4) :: alpha, beta ! device or host variable
  type(cusparseSpMatDescr) :: matA, MatB, MatC
  integer(4) :: computeType, alg
  type(cusparseSpGEMMDescr) :: spgemmDescr
  integer(8) :: bufferSize5
  integer(4), device :: buffer5

5.9.78. cusparseSpGEMMreuse_compute

此函数以及 cusparseSpGEMM_compute() 都用于确定缓冲区需求和执行实际计算。在典型用法中,对 cusparseSgGEMM_workEstimation() 的第一次调用应为 buffer1 传递空指针。该函数将返回所需的大小要求。分配该空间后,应使用实际分配的 buffer1 参数再次调用 cusparseSpGEMM_workEstimation()

integer(4) function cusparseSpGEMMreuse_compute(handle, opA, opB, &
  alpha, matA, matB, beta, matC, computeType, alg, spgemmDescr)
  type(cusparseHandle) :: handle
  integer(4) :: opA, opB
  real(4) :: alpha, beta ! device or host variable
  type(cusparseSpMatDescr) :: matA, MatB, MatC
  integer(4) :: computeType, alg
  type(cusparseSpGEMMDescr) :: spgemmDescr

6. 矩阵求解器运行时库 API

本节介绍 CUDA cuSOLVER 库的 Fortran 接口。cuSOLVER 函数只能从主机代码访问。所有运行时 API 例程都是返回错误代码的整数函数;如果调用成功,它们将返回值 CUSOLVER_STATUS_SUCCESS,如果出现错误,则返回另一个 cuSOLVER 状态返回值。

目前,我们为 cuSolverDN(密集 LAPACK 函数)提供 Fortran 接口。

第 10 章包含从 OpenACC 和 CUDA Fortran 访问 cuSOLVER 库例程的示例。在这两种情况下,可以通过添加以下行来公开库的接口

use cusolverDn

到您的程序单元。

除非提供了特定的 kind,否则接口中使用的普通 integer 类型表示 integer(4),而普通 real 类型表示 real(4)。

6.1. CUSOLVER 定义和辅助函数

本节包含 cuSOLVER 库中使用的定义和数据类型,以及 cuSOLVER 辅助函数的接口。

cuSOLVER 模块包含以下派生类型定义

! Definitions from cusolver_common.h
integer, parameter :: CUSOLVER_VER_MAJOR = 11
integer, parameter :: CUSOLVER_VER_MINOR = 6
integer, parameter :: CUSOLVER_VER_PATCH = 4

cuSOLVER 模块包含以下枚举

enum, bind(c)
    enumerator :: CUSOLVER_STATUS_SUCCESS                   = 0
    enumerator :: CUSOLVER_STATUS_NOT_INITIALIZED           = 1
    enumerator :: CUSOLVER_STATUS_ALLOC_FAILED              = 2
    enumerator :: CUSOLVER_STATUS_INVALID_VALUE             = 3
    enumerator :: CUSOLVER_STATUS_ARCH_MISMATCH             = 4
    enumerator :: CUSOLVER_STATUS_MAPPING_ERROR             = 5
    enumerator :: CUSOLVER_STATUS_EXECUTION_FAILED          = 6
    enumerator :: CUSOLVER_STATUS_INTERNAL_ERROR            = 7
    enumerator :: CUSOLVER_STATUS_MATRIX_TYPE_NOT_SUPPORTED = 8
    enumerator :: CUSOLVER_STATUS_NOT_SUPPORTED             = 9
    enumerator :: CUSOLVER_STATUS_ZERO_PIVOT                = 10
    enumerator :: CUSOLVER_STATUS_INVALID_LICENSE           = 11
    enumerator :: CUSOLVER_STATUS_IRS_PARAMS_NOT_INITIALIZED= 12
    enumerator :: CUSOLVER_STATUS_IRS_PARAMS_INVALID        = 13
    enumerator :: CUSOLVER_STATUS_IRS_PARAMS_INVALID_PREC   = 14
    enumerator :: CUSOLVER_STATUS_IRS_PARAMS_INVALID_REFINE = 15
    enumerator :: CUSOLVER_STATUS_IRS_PARAMS_INVALID_MAXITER= 16
    enumerator :: CUSOLVER_STATUS_IRS_INTERNAL_ERROR        = 20
    enumerator :: CUSOLVER_STATUS_IRS_NOT_SUPPORTED         = 21
    enumerator :: CUSOLVER_STATUS_IRS_OUT_OF_RANGE          = 22
    enumerator :: CUSOLVER_STATUS_IRS_NRHS_NOT_SUPPORTED_FOR_REFINE_GMRES=23
    enumerator :: CUSOLVER_STATUS_IRS_INFOS_NOT_INITIALIZED = 25
    enumerator :: CUSOLVER_STATUS_IRS_INFOS_NOT_DESTROYED   = 26
    enumerator :: CUSOLVER_STATUS_IRS_MATRIX_SINGULAR       = 30
    enumerator :: CUSOLVER_STATUS_INVALID_WORKSPACE         = 31
end enum
enum, bind(c)
    enumerator :: CUSOLVER_EIG_TYPE_1 = 1
    enumerator :: CUSOLVER_EIG_TYPE_2 = 2
    enumerator :: CUSOLVER_EIG_TYPE_3 = 3
end enum
enum, bind(c)
    enumerator :: CUSOLVER_EIG_MODE_NOVECTOR = 0
    enumerator :: CUSOLVER_EIG_MODE_VECTOR   = 1
end enum
enum, bind(c)
    enumerator :: CUSOLVER_EIG_RANGE_ALL = 1001
    enumerator :: CUSOLVER_EIG_RANGE_I   = 1002
    enumerator :: CUSOLVER_EIG_RANGE_V   = 1003
end enum
enum, bind(c)
    enumerator :: CUSOLVER_INF_NORM = 104
    enumerator :: CUSOLVER_MAX_NORM = 105
    enumerator :: CUSOLVER_ONE_NORM = 106
    enumerator :: CUSOLVER_FRO_NORM = 107
end enum
enum, bind(c)
    enumerator :: CUSOLVER_IRS_REFINE_NOT_SET          = 1100
    enumerator :: CUSOLVER_IRS_REFINE_NONE             = 1101
    enumerator :: CUSOLVER_IRS_REFINE_CLASSICAL        = 1102
    enumerator :: CUSOLVER_IRS_REFINE_CLASSICAL_GMRES  = 1103
    enumerator :: CUSOLVER_IRS_REFINE_GMRES            = 1104
    enumerator :: CUSOLVER_IRS_REFINE_GMRES_GMRES      = 1105
    enumerator :: CUSOLVER_IRS_REFINE_GMRES_NOPCOND    = 1106

    enumerator :: CUSOLVER_PREC_DD           = 1150
    enumerator :: CUSOLVER_PREC_SS           = 1151
    enumerator :: CUSOLVER_PREC_SHT          = 1152
end enum
enum, bind(c)
    enumerator :: CUSOLVER_R_8I  = 1201
    enumerator :: CUSOLVER_R_8U  = 1202
    enumerator :: CUSOLVER_R_64F = 1203
    enumerator :: CUSOLVER_R_32F = 1204
    enumerator :: CUSOLVER_R_16F = 1205
    enumerator :: CUSOLVER_R_16BF  = 1206
    enumerator :: CUSOLVER_R_TF32  = 1207
    enumerator :: CUSOLVER_R_AP  = 1208
    enumerator :: CUSOLVER_C_8I  = 1211
    enumerator :: CUSOLVER_C_8U  = 1212
    enumerator :: CUSOLVER_C_64F = 1213
    enumerator :: CUSOLVER_C_32F = 1214
    enumerator :: CUSOLVER_C_16F = 1215
    enumerator :: CUSOLVER_C_16BF  = 1216
    enumerator :: CUSOLVER_C_TF32  = 1217
    enumerator :: CUSOLVER_C_AP  = 1218
end enum
enum, bind(c)
    enumerator :: CUSOLVER_ALG_0 = 0
    enumerator :: CUSOLVER_ALG_1 = 1
end enum
enum, bind(c)
    enumerator :: CUBLAS_STOREV_COLUMNWISE = 0
    enumerator :: CUBLAS_STOREV_ROWWISE    = 1
end enum
enum, bind(c)
    enumerator :: CUBLAS_DIRECT_FORWARD    = 0
    enumerator :: CUBLAS_DIRECT_BACKWARD   = 1
end enum

cuSOLVERDN 模块包含以下枚举和类型定义

type cusolverDnHandle
  type(c_ptr) :: handle
end type

type cusolverDnParams
  type(c_ptr) :: params
end type

type cusolverDnSyevjInfo
  type(c_ptr) :: info
end type

enum, bind(c)
    enumerator :: CUSOLVERDN_GETRF = 0
end enum

6.1.1. cusolverDnCreate

此函数初始化 cusolverDn 库,并在 cusolverDn 上下文中创建句柄。必须在调用任何其他 cuSolverDn API 函数之前调用它。它分配访问 GPU 所需的硬件资源。

integer(4) function cusolverDnCreate(handle)
  type(cusolverDnHandle) :: handle

6.1.2. cusolverDnDestroy

此函数释放 cuSolverDn 库使用的 CPU 端资源。

integer(4) function cusolverDnDestroy(handle)
  type(cusolverDnHandle) :: handle

6.1.3. cusolverDnCreateParams

此函数创建 64 位 API 结构并将其初始化为默认值。

integer(4) function cusolverDnCreateParams(params)
  type(cusolverDnParams) :: params

6.1.4. cusolverDnDestroyParams

此函数释放 64 位 API 结构使用的任何资源。

integer(4) function cusolverDnDestroyParams(params)
  type(cusolverDnParams) :: params

6.1.5. cusolverDnCreateSyevjInfo

此函数创建 Syevj API 结构并将其初始化为默认值。

integer(4) function cusolverDnCreateSyevjInfo(info)
  type(cusolverDnSyevjInfo) :: info

6.1.6. cusolverDnDestroySyevjInfo

此函数释放 Syevj API 结构使用的任何资源。

integer(4) function cusolverDnDestroySyevjInfo(info)
  type(cusolverDnSyevjInfo) :: info

6.1.7. cusolverDnSetAdvOptions

此函数配置 64 位 API 中使用的算法。

integer(4) function cusolverDnSetAdvOptions(params, function, algo)
   type(cusolverDnParams) :: params
   integer(4) :: function, algo

6.1.8. cusolverDnGetStream

此函数获取 cuSolverDn 库用于执行其例程的流。

integer(4) function cusolverDnGetStream(handle, stream)
  type(cusolverDnHandle) :: handle
  integer(cuda_stream_kind) :: stream

6.1.9. cusolverDnSetStream

此函数设置 cuSolverDn 库用于执行其例程的流。

integer(4) function cusolverDnSetStream(handle, stream)
  type(cusolverDnHandle) :: handle
  integer(cuda_stream_kind) :: stream

6.1.10. cusolverDnXsyevjSetTolerance

此函数配置 Xsyevj 函数中使用的容差值。

integer(4) function cusolverDnXsyevjSetTolerance(info, tolerance)
   type(cusolverSyevjInfo) :: info
   real(8) :: tolerance

6.1.11. cusolverDnXsyevjSetMaxSweeps

此函数设置 Xsyevj 函数中使用的最大扫描次数。

integer(4) function cusolverDnXsyevjSetMaxSweeps(info, sweeps)
   type(cusolverSyevjInfo) :: info
   integer(4) :: sweeps

6.1.12. cusolverDnXsyevjSetSortEig

此函数设置 Xsyevj 函数中使用的排序行为。

integer(4) function cusolverDnXsyevjSetSortEig(info, sort_eig)
   type(cusolverSyevjInfo) :: info
   integer(4) :: sort_eig

6.1.13. cusolverDnXsyevjGetResidual

此函数提供执行 Xsyevj 函数后的残差。

integer(4) function cusolverDnXsyevjGetResidual(handle, info, residual)
   type(cusolverDnHandle)  :: handle
   type(cusolverSyevjInfo) :: info
   real(8) :: residual

6.1.14. cusolverDnXsyevjGetSweeps

此函数提供执行 Xsyevj 函数后使用的扫描次数。

integer(4) function cusolverDnXsyevjGetSweeps(handle, info, sweeps)
   type(cusolverDnHandle)  :: handle
   type(cusolverSyevjInfo) :: info
   integer(4) :: sweeps

6.2. cusolverDn 传统 API

本节介绍 cusolverDn 的线性求解器传统 API,包括 Cholesky 分解、带部分主元的 LU 分解、QR 分解和 Bunch-Kaufman (LDLT) 分解。

6.2.1. cusolverDnSpotrf_buffersize

此函数计算传递到 cusolverDnSpotrf 的设备工作空间所需的缓冲区大小

integer function cusolverDnSpotrf_buffersize(handle, &
    uplo, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    real(4), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.2. cusolverDnDpotrf_buffersize

此函数计算传递到 cusolverDnDpotrf 的设备工作空间所需的缓冲区大小

integer function cusolverDnDpotrf_buffersize(handle, &
    uplo, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    real(8), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.3. cusolverDnCpotrf_buffersize

此函数计算传递到 cusolverDnCpotrf 的设备工作空间所需的缓冲区大小

integer function cusolverDnCpotrf_buffersize(handle, &
    uplo, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    complex(4), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.4. cusolverDnZpotrf_buffersize

此函数计算传递到 cusolverDnZpotrf 的设备工作空间所需的缓冲区大小

integer function cusolverDnZpotrf_buffersize(handle, &
    uplo, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    complex(8), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.5. cusolverDnSpotrf

此函数计算 Hermitian 正定矩阵的 Cholesky 分解

integer function cusolverDnSpotrf(handle, &
    uplo, n, A, lda, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.6. cusolverDnDpotrf

此函数计算 Hermitian 正定矩阵的 Cholesky 分解

integer function cusolverDnDpotrf(handle, &
    uplo, n, A, lda, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.7. cusolverDnCpotrf

此函数计算 Hermitian 正定矩阵的 Cholesky 分解

integer function cusolverDnCpotrf(handle, &
    uplo, n, A, lda, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.8. cusolverDnZpotrf

此函数计算 Hermitian 正定矩阵的 Cholesky 分解

integer function cusolverDnZpotrf(handle, &
    uplo, n, A, lda, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.9. cusolverDnSpotrs

此函数使用 cusolverDnSpotrf 求解 Hermitian 正定矩阵的 Cholesky 分解产生的线性方程组

integer function cusolverDnSpotrs(handle, &
    uplo, n, nrhs, A, lda, B, ldb, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, nrhs, lda, ldb
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(ldb,*) :: B
    integer(4), device, intent(out) :: devinfo

6.2.10. cusolverDnDpotrs

此函数使用 cusolverDnDpotrf 求解 Hermitian 正定矩阵的 Cholesky 分解产生的线性方程组

integer function cusolverDnDpotrs(handle, &
    uplo, n, nrhs, A, lda, B, ldb, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, nrhs, lda, ldb
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(ldb,*) :: B
    integer(4), device, intent(out) :: devinfo

6.2.11. cusolverDnCpotrs

此函数使用 cusolverDnCpotrf 求解 Hermitian 正定矩阵的 Cholesky 分解产生的线性方程组

integer function cusolverDnCpotrs(handle, &
    uplo, n, nrhs, A, lda, B, ldb, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, nrhs, lda, ldb
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(ldb,*) :: B
    integer(4), device, intent(out) :: devinfo

6.2.12. cusolverDnZpotrs

此函数使用 cusolverDnZpotrf 求解 Hermitian 正定矩阵的 Cholesky 分解产生的线性方程组

integer function cusolverDnZpotrs(handle, &
    uplo, n, nrhs, A, lda, B, ldb, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, nrhs, lda, ldb
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(ldb,*) :: B
    integer(4), device, intent(out) :: devinfo

6.2.13. cusolverDnSpotrfBatched

此函数计算一系列 Hermitian 正定矩阵的 Cholesky 分解

integer function cusolverDnSpotrfBatched(handle, &
    uplo, n, Aarray, lda, devinfo, batchCount)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, batchCount
    type(c_devptr), device :: Aarray(*)
    integer(4), device, intent(out) :: devinfo

6.2.14. cusolverDnDpotrfBatched

此函数计算一系列 Hermitian 正定矩阵的 Cholesky 分解

integer function cusolverDnDpotrfBatched(handle, &
    uplo, n, Aarray, lda, devinfo, batchCount)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, batchCount
    type(c_devptr), device :: Aarray(*)
    integer(4), device, intent(out) :: devinfo

6.2.15. cusolverDnCpotrfBatched

此函数计算一系列 Hermitian 正定矩阵的 Cholesky 分解

integer function cusolverDnCpotrfBatched(handle, &
    uplo, n, Aarray, lda, devinfo, batchCount)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, batchCount
    type(c_devptr), device :: Aarray(*)
    integer(4), device, intent(out) :: devinfo

6.2.16. cusolverDnZpotrfBatched

此函数计算一系列 Hermitian 正定矩阵的 Cholesky 分解

integer function cusolverDnZpotrfBatched(handle, &
    uplo, n, Aarray, lda, devinfo, batchCount)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, batchCount
    type(c_devptr), device :: Aarray(*)
    integer(4), device, intent(out) :: devinfo

6.2.17. cusolverDnSpotrsBatched

此函数使用 cusolverDnSpotrfBatched 求解一系列 Hermitian 正定矩阵的 Cholesky 分解产生的一系列线性方程组

integer function cusolverDnSpotrsBatched(handle, &
    uplo, n, nrhs, Aarray, lda, Barray, ldb, devinfo, batchCount)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, nrhs, lda, ldb, batchCount
    type(c_devptr), device :: Aarray(*)
    type(c_devptr), device :: Barray(*)
    integer(4), device, intent(out) :: devinfo

6.2.18. cusolverDnDpotrsBatched

此函数使用 cusolverDnDpotrfBatched 求解一系列 Hermitian 正定矩阵的 Cholesky 分解产生的一系列线性方程组

integer function cusolverDnDpotrsBatched(handle, &
    uplo, n, nrhs, Aarray, lda, Barray, ldb, devinfo, batchCount)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, nrhs, lda, ldb, batchCount
    type(c_devptr), device :: Aarray(*)
    type(c_devptr), device :: Barray(*)
    integer(4), device, intent(out) :: devinfo

6.2.19. cusolverDnCpotrsBatched

此函数使用 cusolverDnCpotrfBatched 求解一系列 Hermitian 正定矩阵的 Cholesky 分解产生的一系列线性方程组

integer function cusolverDnCpotrsBatched(handle, &
    uplo, n, nrhs, Aarray, lda, Barray, ldb, devinfo, batchCount)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, nrhs, lda, ldb, batchCount
    type(c_devptr), device :: Aarray(*)
    type(c_devptr), device :: Barray(*)
    integer(4), device, intent(out) :: devinfo

6.2.20. cusolverDnZpotrsBatched

此函数使用 cusolverDnZpotrfBatched 求解一系列 Hermitian 正定矩阵的 Cholesky 分解产生的一系列线性方程组

integer function cusolverDnZpotrsBatched(handle, &
    uplo, n, nrhs, Aarray, lda, Barray, ldb, devinfo, batchCount)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, nrhs, lda, ldb, batchCount
    type(c_devptr), device :: Aarray(*)
    type(c_devptr), device :: Barray(*)
    integer(4), device, intent(out) :: devinfo

6.2.21. cusolverDnSpotri_buffersize

此函数计算传递到 cusolverDnSpotri 的设备工作空间所需的缓冲区大小

integer function cusolverDnSpotri_buffersize(handle, &
    uplo, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    real(4), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.22. cusolverDnDpotri_buffersize

此函数计算传递到 cusolverDnDpotri 的设备工作空间所需的缓冲区大小

integer function cusolverDnDpotri_buffersize(handle, &
    uplo, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    real(8), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.23. cusolverDnCpotri_buffersize

此函数计算传递到 cusolverDnCpotri 的设备工作空间所需的缓冲区大小

integer function cusolverDnCpotri_buffersize(handle, &
    uplo, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    complex(4), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.24. cusolverDnZpotri_buffersize

此函数计算传递到 cusolverDnZpotri 的设备工作空间所需的缓冲区大小

integer function cusolverDnZpotri_buffersize(handle, &
    uplo, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    complex(8), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.25. cusolverDnSpotri

此函数使用 cusolverDnSpotrf 计算的 Cholesky 分解来计算正定矩阵的逆矩阵。

integer function cusolverDnSpotri(handle, &
    uplo, n, A, lda, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.26. cusolverDnDpotri

此函数使用 cusolverDnDpotrf 计算的 Cholesky 分解来计算正定矩阵的逆矩阵。

integer function cusolverDnDpotri(handle, &
    uplo, n, A, lda, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.27. cusolverDnCpotri

此函数使用 cusolverDnCpotrf 计算的 Cholesky 分解来计算正定矩阵的逆矩阵。

integer function cusolverDnCpotri(handle, &
    uplo, n, A, lda, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.28. cusolverDnZpotri

此函数使用 cusolverDnZpotrf 计算的 Cholesky 分解来计算正定矩阵的逆矩阵。

integer function cusolverDnZpotri(handle, &
    uplo, n, A, lda, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.29. cusolverDnStrtri_buffersize

此函数计算传递到 cusolverDnStrtri 的设备工作空间所需的缓冲区大小

integer function cusolverDnStrtri_buffersize(handle, &
    uplo, diag, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo, diag
    integer(4) :: n, lda
    real(4), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.30. cusolverDnDtrtri_buffersize

此函数计算传递到 cusolverDnDtrtri 的设备工作空间所需的缓冲区大小

integer function cusolverDnDtrtri_buffersize(handle, &
    uplo, diag, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo, diag
    integer(4) :: n, lda
    real(8), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.31. cusolverDnCtrtri_buffersize

此函数计算传递到 cusolverDnCtrtri 的设备工作空间所需的缓冲区大小

integer function cusolverDnCtrtri_buffersize(handle, &
    uplo, diag, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo, diag
    integer(4) :: n, lda
    complex(4), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.32. cusolverDnZtrtri_buffersize

此函数计算传递到 cusolverDnZtrtri 的设备工作空间所需的缓冲区大小

integer function cusolverDnZtrtri_buffersize(handle, &
    uplo, diag, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo, diag
    integer(4) :: n, lda
    complex(8), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.33. cusolverDnStrtri

此函数计算上三角或下三角矩阵 A 的逆矩阵。它通常由 cusolverDnSpotri 调用。

integer function cusolverDnStrtri(handle, &
    uplo, diag, n, A, lda, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo, diag
    integer(4) :: n, lda, lwork
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.34. cusolverDnDtrtri

此函数计算上三角或下三角矩阵 A 的逆矩阵。它通常由 cusolverDnDpotri 调用。

integer function cusolverDnDtrtri(handle, &
    uplo, diag, n, A, lda, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo, diag
    integer(4) :: n, lda, lwork
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.35. cusolverDnCtrtri

此函数计算上三角或下三角矩阵 A 的逆矩阵。它通常由 cusolverDnCpotri 调用。

integer function cusolverDnCtrtri(handle, &
    uplo, diag, n, A, lda, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo, diag
    integer(4) :: n, lda, lwork
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.36. cusolverDnZtrtri

此函数计算上三角或下三角矩阵 A 的逆矩阵。它通常由 cusolverDnZpotri 调用。

integer function cusolverDnZtrtri(handle, &
    uplo, diag, n, A, lda, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo, diag
    integer(4) :: n, lda, lwork
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.37. cusolverDnSlauum_buffersize

此函数计算传递到 cusolverDnSlauum 的设备工作空间所需的缓冲区大小

integer function cusolverDnSlauum_buffersize(handle, &
    uplo, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    real(4), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.38. cusolverDnDlauum_buffersize

此函数计算传递到 cusolverDnDlauum 的设备工作空间所需的缓冲区大小

integer function cusolverDnDlauum_buffersize(handle, &
    uplo, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    real(8), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.39. cusolverDnClauum_buffersize

此函数计算传递到 cusolverDnClauum 的设备工作空间所需的缓冲区大小

integer function cusolverDnClauum_buffersize(handle, &
    uplo, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    complex(4), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.40. cusolverDnZlauum_buffersize

此函数计算传递到 cusolverDnZlauum 的设备工作空间所需的缓冲区大小

integer function cusolverDnZlauum_buffersize(handle, &
    uplo, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    complex(8), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.41. cusolverDnSlauum

此函数计算乘积 U * U**T 或 L**T * L。它通常由 cusolverDnSpotri 调用。

integer function cusolverDnSlauum(handle, &
    uplo, n, A, lda, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.42. cusolverDnDlauum

此函数计算乘积 U * U**T 或 L**T * L。它通常由 cusolverDnDpotri 调用。

integer function cusolverDnDlauum(handle, &
    uplo, n, A, lda, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.43. cusolverDnClauum

此函数计算乘积 U * U**T 或 L**T * L。它通常由 cusolverDnCpotri 调用。

integer function cusolverDnClauum(handle, &
    uplo, n, A, lda, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.44. cusolverDnZlauum

此函数计算乘积 U * U**T 或 L**T * L。它通常由 cusolverDnZpotri 调用。

integer function cusolverDnZlauum(handle, &
    uplo, n, A, lda, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.45. cusolverDnSgetrf_buffersize

此函数计算传递到 cusolverDnSgetrf 的设备工作空间所需的缓冲区大小

integer function cusolverDnSgetrf_buffersize(handle, &
    m, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda
    real(4), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.46. cusolverDnDgetrf_buffersize

此函数计算传递到 cusolverDnDgetrf 的设备工作空间所需的缓冲区大小

integer function cusolverDnDgetrf_buffersize(handle, &
    m, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda
    real(8), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.47. cusolverDnCgetrf_buffersize

此函数计算传递到 cusolverDnCgetrf 的设备工作空间所需的缓冲区大小

integer function cusolverDnCgetrf_buffersize(handle, &
    m, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda
    complex(4), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.48. cusolverDnZgetrf_buffersize

此函数计算传递到 cusolverDnZgetrf 的设备工作空间所需的缓冲区大小

integer function cusolverDnZgetrf_buffersize(handle, &
    m, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda
    complex(8), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.49. cusolverDnSgetrf

此函数计算一般 mxn 矩阵的 LU 分解

integer function cusolverDnSgetrf(handle, &
    m, n, A, lda, workspace, devipiv, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(*) :: workspace
    integer(4), device, dimension(*) :: devipiv
    integer(4), device, intent(out) :: devinfo

6.2.50. cusolverDnDgetrf

此函数计算一般 mxn 矩阵的 LU 分解

integer function cusolverDnDgetrf(handle, &
    m, n, A, lda, workspace, devipiv, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(*) :: workspace
    integer(4), device, dimension(*) :: devipiv
    integer(4), device, intent(out) :: devinfo

6.2.51. cusolverDnCgetrf

此函数计算一般 mxn 矩阵的 LU 分解

integer function cusolverDnCgetrf(handle, &
    m, n, A, lda, workspace, devipiv, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(*) :: workspace
    integer(4), device, dimension(*) :: devipiv
    integer(4), device, intent(out) :: devinfo

6.2.52. cusolverDnZgetrf

此函数计算一般 mxn 矩阵的 LU 分解

integer function cusolverDnZgetrf(handle, &
    m, n, A, lda, workspace, devipiv, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(*) :: workspace
    integer(4), device, dimension(*) :: devipiv
    integer(4), device, intent(out) :: devinfo

6.2.53. cusolverDnSgetrs

此函数使用 cusolverDnSgetrf 求解矩阵的 LU 分解产生的线性方程组

integer function cusolverDnSgetrs(handle, &
    trans, n, nrhs, A, lda, devipiv, B, ldb, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: trans
    integer(4) :: n, nrhs, lda, ldb
    real(4), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    real(4), device, dimension(ldb,*) :: B
    integer(4), device, intent(out) :: devinfo

6.2.54. cusolverDnDgetrs

此函数使用 cusolverDnDgetrf 求解矩阵的 LU 分解产生的线性方程组

integer function cusolverDnDgetrs(handle, &
    trans, n, nrhs, A, lda, devipiv, B, ldb, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: trans
    integer(4) :: n, nrhs, lda, ldb
    real(8), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    real(8), device, dimension(ldb,*) :: B
    integer(4), device, intent(out) :: devinfo

6.2.55. cusolverDnCgetrs

此函数使用 cusolverDnCgetrf 求解矩阵的 LU 分解产生的线性方程组

integer function cusolverDnCgetrs(handle, &
    trans, n, nrhs, A, lda, devipiv, B, ldb, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: trans
    integer(4) :: n, nrhs, lda, ldb
    complex(4), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    complex(4), device, dimension(ldb,*) :: B
    integer(4), device, intent(out) :: devinfo

6.2.56. cusolverDnZgetrs

此函数使用 cusolverDnZgetrf 求解矩阵的 LU 分解产生的线性方程组

integer function cusolverDnZgetrs(handle, &
    trans, n, nrhs, A, lda, devipiv, B, ldb, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: trans
    integer(4) :: n, nrhs, lda, ldb
    complex(8), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    complex(8), device, dimension(ldb,*) :: B
    integer(4), device, intent(out) :: devinfo

6.2.57. cusolverDnSlaswp

此函数执行行主元。它通常由 cusolverDnSgetrf 调用。

integer function cusolverDnSlaswp(handle, &
    n, A, lda, k1, k2, devipiv, incx)
    type(cusolverDnHandle) :: handle
    integer(4) :: n, lda, k1, k2, incx
    real(4), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv

6.2.58. cusolverDnDlaswp

此函数执行行主元。它通常由 cusolverDnDgetrf 调用。

integer function cusolverDnDlaswp(handle, &
    n, A, lda, k1, k2, devipiv, incx)
    type(cusolverDnHandle) :: handle
    integer(4) :: n, lda, k1, k2, incx
    real(8), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv

6.2.59. cusolverDnClaswp

此函数执行行主元。它通常由 cusolverDnCgetrf 调用。

integer function cusolverDnClaswp(handle, &
    n, A, lda, k1, k2, devipiv, incx)
    type(cusolverDnHandle) :: handle
    integer(4) :: n, lda, k1, k2, incx
    complex(4), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv

6.2.60. cusolverDnZlaswp

此函数执行行主元。它通常由 cusolverDnZgetrf 调用。

integer function cusolverDnZlaswp(handle, &
    n, A, lda, k1, k2, devipiv, incx)
    type(cusolverDnHandle) :: handle
    integer(4) :: n, lda, k1, k2, incx
    complex(8), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv

6.2.61. cusolverDnSgeqrf_buffersize

此函数计算传递到 cusolverDnSgeqrf 的设备工作空间所需的缓冲区大小

integer function cusolverDnSgeqrf_buffersize(handle, &
    m, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda
    real(4), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.62. cusolverDnDgeqrf_buffersize

此函数计算传递到 cusolverDnDgeqrf 的设备工作空间所需的缓冲区大小

integer function cusolverDnDgeqrf_buffersize(handle, &
    m, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda
    real(8), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.63. cusolverDnCgeqrf_buffersize

此函数计算传递到 cusolverDnCgeqrf 的设备工作空间所需的缓冲区大小

integer function cusolverDnCgeqrf_buffersize(handle, &
    m, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda
    complex(4), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.64. cusolverDnZgeqrf_buffersize

此函数计算传递到 cusolverDnZgeqrf 的设备工作空间所需的缓冲区大小

integer function cusolverDnZgeqrf_buffersize(handle, &
    m, n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda
    complex(8), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.65. cusolverDnSgeqrf

此函数计算 mxn 矩阵的 QR 分解

integer function cusolverDnSgeqrf(handle, &
    m, n, A, lda, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda, lwork
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(*) :: tau
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.66. cusolverDnDgeqrf

此函数计算 mxn 矩阵的 QR 分解

integer function cusolverDnDgeqrf(handle, &
    m, n, A, lda, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda, lwork
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(*) :: tau
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.67. cusolverDnCgeqrf

此函数计算 mxn 矩阵的 QR 分解

integer function cusolverDnCgeqrf(handle, &
    m, n, A, lda, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda, lwork
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(*) :: tau
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.68. cusolverDnZgeqrf

此函数计算 mxn 矩阵的 QR 分解

integer function cusolverDnZgeqrf(handle, &
    m, n, A, lda, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda, lwork
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(*) :: tau
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.69. cusolverDnSorgqr_buffersize

此函数计算传递到 cusolverDnSorgqr 的设备工作空间所需的缓冲区大小

integer function cusolverDnSorgqr_buffersize(handle, &
    m, n, k, A, lda, tau, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, k, lda
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(*) :: tau
    integer(4) :: lwork

6.2.70. cusolverDnDorgqr_buffersize

此函数计算传递到 cusolverDnDorgqr 的设备工作空间所需的缓冲区大小

integer function cusolverDnDorgqr_buffersize(handle, &
    m, n, k, A, lda, tau, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, k, lda
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(*) :: tau
    integer(4) :: lwork

6.2.71. cusolverDnCorgqr_buffersize

此函数计算传递到 cusolverDnCorgqr 的设备工作空间所需的缓冲区大小

integer function cusolverDnCorgqr_buffersize(handle, &
    m, n, k, A, lda, tau, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, k, lda
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(*) :: tau
    integer(4) :: lwork

6.2.72. cusolverDnZorgqr_buffersize

此函数计算传递到 cusolverDnZorgqr 的设备工作空间所需的缓冲区大小

integer function cusolverDnZorgqr_buffersize(handle, &
    m, n, k, A, lda, tau, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, k, lda
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(*) :: tau
    integer(4) :: lwork

6.2.73. cusolverDnSorgqr

此函数从 mxn 矩阵的 QR 分解生成酉矩阵 Q

integer function cusolverDnSorgqr(handle, &
    m, n, k, A, lda, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, k, lda, lwork
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(*) :: tau
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.74. cusolverDnDorgqr

此函数从 mxn 矩阵的 QR 分解生成酉矩阵 Q

integer function cusolverDnDorgqr(handle, &
    m, n, k, A, lda, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, k, lda, lwork
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(*) :: tau
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.75. cusolverDnCorgqr

此函数从 mxn 矩阵的 QR 分解生成酉矩阵 Q

integer function cusolverDnCorgqr(handle, &
    m, n, k, A, lda, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, k, lda, lwork
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(*) :: tau
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.76. cusolverDnZorgqr

此函数从 mxn 矩阵的 QR 分解生成酉矩阵 Q

integer function cusolverDnZorgqr(handle, &
    m, n, k, A, lda, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, k, lda, lwork
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(*) :: tau
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.77. cusolverDnSormqr_buffersize

此函数计算传递到 cusolverDnSormqr 的设备工作空间所需的缓冲区大小

integer function cusolverDnSormqr_buffersize(handle, &
    side, trans, m, n, k, A, lda, tau, C, ldc, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: side, trans
    integer(4) :: m, n, k, lda, ldc
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(*) :: tau
    real(4), device, dimension(ldc,*) :: C
    integer(4) :: lwork

6.2.78. cusolverDnDormqr_buffersize

此函数计算传递到 cusolverDnDormqr 的设备工作空间所需的缓冲区大小

integer function cusolverDnDormqr_buffersize(handle, &
    side, trans, m, n, k, A, lda, tau, C, ldc, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: side, trans
    integer(4) :: m, n, k, lda, ldc
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(*) :: tau
    real(8), device, dimension(ldc,*) :: C
    integer(4) :: lwork

6.2.79. cusolverDnCormqr_buffersize

此函数计算传递到 cusolverDnCormqr 的设备工作空间所需的缓冲区大小

integer function cusolverDnCormqr_buffersize(handle, &
    side, trans, m, n, k, A, lda, tau, C, ldc, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: side, trans
    integer(4) :: m, n, k, lda, ldc
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(*) :: tau
    complex(4), device, dimension(ldc,*) :: C
    integer(4) :: lwork

6.2.80. cusolverDnZormqr_buffersize

此函数计算传递到 cusolverDnZormqr 的设备工作空间所需的缓冲区大小

integer function cusolverDnZormqr_buffersize(handle, &
    side, trans, m, n, k, A, lda, tau, C, ldc, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: side, trans
    integer(4) :: m, n, k, lda, ldc
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(*) :: tau
    complex(8), device, dimension(ldc,*) :: C
    integer(4) :: lwork

6.2.81. cusolverDnSormqr

此函数从 mxn 矩阵的 QR 分解生成酉矩阵 Q,并根据 side 和 trans 参数覆盖数组 C。

integer function cusolverDnSormqr(handle, &
    side, trans, m, n, k, A, lda, tau, C, ldc, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: side, trans
    integer(4) :: m, n, k, lda, ldc, lwork
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(*) :: tau
    real(4), device, dimension(ldc,*) :: C
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.82. cusolverDnDormqr

此函数从 mxn 矩阵的 QR 分解生成酉矩阵 Q,并根据 side 和 trans 参数覆盖数组 C。

integer function cusolverDnDormqr(handle, &
    side, trans, m, n, k, A, lda, tau, C, ldc, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: side, trans
    integer(4) :: m, n, k, lda, ldc, lwork
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(*) :: tau
    real(8), device, dimension(ldc,*) :: C
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.83. cusolverDnCormqr

此函数从 mxn 矩阵的 QR 分解生成酉矩阵 Q,并根据 side 和 trans 参数覆盖数组 C。

integer function cusolverDnCormqr(handle, &
    side, trans, m, n, k, A, lda, tau, C, ldc, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: side, trans
    integer(4) :: m, n, k, lda, ldc, lwork
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(*) :: tau
    complex(4), device, dimension(ldc,*) :: C
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.84. cusolverDnZormqr

此函数从 mxn 矩阵的 QR 分解生成酉矩阵 Q,并根据 side 和 trans 参数覆盖数组 C。

integer function cusolverDnZormqr(handle, &
    side, trans, m, n, k, A, lda, tau, C, ldc, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: side, trans
    integer(4) :: m, n, k, lda, ldc, lwork
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(*) :: tau
    complex(8), device, dimension(ldc,*) :: C
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.85. cusolverDnSsytrf_buffersize

此函数计算传递到 cusolverDnSsytrf 的设备工作空间所需的缓冲区大小

integer function cusolverDnSsytrf_buffersize(handle, &
    n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: n, lda
    real(4), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.86. cusolverDnDsytrf_buffersize

此函数计算传递到 cusolverDnDsytrf 的设备工作空间所需的缓冲区大小

integer function cusolverDnDsytrf_buffersize(handle, &
    n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: n, lda
    real(8), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.87. cusolverDnCsytrf_buffersize

此函数计算传递到 cusolverDnCsytrf 的设备工作空间所需的缓冲区大小

integer function cusolverDnCsytrf_buffersize(handle, &
    n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: n, lda
    complex(4), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.88. cusolverDnZsytrf_buffersize

此函数计算传递到 cusolverDnZsytrf 的设备工作空间所需的缓冲区大小

integer function cusolverDnZsytrf_buffersize(handle, &
    n, A, lda, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: n, lda
    complex(8), device, dimension(lda,*) :: A
    integer(4) :: lwork

6.2.89. cusolverDnSsytrf

此函数计算 nxn 对称不定矩阵的 Bunch-Kaufman 分解

integer function cusolverDnSsytrf(handle, &
    uplo, n, A, lda, devipiv, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    real(4), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.90. cusolverDnDsytrf

此函数计算 nxn 对称不定矩阵的 Bunch-Kaufman 分解

integer function cusolverDnDsytrf(handle, &
    uplo, n, A, lda, devipiv, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    real(8), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.91. cusolverDnCsytrf

此函数计算 nxn 对称不定矩阵的 Bunch-Kaufman 分解

integer function cusolverDnCsytrf(handle, &
    uplo, n, A, lda, devipiv, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    complex(4), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.92. cusolverDnZsytrf

此函数计算 nxn 对称不定矩阵的 Bunch-Kaufman 分解

integer function cusolverDnZsytrf(handle, &
    uplo, n, A, lda, devipiv, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    complex(8), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.93. cusolverDnSsytrs_bufferSize

此函数计算传递到 cusolverDnSsytrs 的设备工作空间所需的缓冲区大小

integer function cusolverDnSsytrs_bufferSize(handle, &
    uplo, n, nrhs, A, lda, devipiv, B, ldb, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, nrhs, lda, ldb
    real(4), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    real(4), device, dimension(ldb,*) :: B
    integer(4), intent(out) :: lwork

6.2.94. cusolverDnDsytrs_bufferSize

此函数计算传递到 cusolverDnDsytrs 的设备工作空间所需的缓冲区大小

integer function cusolverDnDsytrs_bufferSize(handle, &
    uplo, n, nrhs, A, lda, devipiv, B, ldb, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, nrhs, lda, ldb
    real(8), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    real(8), device, dimension(ldb,*) :: B
    integer(4), intent(out) :: lwork

6.2.95. cusolverDnCsytrs_bufferSize

此函数计算传递到 cusolverDnCsytrs 的设备工作空间所需的缓冲区大小

integer function cusolverDnCsytrs_bufferSize(handle, &
    uplo, n, nrhs, A, lda, devipiv, B, ldb, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, nrhs, lda, ldb
    complex(4), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    complex(4), device, dimension(ldb,*) :: B
    integer(4), intent(out) :: lwork

6.2.96. cusolverDnZsytrs_bufferSize

此函数计算传递到 cusolverDnZsytrs 的设备工作空间所需的缓冲区大小

integer function cusolverDnZsytrs_bufferSize(handle, &
    uplo, n, nrhs, A, lda, devipiv, B, ldb, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, nrhs, lda, ldb
    complex(8), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    complex(8), device, dimension(ldb,*) :: B
    integer(4), intent(out) :: lwork

6.2.97. cusolverDnSsytrs

此函数使用 cusolverDnSsytrf 求解 nxn 对称不定矩阵的 Bunch-Kaufman 分解产生的线性方程组

integer function cusolverDnSsytrs(handle, &
    uplo, n, nrhs, A, lda, devipiv, B, ldb, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, nrhs, lda, ldb, lwork
    real(4), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    real(4), device, dimension(ldb,*) :: B
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.98. cusolverDnDsytrs

此函数使用 cusolverDnDsytrf 求解 nxn 对称不定矩阵的 Bunch-Kaufman 分解产生的线性方程组

integer function cusolverDnDsytrs(handle, &
    uplo, n, nrhs, A, lda, devipiv, B, ldb, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, nrhs, lda, ldb, lwork
    real(8), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    real(8), device, dimension(ldb,*) :: B
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.99. cusolverDnCsytrs

此函数使用 cusolverDnCsytrf 求解 nxn 对称不定矩阵的 Bunch-Kaufman 分解产生的线性方程组

integer function cusolverDnCsytrs(handle, &
    uplo, n, nrhs, A, lda, devipiv, B, ldb, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, nrhs, lda, ldb, lwork
    complex(4), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    complex(4), device, dimension(ldb,*) :: B
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.100. cusolverDnZsytrs

此函数使用 cusolverDnZsytrf 求解 nxn 对称不定矩阵的 Bunch-Kaufman 分解产生的线性方程组

integer function cusolverDnZsytrs(handle, &
    uplo, n, nrhs, A, lda, devipiv, B, ldb, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, nrhs, lda, ldb, lwork
    complex(8), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    complex(8), device, dimension(ldb,*) :: B
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.101. cusolverDnSsytri_bufferSize

此函数计算传递到 cusolverDnSsytri 的设备工作空间所需的缓冲区大小

integer function cusolverDnSsytri_bufferSize(handle, &
    uplo, n, A, lda, devipiv, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    real(4), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    integer(4), intent(out) :: lwork

6.2.102. cusolverDnDsytri_bufferSize

此函数计算传递到 cusolverDnDsytri 的设备工作空间所需的缓冲区大小

integer function cusolverDnDsytri_bufferSize(handle, &
    uplo, n, A, lda, devipiv, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    real(8), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    integer(4), intent(out) :: lwork

6.2.103. cusolverDnCsytri_bufferSize

此函数计算传递到 cusolverDnCsytri 的设备工作空间所需的缓冲区大小

integer function cusolverDnCsytri_bufferSize(handle, &
    uplo, n, A, lda, devipiv, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    complex(4), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    integer(4), intent(out) :: lwork

6.2.104. cusolverDnZsytri_bufferSize

此函数计算传递到 cusolverDnZsytri 的设备工作空间所需的缓冲区大小

integer function cusolverDnZsytri_bufferSize(handle, &
    uplo, n, A, lda, devipiv, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    complex(8), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    integer(4), intent(out) :: lwork

6.2.105. cusolverDnSsytri

此函数使用 cusolverDnSsytrf 反演从 nxn 对称不定矩阵的 Bunch-Kaufman 分解得到的矩阵

integer function cusolverDnSsytri(handle, &
    uplo, n, A, lda, devipiv, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    real(4), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.106. cusolverDnDsytri

此函数使用 cusolverDnDsytrf 反演从 nxn 对称不定矩阵的 Bunch-Kaufman 分解得到的矩阵

integer function cusolverDnDsytri(handle, &
    uplo, n, A, lda, devipiv, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    real(8), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.107. cusolverDnCsytri

此函数使用 cusolverDnCsytrf 反演从 nxn 对称不定矩阵的 Bunch-Kaufman 分解得到的矩阵

integer function cusolverDnCsytri(handle, &
    uplo, n, A, lda, devipiv, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    complex(4), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.2.108. cusolverDnZsytri

此函数使用 cusolverDnZsytrf 反演从 nxn 对称不定矩阵的 Bunch-Kaufman 分解得到的矩阵

integer function cusolverDnZsytri(handle, &
    uplo, n, A, lda, devipiv, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    complex(8), device, dimension(lda,*) :: A
    integer(4), device, dimension(*) :: devipiv
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3. cusolverDn Legacy Eigenvalue Solver API

本节介绍 cusolverDn 的特征值求解器传统 API,包括双对角化和 SVD。

6.3.1. cusolverDnSgebrd_buffersize

此函数计算传递到 cusolverDnSgebrd 的设备工作空间所需的缓冲区大小

integer function cusolverDnSgebrd_buffersize(handle, &
    m, n, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n
    integer(4) :: lwork

6.3.2. cusolverDnDgebrd_buffersize

此函数计算传递到 cusolverDnDgebrd 的设备工作空间所需的缓冲区大小

integer function cusolverDnDgebrd_buffersize(handle, &
    m, n, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n
    integer(4) :: lwork

6.3.3. cusolverDnCgebrd_buffersize

此函数计算传递到 cusolverDnCgebrd 的设备工作空间所需的缓冲区大小

integer function cusolverDnCgebrd_buffersize(handle, &
    m, n, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n
    integer(4) :: lwork

6.3.4. cusolverDnZgebrd_buffersize

此函数计算传递到 cusolverDnZgebrd 的设备工作空间所需的缓冲区大小

integer function cusolverDnZgebrd_buffersize(handle, &
    m, n, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n
    integer(4) :: lwork

6.3.5. cusolverDnSgebrd

此函数通过正交变换 QH * A * P = B 将通用 mxn 矩阵 A 约简为上或下双对角形式 B

integer function cusolverDnSgebrd(handle, &
    m, n, A, lda, D, E, TauQ, TauP, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda, lwork
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(*) :: D
    real(4), device, dimension(*) :: E
    real(4), device, dimension(*) :: TauQ
    real(4), device, dimension(*) :: TauP
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.6. cusolverDnDgebrd

此函数通过正交变换 QH * A * P = B 将通用 mxn 矩阵 A 约简为上或下双对角形式 B

integer function cusolverDnDgebrd(handle, &
    m, n, A, lda, D, E, TauQ, TauP, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda, lwork
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(*) :: D
    real(8), device, dimension(*) :: E
    real(8), device, dimension(*) :: TauQ
    real(8), device, dimension(*) :: TauP
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.7. cusolverDnCgebrd

此函数通过正交变换 QH * A * P = B 将通用 mxn 矩阵 A 约简为上或下双对角形式 B

integer function cusolverDnCgebrd(handle, &
    m, n, A, lda, D, E, TauQ, TauP, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda, lwork
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(*) :: D
    complex(4), device, dimension(*) :: E
    complex(4), device, dimension(*) :: TauQ
    complex(4), device, dimension(*) :: TauP
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.8. cusolverDnZgebrd

此函数通过正交变换 QH * A * P = B 将通用 mxn 矩阵 A 约简为上或下双对角形式 B

integer function cusolverDnZgebrd(handle, &
    m, n, A, lda, D, E, TauQ, TauP, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda, lwork
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(*) :: D
    complex(8), device, dimension(*) :: E
    complex(8), device, dimension(*) :: TauQ
    complex(8), device, dimension(*) :: TauP
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.9. cusolverDnSorgbr_buffersize

此函数计算传递到 cusolverDnSorgbr 的设备工作空间所需的缓冲区大小

integer function cusolverDnSorgbr_buffersize(handle, &
    side, m, n, k, A, lda, tau, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: side
    integer(4) :: m, n, k, lda
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(*) :: tau
    integer(4) :: lwork

6.3.10. cusolverDnDorgbr_buffersize

此函数计算传递到 cusolverDnDorgbr 的设备工作空间所需的缓冲区大小

integer function cusolverDnDorgbr_buffersize(handle, &
    side, m, n, k, A, lda, tau, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: side
    integer(4) :: m, n, k, lda
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(*) :: tau
    integer(4) :: lwork

6.3.11. cusolverDnCungbr_buffersize

此函数计算传递到 cusolverDnCungbr 的设备工作空间所需的缓冲区大小

integer function cusolverDnCungbr_buffersize(handle, &
    side, m, n, k, A, lda, tau, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: side
    integer(4) :: m, n, k, lda
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(*) :: tau
    integer(4) :: lwork

6.3.12. cusolverDnZungbr_buffersize

此函数计算传递到 cusolverDnZungbr 的设备工作空间所需的缓冲区大小

integer function cusolverDnZungbr_buffersize(handle, &
    side, m, n, k, A, lda, tau, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: side
    integer(4) :: m, n, k, lda
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(*) :: tau
    integer(4) :: lwork

6.3.13. cusolverDnSorgbr

此函数生成由 cusolverDnSgebrd 确定的酉矩阵 Q 或 P**H 之一。

integer function cusolverDnSorgbr(handle, &
    side, m, n, k, A, lda, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: side
    integer(4) :: m, n, k, lda, lwork
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(*) :: tau
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.14. cusolverDnDorgbr

此函数生成由 cusolverDnDgebrd 确定的酉矩阵 Q 或 P**H 之一。

integer function cusolverDnDorgbr(handle, &
    side, m, n, k, A, lda, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: side
    integer(4) :: m, n, k, lda, lwork
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(*) :: tau
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.15. cusolverDnCungbr

此函数生成由 cusolverDnCgebrd 确定的酉矩阵 Q 或 P**H 之一。

integer function cusolverDnCungbr(handle, &
    side, m, n, k, A, lda, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: side
    integer(4) :: m, n, k, lda, lwork
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(*) :: tau
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.16. cusolverDnZungbr

此函数生成由 cusolverDnZgebrd 确定的酉矩阵 Q 或 P**H 之一。

integer function cusolverDnZungbr(handle, &
    side, m, n, k, A, lda, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: side
    integer(4) :: m, n, k, lda, lwork
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(*) :: tau
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.17. cusolverDnSsytrd_buffersize

此函数计算传递到 cusolverDnSsytrd 的设备工作空间所需的缓冲区大小

integer function cusolverDnSsytrd_buffersize(handle, &
    uplo, n, A, lda, D, E, tau, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: side
    integer(4) :: n, lda
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(*) :: D
    real(4), device, dimension(*) :: E
    real(4), device, dimension(*) :: tau
    integer(4) :: lwork

6.3.18. cusolverDnDsytrd_buffersize

此函数计算传递到 cusolverDnDsytrd 的设备工作空间所需的缓冲区大小

integer function cusolverDnDsytrd_buffersize(handle, &
    uplo, n, A, lda, D, E, tau, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: side
    integer(4) :: n, lda
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(*) :: D
    real(8), device, dimension(*) :: E
    real(8), device, dimension(*) :: tau
    integer(4) :: lwork

6.3.19. cusolverDnChetrd_buffersize

此函数计算传递到 cusolverDnChetrd 的设备工作空间所需的缓冲区大小

integer function cusolverDnChetrd_buffersize(handle, &
    uplo, n, A, lda, D, E, tau, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: side
    integer(4) :: n, lda
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(*) :: D
    complex(4), device, dimension(*) :: E
    complex(4), device, dimension(*) :: tau
    integer(4) :: lwork

6.3.20. cusolverDnZhetrd_buffersize

此函数计算传递到 cusolverDnZhetrd 的设备工作空间所需的缓冲区大小

integer function cusolverDnZhetrd_buffersize(handle, &
    uplo, n, A, lda, D, E, tau, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: side
    integer(4) :: n, lda
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(*) :: D
    complex(8), device, dimension(*) :: E
    complex(8), device, dimension(*) :: tau
    integer(4) :: lwork

6.3.21. cusolverDnSsytrd

此函数将通用对称或 Hermitian nxn 矩阵约简为实对称三对角形式。

integer function cusolverDnSsytrd(handle, &
    uplo, n, A, lda, D, E, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(*) :: D
    real(4), device, dimension(*) :: E
    real(4), device, dimension(*) :: tau
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.22. cusolverDnDsytrd

此函数将通用对称或 Hermitian nxn 矩阵约简为实对称三对角形式。

integer function cusolverDnDsytrd(handle, &
    uplo, n, A, lda, D, E, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(*) :: D
    real(8), device, dimension(*) :: E
    real(8), device, dimension(*) :: tau
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.23. cusolverDnChetrd

此函数将通用对称或 Hermitian nxn 矩阵约简为实对称三对角形式。

integer function cusolverDnChetrd(handle, &
    uplo, n, A, lda, D, E, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(*) :: D
    complex(4), device, dimension(*) :: E
    complex(4), device, dimension(*) :: tau
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.24. cusolverDnZhetrd

此函数将通用对称或 Hermitian nxn 矩阵约简为实对称三对角形式。

integer function cusolverDnZhetrd(handle, &
    uplo, n, A, lda, D, E, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(*) :: D
    complex(8), device, dimension(*) :: E
    complex(8), device, dimension(*) :: tau
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.25. cusolverDnSormtr_buffersize

此函数计算传递到 cusolverDnSormtr 的设备工作空间所需的缓冲区大小

integer function cusolverDnSormtr_buffersize(handle, &
    side, uplo, trans, m, n, A, lda, tau, C, ldc, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: side, uplo, trans
    integer(4) :: m, n, lda, ldc
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(*) :: tau
    real(4), device, dimension(ldc,*) :: C
    integer(4) :: lwork

6.3.26. cusolverDnDormtr_buffersize

此函数计算传递到 cusolverDnDormtr 的设备工作空间所需的缓冲区大小

integer function cusolverDnDormtr_buffersize(handle, &
    side, uplo, trans, m, n, A, lda, tau, C, ldc, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: side, uplo, trans
    integer(4) :: m, n, lda, ldc
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(*) :: tau
    real(8), device, dimension(ldc,*) :: C
    integer(4) :: lwork

6.3.27. cusolverDnCunmtr_buffersize

此函数计算传递到 cusolverDnCunmtr 的设备工作空间所需的缓冲区大小

integer function cusolverDnCunmtr_buffersize(handle, &
    side, uplo, trans, m, n, A, lda, tau, C, ldc, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: side, uplo, trans
    integer(4) :: m, n, lda, ldc
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(*) :: tau
    complex(4), device, dimension(ldc,*) :: C
    integer(4) :: lwork

6.3.28. cusolverDnZunmtr_buffersize

此函数计算传递到 cusolverDnZunmtr 的设备工作空间所需的缓冲区大小

integer function cusolverDnZunmtr_buffersize(handle, &
    side, uplo, trans, m, n, A, lda, tau, C, ldc, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: side, uplo, trans
    integer(4) :: m, n, lda, ldc
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(*) :: tau
    complex(8), device, dimension(ldc,*) :: C
    integer(4) :: lwork

6.3.29. cusolverDnSormtr

此函数基于 side 和 trans 参数,生成由一系列初等反射向量组成的酉矩阵 Q 并覆盖数组 C。

integer function cusolverDnSormtr(handle, &
    side, uplo, trans, m, n, A, lda, tau, C, ldc, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: side, uplo, trans
    integer(4) :: m, n, lda, ldc, lwork
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(*) :: tau
    real(4), device, dimension(ldc,*) :: C
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.30. cusolverDnDormtr

此函数基于 side 和 trans 参数,生成由一系列初等反射向量组成的酉矩阵 Q 并覆盖数组 C。

integer function cusolverDnDormtr(handle, &
    side, uplo, trans, m, n, A, lda, tau, C, ldc, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: side, uplo, trans
    integer(4) :: m, n, lda, ldc, lwork
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(*) :: tau
    real(8), device, dimension(ldc,*) :: C
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.31. cusolverDnCunmtr

此函数基于 side 和 trans 参数,生成由一系列初等反射向量组成的酉矩阵 Q 并覆盖数组 C。

integer function cusolverDnCunmtr(handle, &
    side, uplo, trans, m, n, A, lda, tau, C, ldc, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: side, uplo, trans
    integer(4) :: m, n, lda, ldc, lwork
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(*) :: tau
    complex(4), device, dimension(ldc,*) :: C
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.32. cusolverDnZunmtr

此函数基于 side 和 trans 参数,生成由一系列初等反射向量组成的酉矩阵 Q 并覆盖数组 C。

integer function cusolverDnZunmtr(handle, &
    side, uplo, trans, m, n, A, lda, tau, C, ldc, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: side, uplo, trans
    integer(4) :: m, n, lda, ldc, lwork
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(*) :: tau
    complex(8), device, dimension(ldc,*) :: C
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.33. cusolverDnSorgtr_buffersize

此函数计算传递到 cusolverDnSorgtr 的设备工作空间所需的缓冲区大小

integer function cusolverDnSorgtr_buffersize(handle, &
    uplo, n, A, lda, tau, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(*) :: tau
    integer(4) :: lwork

6.3.34. cusolverDnDorgtr_buffersize

此函数计算传递到 cusolverDnDorgtr 的设备工作空间所需的缓冲区大小

integer function cusolverDnDorgtr_buffersize(handle, &
    uplo, n, A, lda, tau, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(*) :: tau
    integer(4) :: lwork

6.3.35. cusolverDnCungtr_buffersize

此函数计算传递到 cusolverDnCungtr 的设备工作空间所需的缓冲区大小

integer function cusolverDnCungtr_buffersize(handle, &
    uplo, n, A, lda, tau, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(*) :: tau
    integer(4) :: lwork

6.3.36. cusolverDnZungtr_buffersize

此函数计算传递到 cusolverDnZungtr 的设备工作空间所需的缓冲区大小

integer function cusolverDnZungtr_buffersize(handle, &
    uplo, n, A, lda, tau, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(*) :: tau
    integer(4) :: lwork

6.3.37. cusolverDnSorgtr

此函数生成酉矩阵 Q,该矩阵定义为由 cusolverDnSsytrd 产生的 n 阶 n-1 个初等反射器的乘积。

integer function cusolverDnSorgtr(handle, &
    uplo, n, A, lda, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(*) :: tau
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.38. cusolverDnDorgtr

此函数生成酉矩阵 Q,该矩阵定义为由 cusolverDnDsytrd 产生的 n 阶 n-1 个初等反射器的乘积。

integer function cusolverDnDorgtr(handle, &
    uplo, n, A, lda, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(*) :: tau
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.39. cusolverDnCungtr

此函数生成酉矩阵 Q,该矩阵定义为由 cusolverDnCsytrd 产生的 n 阶 n-1 个初等反射器的乘积。

integer function cusolverDnCungtr(handle, &
    uplo, n, A, lda, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(*) :: tau
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.40. cusolverDnZungtr

此函数生成酉矩阵 Q,该矩阵定义为由 cusolverDnZsytrd 产生的 n 阶 n-1 个初等反射器的乘积。

integer function cusolverDnZungtr(handle, &
    uplo, n, A, lda, tau, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    integer(4) :: n, lda, lwork
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(*) :: tau
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.41. cusolverDnSgesvd_buffersize

此函数计算传递到 cusolverDnSgesvd 的设备工作空间所需的缓冲区大小

integer function cusolverDnSgesvd_buffersize(handle, &
    m, n, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n
    integer(4) :: lwork

6.3.42. cusolverDnDgesvd_buffersize

此函数计算传递到 cusolverDnDgesvd 的设备工作空间所需的缓冲区大小

integer function cusolverDnDgesvd_buffersize(handle, &
    m, n, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n
    integer(4) :: lwork

6.3.43. cusolverDnCgesvd_buffersize

此函数计算传递到 cusolverDnCgesvd 的设备工作空间所需的缓冲区大小

integer function cusolverDnCgesvd_buffersize(handle, &
    m, n, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n
    integer(4) :: lwork

6.3.44. cusolverDnZgesvd_buffersize

此函数计算传递到 cusolverDnZgesvd 的设备工作空间所需的缓冲区大小

integer function cusolverDnZgesvd_buffersize(handle, &
    m, n, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n
    integer(4) :: lwork

6.3.45. cusolverDnSgesvd

此函数计算 mxn 矩阵 A 的奇异值分解 (SVD) 以及相应的左奇异向量和/或右奇异向量。CusolverDnSgesvd 仅支持 m >= n。

integer function cusolverDnSgesvd(handle, &
    jobu, jobvt, m, n, A, lda, S, U, ldu, VT, ldvt, workspace, lwork, rwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda, ldu, ldvt, lwork
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(*) :: S
    real(4), device, dimension(ldu,*) :: U
    real(4), device, dimension(ldvt,*) :: VT
    real(4), device, dimension(lwork) :: workspace
    real(4), device, dimension(lwork) :: rwork
    integer(4), device, intent(out) :: devinfo

6.3.46. cusolverDnDgesvd

此函数计算 mxn 矩阵 A 的奇异值分解 (SVD) 以及相应的左奇异向量和/或右奇异向量。CusolverDnDgesvd 仅支持 m >= n。

integer function cusolverDnDgesvd(handle, &
    jobu, jobvt, m, n, A, lda, S, U, ldu, VT, ldvt, workspace, lwork, rwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda, ldu, ldvt, lwork
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(*) :: S
    real(8), device, dimension(ldu,*) :: U
    real(4), device, dimension(ldvt,*) :: VT
    real(8), device, dimension(lwork) :: workspace
    real(8), device, dimension(lwork) :: rwork
    integer(4), device, intent(out) :: devinfo

6.3.47. cusolverDnCgesvd

此函数计算 mxn 矩阵 A 的奇异值分解 (SVD) 以及相应的左奇异向量和/或右奇异向量。CusolverDnCgesvd 仅支持 m >= n。

integer function cusolverDnCgesvd(handle, &
    jobu, jobvt, m, n, A, lda, S, U, ldu, VT, ldvt, workspace, lwork, rwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda, ldu, ldvt, lwork
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(*) :: S
    complex(4), device, dimension(ldu,*) :: U
    complex(4), device, dimension(ldvt,*) :: VT
    complex(4), device, dimension(lwork) :: workspace
    real(4), device, dimension(lwork) :: rwork
    integer(4), device, intent(out) :: devinfo

6.3.48. cusolverDnZgesvd

此函数计算 mxn 矩阵 A 的奇异值分解 (SVD) 以及相应的左奇异向量和/或右奇异向量。CusolverDnZgesvd 仅支持 m >= n。

integer function cusolverDnZgesvd(handle, &
    jobu, jobvt, m, n, A, lda, S, U, ldu, VT, ldvt, workspace, lwork, rwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: m, n, lda, ldu, ldvt, lwork
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(*) :: S
    complex(8), device, dimension(ldu,*) :: U
    complex(8), device, dimension(ldvt,*) :: VT
    complex(8), device, dimension(lwork) :: workspace
    real(8), device, dimension(lwork) :: rwork
    integer(4), device, intent(out) :: devinfo

6.3.49. cusolverDnSsyevd_buffersize

此函数计算传递到 cusolverDnSsyevd 的设备工作空间所需的缓冲区大小

integer function cusolverDnSsyevd_buffersize(handle, &
    jobz, uplo, n, A, lda, W, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(*) :: W
    integer(4) :: lwork

6.3.50. cusolverDnDsyevd_buffersize

此函数计算传递到 cusolverDnDsyevd 的设备工作空间所需的缓冲区大小

integer function cusolverDnDsyevd_buffersize(handle, &
    jobz, uplo, n, A, lda, W, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(*) :: W
    integer(4) :: lwork

6.3.51. cusolverDnCheevd_buffersize

此函数计算传递到 cusolverDnCheevd 的设备工作空间所需的缓冲区大小

integer function cusolverDnCheevd_buffersize(handle, &
    jobz, uplo, n, A, lda, W, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(*) :: W
    integer(4) :: lwork

6.3.52. cusolverDnZheevd_buffersize

此函数计算传递到 cusolverDnZheevd 的设备工作空间所需的缓冲区大小

integer function cusolverDnZheevd_buffersize(handle, &
    jobz, uplo, n, A, lda, W, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(*) :: W
    integer(4) :: lwork

6.3.53. cusolverDnSsyevd

此函数计算对称或 Hermitian nxn 矩阵 A 的特征值和特征向量。

integer function cusolverDnSsyevd(handle, &
    jobz, uplo, n, A, lda, W, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda, lwork
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(n) :: W
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.54. cusolverDnDsyevd

此函数计算对称或 Hermitian nxn 矩阵 A 的特征值和特征向量。

integer function cusolverDnDsyevd(handle, &
    jobz, uplo, n, A, lda, W, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda, lwork
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(n) :: W
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.55. cusolverDnCheevd

此函数计算对称或 Hermitian nxn 矩阵 A 的特征值和特征向量。

integer function cusolverDnCheevd(handle, &
    jobz, uplo, n, A, lda, W, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda, lwork
    complex(4), device, dimension(lda,*) :: A
    real(4), device, dimension(n) :: W
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.56. cusolverDnZheevd

此函数计算对称或 Hermitian nxn 矩阵 A 的特征值和特征向量。

integer function cusolverDnZheevd(handle, &
    jobz, uplo, n, A, lda, W, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda, lwork
    complex(8), device, dimension(lda,*) :: A
    real(8), device, dimension(n) :: W
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.57. cusolverDnSsyevdx_buffersize

此函数计算传递到 cusolverDnSsyevdx 的设备工作空间所需的缓冲区大小

integer function cusolverDnSsyevdx_buffersize(handle, &
    jobz, range, uplo, n, A, lda, vl, vu, il, iu, meig, W, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, range, uplo
    integer(4) :: n, lda, il, iu
    real(4) :: vl, vu
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(n) :: W
    integer(4) :: meig, lwork

6.3.58. cusolverDnDsyevdx_buffersize

此函数计算传递到 cusolverDnDsyevdx 的设备工作空间所需的缓冲区大小

integer function cusolverDnDsyevdx_buffersize(handle, &
    jobz, range, uplo, n, A, lda, vl, vu, il, iu, meig, W, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, range, uplo
    integer(4) :: n, lda, il, iu
    real(8) :: vl, vu
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(n) :: W
    integer(4) :: meig, lwork

6.3.59. cusolverDnCheevdx_buffersize

此函数计算传递到 cusolverDnCheevdx 的设备工作空间所需的缓冲区大小

integer function cusolverDnCheevdx_buffersize(handle, &
    jobz, range, uplo, n, A, lda, vl, vu, il, iu, meig, W, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, range, uplo
    integer(4) :: n, lda, il, iu
    real(4) :: vl, vu
    complex(4), device, dimension(lda,*) :: A
    real(4), device, dimension(n) :: W
    integer(4) :: meig, lwork

6.3.60. cusolverDnZheevdx_buffersize

此函数计算传递到 cusolverDnZheevdx 的设备工作空间所需的缓冲区大小

integer function cusolverDnZheevdx_buffersize(handle, &
    jobz, range, uplo, n, A, lda, vl, vu, il, iu, meig, W, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, range, uplo
    integer(4) :: n, lda, il, iu
    real(8) :: vl, vu
    complex(8), device, dimension(lda,*) :: A
    real(8), device, dimension(n) :: W
    integer(4) :: meig, lwork

6.3.61. cusolverDnSsyevdx

此函数计算对称或 Hermitian nxn 矩阵 A 的所有或部分特征值和特征向量。

integer function cusolverDnSsyevdx(handle, &
    jobz, range, uplo, n, A, lda, vl, vu, il, iu, meig, W, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, range, uplo
    integer(4) :: n, lda, il, iu, lwork
    real(4) :: vl, vu
    real(4), device, dimension(lda,*) :: A
    integer(4), intent(out) :: meig
    real(4), device, dimension(n) :: W
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.62. cusolverDnDsyevdx

此函数计算对称或 Hermitian nxn 矩阵 A 的所有或部分特征值和特征向量。

integer function cusolverDnDsyevdx(handle, &
    jobz, range, uplo, n, A, lda, vl, vu, il, iu, meig, W, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, range, uplo
    integer(4) :: n, lda, il, iu, lwork
    real(8) :: vl, vu
    real(8), device, dimension(lda,*) :: A
    integer(4), intent(out) :: meig
    real(8), device, dimension(n) :: W
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.63. cusolverDnCheevdx

此函数计算对称或 Hermitian nxn 矩阵 A 的所有或部分特征值和特征向量。

integer function cusolverDnCheevdx(handle, &
    jobz, range, uplo, n, A, lda, vl, vu, il, iu, meig, W, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, range, uplo
    integer(4) :: n, lda, il, iu, lwork
    real(4) :: vl, vu
    complex(4), device, dimension(lda,*) :: A
    integer(4), intent(out) :: meig
    real(4), device, dimension(n) :: W
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.64. cusolverDnZheevdx

此函数计算对称或 Hermitian nxn 矩阵 A 的所有或部分特征值和特征向量。

integer function cusolverDnZheevdx(handle, &
    jobz, range, uplo, n, A, lda, vl, vu, il, iu, meig, W, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, range, uplo
    integer(4) :: n, lda, il, iu, lwork
    real(8) :: vl, vu
    complex(8), device, dimension(lda,*) :: A
    integer(4), intent(out) :: meig
    real(8), device, dimension(n) :: W
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.65. cusolverDnSsyevj_buffersize

此函数计算传递到 cusolverDnSsyevj 的设备工作空间所需的缓冲区大小

integer function cusolverDnSsyevj_buffersize(handle, &
    jobz, uplo, n, A, lda, W, lwork, params)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(*) :: W
    integer(4), intent(out) :: lwork
    type(cusolverDnSyevjInfo) :: params

6.3.66. cusolverDnDsyevj_buffersize

此函数计算传递到 cusolverDnDsyevj 的设备工作空间所需的缓冲区大小

integer function cusolverDnDsyevj_buffersize(handle, &
    jobz, uplo, n, A, lda, W, lwork, params)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(*) :: W
    integer(4), intent(out) :: lwork
    type(cusolverDnSyevjInfo) :: params

6.3.67. cusolverDnCheevj_buffersize

此函数计算传递到 cusolverDnCheevj 的设备工作空间所需的缓冲区大小

integer function cusolverDnCheevj_buffersize(handle, &
    jobz, uplo, n, A, lda, W, lwork, params)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda
    complex(4), device, dimension(lda,*) :: A
    real(4), device, dimension(*) :: W
    integer(4), intent(out) :: lwork
    type(cusolverDnSyevjInfo) :: params

6.3.68. cusolverDnZheevj_buffersize

此函数计算传递到 cusolverDnZheevj 的设备工作空间所需的缓冲区大小

integer function cusolverDnZheevj_buffersize(handle, &
    jobz, uplo, n, A, lda, W, lwork, params)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda
    complex(8), device, dimension(lda,*) :: A
    real(8), device, dimension(*) :: W
    integer(4), intent(out) :: lwork
    type(cusolverDnSyevjInfo) :: params

6.3.69. cusolverDnSsyevj

此函数计算对称或 Hermitian nxn 矩阵 A 的特征值和特征向量。

integer function cusolverDnSsyevj(handle, &
    jobz, uplo, n, A, lda, W, workspace, lwork, devinfo, params)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda, lwork
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(n) :: W
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo
 type(cusolverDnSyevjInfo) :: params

6.3.70. cusolverDnDsyevj

此函数计算对称或 Hermitian nxn 矩阵 A 的特征值和特征向量。

integer function cusolverDnDsyevj(handle, &
    jobz, uplo, n, A, lda, W, workspace, lwork, devinfo, params)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda, lwork
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(n) :: W
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo
    type(cusolverDnSyevjInfo) :: params

6.3.71. cusolverDnCheevj

此函数计算对称或 Hermitian nxn 矩阵 A 的特征值和特征向量。

integer function cusolverDnCheevj(handle, &
    jobz, uplo, n, A, lda, W, workspace, lwork, devinfo, params)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda, lwork
    complex(4), device, dimension(lda,*) :: A
    real(4), device, dimension(n) :: W
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo
    type(cusolverDnSyevjInfo) :: params

6.3.72. cusolverDnZheevj

此函数计算对称或 Hermitian nxn 矩阵 A 的特征值和特征向量。

integer function cusolverDnZheevj(handle, &
    jobz, uplo, n, A, lda, W, workspace, lwork, devinfo, params)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda, lwork
    complex(8), device, dimension(lda,*) :: A
    real(4), device, dimension(n) :: W
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo
    type(cusolverDnSyevjInfo) :: params

6.3.73. cusolverDnSsyevjBatched_bufferSize

此函数计算传递到 cusolverDnSsyevjBatched 的设备工作空间所需的缓冲区大小。

integer function cusolverDnSsyevjBatched_bufferSize(handle, &
    jobz, uplo, n, A, lda, W, lwork, params, batchSize)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda, lwork
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(n) :: W
    integer(4), intent(out) :: lwork
    type(cusolverDnSyevjInfo) :: params
    integer(4) :: batchSize

6.3.74. cusolverDnDsyevjBatched_bufferSize

此函数计算传递到 cusolverDnDsyevjBatched 的设备工作空间所需的缓冲区大小。

integer function cusolverDnDsyevjBatched_bufferSize(handle, &
    jobz, uplo, n, A, lda, W, lwork, params, batchSize)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda, lwork
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(n) :: W
    integer(4), intent(out) :: lwork
    type(cusolverDnSyevjInfo) :: params
    integer(4) :: batchSize

6.3.75. cusolverDnCheevjBatched_bufferSize

此函数计算传递到 cusolverDnCheevjBatched 的设备工作空间所需的缓冲区大小。

integer function cusolverDnCheevjBatched_bufferSize(handle, &
    jobz, uplo, n, A, lda, W, lwork, params, batchSize)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda, lwork
    complex(4), device, dimension(lda,*) :: A
    real(4), device, dimension(n) :: W
    integer(4), intent(out) :: lwork
    type(cusolverDnSyevjInfo) :: params
    integer(4) :: batchSize

6.3.76. cusolverDnZheevjBatched_bufferSize

此函数计算传递到 cusolverDnZheevjBatched 的设备工作空间所需的缓冲区大小。

integer function cusolverDnZheevjBatched_bufferSize(handle, &
    jobz, uplo, n, A, lda, W, lwork, params, batchSize)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda, lwork
    complex(8), device, dimension(lda,*) :: A
    real(8), device, dimension(n) :: W
    integer(4), intent(out) :: lwork
    type(cusolverDnSyevjInfo) :: params
    integer(4) :: batchSize

6.3.77. cusolverDnSsyevjBatched

此函数计算对称或 Hermitian nxn 矩阵的特征值和特征向量。

integer function cusolverDnSsyevjBatched(handle, &
    jobz, uplo, n, A, lda, W, workspace, lwork, devinfo, params, batchSize)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda, lwork
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(n) :: W
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo
    type(cusolverDnSyevjInfo) :: params
    integer(4) :: batchSize

6.3.78. cusolverDnDsyevjBatched

此函数计算对称或 Hermitian nxn 矩阵的特征值和特征向量。

integer function cusolverDnDsyevjBatched(handle, &
    jobz, uplo, n, A, lda, W, workspace, lwork, devinfo, params, batchSize)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda, lwork
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(n) :: W
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo
    type(cusolverDnSyevjInfo) :: params
    integer(4) :: batchSize

6.3.79. cusolverDnCheevjBatched

此函数计算对称或 Hermitian nxn 矩阵的特征值和特征向量。

integer function cusolverDnCheevjBatched(handle, &
    jobz, uplo, n, A, lda, W, workspace, lwork, devinfo, params, batchSize)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda, lwork
    complex(4), device, dimension(lda,*) :: A
    real(4), device, dimension(n) :: W
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo
    type(cusolverDnSyevjInfo) :: params
    integer(4) :: batchSize

6.3.80. cusolverDnZheevjBatched

此函数计算对称或 Hermitian nxn 矩阵的特征值和特征向量。

integer function cusolverDnZheevjBatched(handle, &
    jobz, uplo, n, A, lda, W, workspace, lwork, devinfo, params, batchSize)
    type(cusolverDnHandle) :: handle
    integer(4) :: jobz, uplo
    integer(4) :: n, lda, lwork
    complex(8), device, dimension(lda,*) :: A
    real(8), device, dimension(n) :: W
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo
    type(cusolverDnSyevjInfo) :: params
    integer(4) :: batchSize

6.3.81. cusolverDnSsygvd_buffersize

此函数计算传递到 cusolverDnSsygvd 的设备工作空间所需的缓冲区大小

integer function cusolverDnSsygvd_buffersize(handle, &
    itype, jobz, uplo, n, A, lda, B, ldb, W, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: itype, jobz, uplo
    integer(4) :: n, lda, ldb
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(ldb,*) :: B
    real(4), device, dimension(n) :: W
    integer(4) :: lwork

6.3.82. cusolverDnDsygvd_buffersize

此函数计算传递到 cusolverDnDsygvd 的设备工作空间所需的缓冲区大小

integer function cusolverDnDsygvd_buffersize(handle, &
    itype, jobz, uplo, n, A, lda, B, ldb, W, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: itype, jobz, uplo
    integer(4) :: n, lda, ldb
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(ldb,*) :: B
    real(8), device, dimension(n) :: W
    integer(4) :: lwork

6.3.83. cusolverDnChegvd_buffersize

此函数计算传递到 cusolverDnChegvd 的设备工作空间所需的缓冲区大小

integer function cusolverDnChegvd_buffersize(handle, &
    itype, jobz, uplo, n, A, lda, B, ldb, W, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: itype, jobz, uplo
    integer(4) :: n, lda, ldb
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(ldb,*) :: B
    real(4), device, dimension(n) :: W
    integer(4) :: lwork

6.3.84. cusolverDnZhegvd_buffersize

此函数计算传递到 cusolverDnZhegvd 的设备工作空间所需的缓冲区大小

integer function cusolverDnZhegvd_buffersize(handle, &
    itype, jobz, uplo, n, A, lda, B, ldb, W, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: itype, jobz, uplo
    integer(4) :: n, lda, ldb
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(ldb,*) :: B
    real(8), device, dimension(n) :: W
    integer(4) :: lwork

6.3.85. cusolverDnSsygvd

此函数计算对称或 Hermitian nxn 矩阵对 (A,B) 的特征值和特征向量。

integer function cusolverDnSsygvd(handle, &
    itype, jobz, uplo, n, A, lda, B, ldb, W, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: itype, jobz, uplo
    integer(4) :: n, lda, ldb, lwork
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(ldb,*) :: B
    real(4), device, dimension(n) :: W
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.86. cusolverDnDsygvd

此函数计算对称或 Hermitian nxn 矩阵对 (A,B) 的特征值和特征向量。

integer function cusolverDnDsygvd(handle, &
    itype, jobz, uplo, n, A, lda, B, ldb, W, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: itype, jobz, uplo
    integer(4) :: n, lda, ldb, lwork
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(ldb,*) :: B
    real(8), device, dimension(n) :: W
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.87. cusolverDnChegvd

此函数计算对称或 Hermitian nxn 矩阵对 (A,B) 的特征值和特征向量。

integer function cusolverDnChegvd(handle, &
    itype, jobz, uplo, n, A, lda, B, ldb, W, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: itype, jobz, uplo
    integer(4) :: n, lda, ldb, lwork
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(ldb,*) :: B
    real(4), device, dimension(n) :: W
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.88. cusolverDnZhegvd

此函数计算对称或 Hermitian nxn 矩阵对 (A,B) 的特征值和特征向量。

integer function cusolverDnZhegvd(handle, &
    itype, jobz, uplo, n, A, lda, B, ldb, W, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: itype, jobz, uplo
    integer(4) :: n, lda, ldb, lwork
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(ldb,*) :: B
    real(8), device, dimension(n) :: W
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.89. cusolverDnSsygvdx_buffersize

此函数计算传递到 cusolverDnSsygvdx 的设备工作空间所需的缓冲区大小

integer function cusolverDnSsygvdx_buffersize(handle, &
    itype, jobz, range, uplo, n, A, lda, B, ldb, vl, vu, il, iu, meig, W, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: itype, jobz, range, uplo
    integer(4) :: n, lda, ldb, il, iu
    real(4) :: vl, vu
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(ldb,*) :: B
    real(4), device, dimension(n) :: W
    integer(4) :: meig, lwork

6.3.90. cusolverDnDsygvdx_buffersize

此函数计算传递到 cusolverDnDsygvdx 的设备工作空间所需的缓冲区大小

integer function cusolverDnDsygvdx_buffersize(handle, &
    itype, jobz, range, uplo, n, A, lda, B, ldb, vl, vu, il, iu, meig, W, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: itype, jobz, range, uplo
    integer(4) :: n, lda, ldb, il, iu
    real(8) :: vl, vu
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(ldb,*) :: B
    real(8), device, dimension(n) :: W
    integer(4) :: meig, lwork

6.3.91. cusolverDnChegvdx_buffersize

此函数计算传递到 cusolverDnChegvdx 的设备工作空间所需的缓冲区大小

integer function cusolverDnChegvdx_buffersize(handle, &
    itype, jobz, range, uplo, n, A, lda, B, ldb, vl, vu, il, iu, meig, W, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: itype, jobz, range, uplo
    integer(4) :: n, lda, ldb, il, iu
    real(4) :: vl, vu
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(ldb,*) :: B
    real(4), device, dimension(n) :: W
    integer(4) :: meig, lwork

6.3.92. cusolverDnZhegvdx_buffersize

此函数计算传递到 cusolverDnZhegvdx 的设备工作空间所需的缓冲区大小

integer function cusolverDnZhegvdx_buffersize(handle, &
    itype, jobz, range, uplo, n, A, lda, B, ldb, vl, vu, il, iu, meig, W, lwork)
    type(cusolverDnHandle) :: handle
    integer(4) :: itype, jobz, range, uplo
    integer(4) :: n, lda, ldb, il, iu
    real(8) :: vl, vu
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(ldb,*) :: B
    real(8), device, dimension(n) :: W
    integer(4) :: meig, lwork

6.3.93. cusolverDnSsygvdx

此函数计算对称或 Hermitian nxn 矩阵对 (A,B) 的所有或部分特征值和特征向量。

integer function cusolverDnSsygvdx(handle, &
    itype, jobz, range, uplo, n, A, lda, B, ldb, vl, vu, il, iu, meig, W, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: itype, jobz, range, uplo
    integer(4) :: n, lda, ldb, il, iu, lwork
    real(4) :: vl, vu
    real(4), device, dimension(lda,*) :: A
    real(4), device, dimension(ldb,*) :: B
    integer(4), intent(out) :: meig
    real(4), device, dimension(n) :: W
    real(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.94. cusolverDnDsygvdx

此函数计算对称或 Hermitian nxn 矩阵对 (A,B) 的所有或部分特征值和特征向量。

integer function cusolverDnDsygvdx(handle, &
    itype, jobz, range, uplo, n, A, lda, B, ldb, vl, vu, il, iu, meig, W, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: itype, jobz, range, uplo
    integer(4) :: n, lda, ldb, il, iu, lwork
    real(8) :: vl, vu
    real(8), device, dimension(lda,*) :: A
    real(8), device, dimension(ldb,*) :: B
    integer(4), intent(out) :: meig
    real(8), device, dimension(n) :: W
    real(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.95. cusolverDnChegvdx

此函数计算对称或 Hermitian nxn 矩阵对 (A,B) 的所有或部分特征值和特征向量。

integer function cusolverDnChegvdx(handle, &
    itype, jobz, range, uplo, n, A, lda, B, ldb, vl, vu, il, iu, meig, W, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: itype, jobz, range, uplo
    integer(4) :: n, lda, ldb, il, iu, lwork
    real(4) :: vl, vu
    complex(4), device, dimension(lda,*) :: A
    complex(4), device, dimension(ldb,*) :: B
    integer(4), intent(out) :: meig
    real(4), device, dimension(n) :: W
    complex(4), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.3.96. cusolverDnZhegvdx

此函数计算对称或 Hermitian nxn 矩阵对 (A,B) 的所有或部分特征值和特征向量。

integer function cusolverDnZhegvdx(handle, &
    itype, jobz, range, uplo, n, A, lda, B, ldb, vl, vu, il, iu, meig, W, workspace, lwork, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: itype, jobz, range, uplo
    integer(4) :: n, lda, ldb, il, iu, lwork
    real(8) :: vl, vu
    complex(8), device, dimension(lda,*) :: A
    complex(8), device, dimension(ldb,*) :: B
    integer(4), intent(out) :: meig
    real(8), device, dimension(n) :: W
    complex(8), device, dimension(lwork) :: workspace
    integer(4), device, intent(out) :: devinfo

6.4. cusolverDn 64-bit API

本节介绍 cusolverDn 的线性求解器 64 位 API,包括 Cholesky 分解、带部分主元的 LU 分解和 QR 分解。

6.4.1. cusolverDnXpotrf_buffersize

此函数计算传递到 cusolverDnXpotrf 的主机和设备工作空间所需的缓冲区大小

A 矩阵的类型和种类由 dataTypeA 参数确定。computeType 通常设置为相同。数组大小和维度,例如 n, m, lda 将由编译器提升为 integer(8),因此可以使用其他整数类型。

integer function cusolverDnXpotrf_buffersize(handle, &
    params, uplo, n, dataTypeA, A, lda, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverDnHandle) :: handle
    type(cusolverDnParams) :: params
    integer(4) :: uplo
    integer(8) :: n, lda
    type(cudaDataType) :: dataTypeA, computeType
    real, device, dimension(lda,*) :: A
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.4.2. cusolverDnXpotrf

此函数计算 Hermitian 正定矩阵的 Cholesky 分解

A 矩阵的类型和种类由 dataTypeA 参数确定。computeType 通常设置为相同。数组大小和维度,例如 n, m, lda 将由编译器提升为 integer(8),因此可以使用其他整数类型。只要有足够的字节空间,工作空间可以是任何类型和种类。

integer function cusolverDnXpotrf(handle, &
    params, uplo, n, dataTypeA, A, lda, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, devinfo)
    type(cusolverDnHandle) :: handle
    type(cusolverDnParams) :: params
    integer(4) :: uplo
    integer(8) :: n, lda
    type(cudaDataType) :: dataTypeA, computeType
    real, device, dimension(lda,*) :: A
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: devinfo

6.4.3. cusolverDnXpotrs

此函数使用 cusolverDnXpotrf 求解 Hermitian 正定矩阵的 Cholesky 分解得到的线性方程组

A, B 矩阵的类型和种类分别由 dataTypeA 和 dataTypeB 参数确定。数组大小和维度,例如 n, m, lda 将由编译器提升为 integer(8),因此可以使用其他整数类型。

integer function cusolverDnXpotrs(handle, &
    params, uplo, n, nrhs, dataTypeA, A, lda, &
    dataTypeB, B, ldb, devinfo)
    type(cusolverDnHandle) :: handle
    type(cusolverDnParams) :: params
    integer(4) :: uplo
    integer(8) :: n, nrhs, lda, ldb
    type(cudaDataType) :: dataTypeA, dataTypeB
    real, device, dimension(lda,*) :: A
    real, device, dimension(ldb,*) :: B
    integer(4), device, intent(out) :: devinfo

6.4.4. cusolverDnXgeqrf_buffersize

此函数计算传递到 cusolverDnXgeqrf 的主机和设备工作空间所需的缓冲区大小

A 矩阵和 tau 向量的类型和种类分别由 dataTypeA 和 dataTypeTau 参数确定。computeType 通常设置为相同。数组大小和维度,例如 n, m, lda 将由编译器提升为 integer(8),因此可以使用其他整数类型。

integer function cusolverDnXgeqrf_buffersize(handle, &
    params, m, n, dataTypeA, A, lda, dataTypeTau, tau, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverDnHandle) :: handle
    type(cusolverDnParams) :: params
    integer(8) :: m, n, lda
    type(cudaDataType) :: dataTypeA, dataTypeTau, computeType
    real, device, dimension(lda,*) :: A
    real, device, dimension(*)     :: tau
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.4.5. cusolverDnXgeqrf

此函数计算通用 mxn 矩阵的 QR 分解

A 矩阵和 tau 向量的类型和种类分别由 dataTypeA 和 dataTypeTau 参数确定。computeType 通常设置为相同。数组大小和维度,例如 n, m, lda 将由编译器提升为 integer(8),因此可以使用其他整数类型。只要有足够的字节空间,工作空间可以是任何类型和种类。

integer function cusolverDnXgeqrf(handle, &
    params, m, n, dataTypeA, A, lda, dataTypeTau, tau, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, devinfo)
    type(cusolverDnHandle) :: handle
    type(cusolverDnParams) :: params
    integer(8) :: m, n, lda
    type(cudaDataType) :: dataTypeA, dataTypeTau, computeType
    real, device, dimension(lda,*) :: A
    real, device, dimension(*)     :: tau
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: devinfo

6.4.6. cusolverDnXgetrf_buffersize

此函数计算传递到 cusolverDnXgetrf 的主机和设备工作空间所需的缓冲区大小

A 矩阵的类型和种类由 dataTypeA 参数确定。computeType 通常设置为相同。数组大小和维度,例如 n, m, lda 将由编译器提升为 integer(8),因此可以使用其他整数类型。

integer function cusolverDnXgetrf_buffersize(handle, &
    params, m, n, dataTypeA, A, lda, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverDnHandle) :: handle
    type(cusolverDnParams) :: params
    integer(8) :: m, n, lda
    type(cudaDataType) :: dataTypeA, computeType
    real, device, dimension(lda,*) :: A
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.4.7. cusolverDnXgetrf

此函数计算一般 mxn 矩阵的 LU 分解

A 矩阵的类型和种类由 dataTypeA 参数确定。computeType 通常设置为相同。数组大小和维度,例如 n, m, lda 将由编译器提升为 integer(8),因此可以使用其他整数类型。只要有足够的字节空间,工作空间可以是任何类型和种类。

integer function cusolverDnXgetrf(handle, &
    params, m, n, dataTypeA, A, lda, devipiv, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, devinfo)
    type(cusolverDnHandle) :: handle
    type(cusolverDnParams) :: params
    integer(8) :: n, m, lda
    type(cudaDataType) :: dataTypeA, computeType
    real, device, dimension(lda,*) :: A
    integer(8), device, dimension(*), intent(out) :: devipiv
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: devinfo

6.4.8. cusolverDnXgetrs

此函数求解应用通用 nxn 矩阵的多个右侧线性系统,该矩阵已使用 cusolverDnXgetrf 进行 LU 分解

A, B 矩阵的类型和种类分别由 dataTypeA 和 dataTypeB 参数确定。数组大小和维度,例如 n, m, lda 将由编译器提升为 integer(8),因此可以使用其他整数类型。

integer function cusolverDnXpotrs(handle, &
    params, trans, n, nrhs, dataTypeA, A, lda, devipiv, &
    dataTypeB, B, ldb, devinfo)
    type(cusolverDnHandle) :: handle
    type(cusolverDnParams) :: params
    integer(4) :: trans
    integer(8) :: n, nrhs, lda, ldb
    type(cudaDataType) :: dataTypeA, dataTypeB
    real, device, dimension(lda,*) :: A
    integer(8), device, dimension(*), intent(in) :: devipiv
    real, device, dimension(ldb,*) :: B
    integer(4), device, intent(out) :: devinfo

6.4.9. cusolverDnXsyevd_buffersize

此函数计算传递到 cusolverDnXsyevd 的主机和设备工作空间所需的缓冲区大小

A 矩阵和 W 数组的类型和种类分别由 dataTypeA 和 dataTypeW 参数确定。computeType 通常设置为相同。数组大小和维度,例如 n, m, lda 将由编译器提升为 integer(8),因此可以使用其他整数类型。

integer function cusolverDnXsyevd_buffersize(handle, &
    params, jobz, uplo, n, dataTypeA, A, lda, &
    dataTypeW, W, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverDnHandle) :: handle
    type(cusolverDnParams) :: params
    integer(4) :: jobz, uplo
    integer(8) :: n, lda
    type(cudaDataType) :: dataTypeA, dataTypeW, computeType
    real, device, dimension(lda,*) :: A
    real, device, dimension(*)     :: W
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.4.10. cusolverDnXsyevd

此函数计算对称(Hermitian)nxn 矩阵的特征值和特征向量

A 矩阵和 W 数组的类型和种类分别由 dataTypeA 和 dataTypeW 参数确定。computeType 通常设置为相同。数组大小和维度,例如 n, m, lda 将由编译器提升为 integer(8),因此可以使用其他整数类型。只要有足够的字节空间,工作空间可以是任何类型和种类。

integer function cusolverDnXsyevd(handle, &
    params, jobz, uplo, n, dataTypeA, A, lda, &
    dataTypeW, W, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, devinfo)
    type(cusolverDnHandle) :: handle
    type(cusolverDnParams) :: params
    integer(4) :: jobz, uplo
    integer(8) :: n, lda
    type(cudaDataType) :: dataTypeA, dataTypeW, computeType
    real, device, dimension(lda,*) :: A
    real, device, dimension(*)     :: W
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: devinfo

6.4.11. cusolverDnXsyevdx_buffersize

此函数计算传递到 cusolverDnXsyevdx 的主机和设备工作空间所需的缓冲区大小

A 矩阵和 W 数组的类型和种类分别由 dataTypeA 和 dataTypeW 参数确定。computeType 通常设置为相同。数组大小和维度,例如 n, m, lda 将由编译器提升为 integer(8),因此可以使用其他整数类型。

integer function cusolverDnXsyevdx_buffersize(handle, &
    params, jobz, range, uplo, n, dataTypeA, A, lda, &
    vl, vu, il, iu, meig, &
    dataTypeW, W, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverDnHandle) :: handle
    type(cusolverDnParams) :: params
    integer(4) :: jobz, range, uplo
    integer(8) :: n, lda, il, iu
    type(cudaDataType) :: dataTypeA, dataTypeW, computeType
    real, device, dimension(lda,*) :: A
    real :: vl, vu
    integer(8) :: meig
    real, device, dimension(*)     :: W
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.4.12. cusolverDnXsyevdx

此函数计算对称(Hermitian)nxn 矩阵的所有或部分特征值,并可选择计算特征向量

A 矩阵和 W 数组的类型和种类分别由 dataTypeA 和 dataTypeW 参数确定。computeType 通常设置为相同。数组大小和维度,例如 n, m, lda 将由编译器提升为 integer(8),因此可以使用其他整数类型。只要有足够的字节空间,工作空间可以是任何类型和种类。

integer function cusolverDnXsyevdx(handle, &
    params, jobz, range, uplo, n, dataTypeA, A, lda, &
    vl, vu, il, iu, meig, &
    dataTypeW, W, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, devinfo)
    type(cusolverDnHandle) :: handle
    type(cusolverDnParams) :: params
    integer(4) :: jobz, range, uplo
    integer(8) :: n, lda, il, iu
    type(cudaDataType) :: dataTypeA, dataTypeW, computeType
    real, device, dimension(lda,*) :: A
    real :: vl, vu
    integer(8) :: meig
    real, device, dimension(*)     :: W
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: devinfo

6.4.13. cusolverDnXsytrs_bufferSize

此函数计算使用通用 API cusolverDnXsytrs 函数求解线性方程组所需的缓冲区大小。

integer function cusolverDnXsytrs_bufferSize(handle, &
    uplo, n, nrhs, datatypeA, A, lda, &
    devipiv, datatypeB, B, ldb, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    type(cudaDataType) :: dataTypeA, dataTypeB
    integer(8) :: n, nrhs, lda, ldb
    real, device, dimension(lda,*) :: A
    integer(8), device :: devipiv(*)
    real, device, dimension(ldb,*) :: B
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.4.14. cusolverDnXsytrs

此函数使用通用 API 求解线性方程组。

integer function cusolverDnXsytrs(handle, &
    uplo, n, nrhs, datatypeA, A, lda, &
    devipiv, datatypeB, B, ldb, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo
    type(cudaDataType) :: dataTypeA, dataTypeB
    integer(8) :: n, nrhs, lda, ldb
    real, device, dimension(lda,*) :: A
    integer(8), device :: devipiv(*)
    real, device, dimension(ldb,*) :: B
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: devinfo

6.4.15. cusolverDnXtrtri_bufferSize

此函数计算使用通用 API cusolverDnXtrtri 函数计算上三角或下三角矩阵 A 的逆矩阵所需的缓冲区大小。

integer function cusolverDnXtrtri_bufferSize(handle, &
    uplo, diag, n, datatypeA, A, lda, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo, diag
    type(cudaDataType) :: dataTypeA
    integer(8) :: n, lda
    real, device, dimension(lda,*) :: A
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.4.16. cusolverDnXtrtri

此函数使用通用 API 接口计算上三角或下三角矩阵 A 的逆矩阵。

integer function cusolverDnXtrtri(handle, &
    uplo, diag, n, datatypeA, A, lda, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, devinfo)
    type(cusolverDnHandle) :: handle
    integer(4) :: uplo, diag
    type(cudaDataType) :: dataTypeA
    integer(8) :: n, lda
    real, device, dimension(lda,*) :: A
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: devinfo

6.4.17. cusolverDnXgesvd_buffersize

此函数计算传递到 cusolverDnXgesvd 中的主机和设备工作空间所需的缓冲区大小。

A、 U VT 矩阵以及 S 数组的类型和 kind 由相关的 dataType 参数确定。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 n、 m、 lda)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverDnXgesvd_buffersize(handle, &
    params, jobu, jobvt, m, n, dataTypeA, A, lda, &
    dataTypeS, S, dataTypeU, U, ldu, &
    dataTypeVT, VT, ldvt, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverDnHandle) :: handle
    type(cusolverDnParams) :: params
    character*1 :: jobu, jobvt
    integer(8) :: m, n, lda, ldu, ldvt
    type(cudaDataType) :: dataTypeA, dataTypeS, dataTypeU, dataTypeVT, &
    computeType
    real, device, dimension(lda,*) :: A
    real, device, dimension(*)     :: S
    real, device, dimension(ldu,*) :: U
    real, device, dimension(ldvt,*) :: VT
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.4.18. cusolverDnXgesvd

此函数计算 mxn 矩阵的奇异值分解 (SVD)。

A、 U VT 矩阵以及 S 数组的类型和 kind 由相关的 dataType 参数确定。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 n、 m、 lda)提升为 integer(8),因此可以使用其他整数 kind。只要字节空间足够,工作空间可以是任何类型和 kind。

integer function cusolverDnXgesvd(handle, &
    params, jobu, jobvt, m, n, dataTypeA, A, lda, &
    dataTypeS, S, dataTypeU, U, ldu, &
    dataTypeVT, VT, ldvt, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, devinfo)
    type(cusolverDnHandle) :: handle
    type(cusolverDnParams) :: params
    character*1 :: jobu, jobvt
    integer(8) :: m, n, lda, ldu, ldvt
    type(cudaDataType) :: dataTypeA, dataTypeS, dataTypeU, dataTypeVT, &
    computeType
    real, device, dimension(lda,*) :: A
    real, device, dimension(*)     :: S
    real, device, dimension(ldu,*) :: U
    real, device, dimension(ldvt,*) :: VT
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: devinfo

6.4.19. cusolverDnXgesvdp_buffersize

此函数计算传递到 cusolverDnXgesvdp 中的主机和设备工作空间所需的缓冲区大小。

A、 U V 矩阵以及 S 数组的类型和 kind 由相关的 dataType 参数确定。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 n、 m、 lda)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverDnXgesvdp_buffersize(handle, &
    params, jobz, econ, m, n, dataTypeA, A, lda, &
    dataTypeS, S, dataTypeU, U, ldu, &
    dataTypeV, V, ldv, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverDnHandle) :: handle
    type(cusolverDnParams) :: params
    integer(4) :: jobz, econ
    integer(8) :: m, n, lda, ldu, ldv
    type(cudaDataType) :: dataTypeA, dataTypeS, dataTypeU, dataTypeV, &
    computeType
    real, device, dimension(lda,*) :: A
    real, device, dimension(*)     :: S
    real, device, dimension(ldu,*) :: U
    real, device, dimension(ldv,*) :: V
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.4.20. cusolverDnXgesvdp

此函数计算 mxn 矩阵的奇异值分解 (SVD)。此变体结合了极分解和 cusolverDnXsyevd 来计算 SVD。

A、 U V 矩阵以及 S 数组的类型和 kind 由相关的 dataType 参数确定。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 n、 m、 lda)提升为 integer(8),因此可以使用其他整数 kind。只要字节空间足够,工作空间可以是任何类型和 kind。

integer function cusolverDnXgesvdp(handle, &
    params, jobz, econ, m, n, dataTypeA, A, lda, &
    dataTypeS, S, dataTypeU, U, ldu, &
    dataTypeV, V, ldv, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, devinfo)
    type(cusolverDnHandle) :: handle
    type(cusolverDnParams) :: params
    integer(4) :: jobz, econ
    integer(8) :: m, n, lda, ldu, ldv
    type(cudaDataType) :: dataTypeA, dataTypeS, dataTypeU, dataTypeVT, &
    computeType
    real, device, dimension(lda,*) :: A
    real, device, dimension(*)     :: S
    real, device, dimension(ldu,*) :: U
    real, device, dimension(ldv,*) :: V
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: devinfo

6.4.21. cusolverDnXgesvdr_buffersize

此函数计算传递到 cusolverDnXgesvdr 中的主机和设备工作空间所需的缓冲区大小。

A、 Urand Vrand 矩阵以及 Srand 数组的类型和 kind 由相关的 dataType 参数确定。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 n、 m、 lda)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverDnXgesvdr_buffersize(handle, &
    params, jobu, jobvt, m, n, k, p, niters, dataTypeA, A, lda, &
    dataTypeSrand, Srand, dataTypeUrand, Urand, ldurand, &
    dataTypeVrand, Vrand, ldvrand, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverDnHandle) :: handle
    type(cusolverDnParams) :: params
    character*1 :: jobu, jobvt
    integer(8) :: m, n, k, p, niters, lda, ldurand, ldvrand
    type(cudaDataType) :: dataTypeA, dataTypeSrand, dataTypeUrand, &
      dataTypeVrand, computeType
    real, device, dimension(lda,*) :: A
    real, device, dimension(*)     :: Srand
    real, device, dimension(ldurand,*) :: Urand
    real, device, dimension(ldvrand,*) :: Vrand
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.4.22. cusolverDnXgesvdr

此函数计算 mxn 矩阵的近似秩-k 奇异值分解 (SVD)。

A、 Urand Vrand 矩阵以及 Srand 数组的类型和 kind 由相关的 dataType 参数确定。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 n、 m、 lda)提升为 integer(8),因此可以使用其他整数 kind。只要字节空间足够,工作空间可以是任何类型和 kind。

integer function cusolverDnXgesvdr(handle, &
    params, jobu, jobv, m, n, k, p, niters, dataTypeA, A, lda, &
    dataTypeSrand, Srand, dataTypeUrand, Urand, ldurand, &
    dataTypeVrand, Vrand, ldvrand, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, devinfo)
    type(cusolverDnHandle) :: handle
    type(cusolverDnParams) :: params
    character*1 :: jobu, jobv
    integer(8) :: m, n, k, p, niters, lda, ldurand, ldvrand
    type(cudaDataType) :: dataTypeA, dataTypeSrand, dataTypeUrand, &
      dataTypeVrand, computeType
    real, device, dimension(lda,*) :: A
    real, device, dimension(*)     :: Srand
    real, device, dimension(ldurand,*) :: Urand
    real, device, dimension(ldvrand,*) :: Vrand
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: devinfo

6.5. cusolverMp API

本节介绍 cusolverMp 中支持的分布式多处理器线性求解器,以及用于设置和初始化库的支持函数。

cusolverMp 模块包含以下派生类型定义

! Definitions from cusolverMp.h
integer, parameter :: CUSOLVERMP_VER_MAJOR = 0
integer, parameter :: CUSOLVERMP_VER_MINOR = 4
integer, parameter :: CUSOLVERMP_VER_PATCH = 3
integer, parameter :: CUSOLVERMP_VER_BUILD = 0
integer, parameter :: CUSOLVERMP_VERSION = &
        (CUSOLVERMP_VER_MAJOR * 1000 + CUSOLVERMP_VER_MINOR * 100 + CUSOLVERMP_VER_PATCH)
! Types from cusolverMp.h
    TYPE cusolverMpHandle
      TYPE(C_PTR) :: handle
    END TYPE cusolverMpHandle

    TYPE cusolverMpGrid
      TYPE(C_PTR) :: handle
    END TYPE cusolverMpGrid

    TYPE cusolverMpMatrixDescriptor
      TYPE(C_PTR) :: handle
    END TYPE cusolverMpMatrixDescriptor
enum, bind(c)
    enumerator :: CUDALIBMP_GRID_MAPPING_COL_MAJOR = 0
    enumerator :: CUDALIBMP_GRID_MAPPING_ROW_MAJOR = 1
end enum

6.5.1. cusolverMpCreate

此函数初始化 cusolverMp 库并在 cusolverDn 上下文中创建句柄。它必须在调用其他 cuSolverMp API 函数之前调用,但在创建 CUDA 上下文和流之后调用。

integer(4) function cusolverMpCreate(handle, deviceId, stream)
  type(cusolverMpHandle) :: handle
  integer(4) :: deviceId
  integer(cuda_stream_kind) :: stream

6.5.2. cusolverMpDestroy

此函数释放 cuSolverMp 库使用的 CPU 端资源。

integer(4) function cusolverMpDestroy(handle)
  type(cusolverMpHandle) :: handle

6.5.3. cusolverMpGetStream

此函数获取 cuSolverMp 库用于执行其例程的流。

integer(4) function cusolverMpGetStream(handle, stream)
  type(cusolverMpHandle) :: handle
  integer(cuda_stream_kind) :: stream

6.5.4. cusolverMpGetVersion

此函数在运行时获取 cuSolverMp 库的版本。它的值为 (CUSOLVERMP_VER_MAJOR * 1000 + CUSOLVERMP_VER_MINOR * 100 + CUSOLVERMP_VER_PATCH)

integer(4) function cusolverMpGetVersion(handle, version)
  type(cusolverMpHandle) :: handle
  integer(4) :: version

6.5.5. cusolverMpCreateDeviceGrid

此函数初始化 cusolverMp 库中使用的网格数据结构。它接受句柄、通信器以及与数据布局相关的其他信息作为输入。

integer(4) function cusolverMpCreateDeviceGrid(handle, &
          grid, comm, numRowDevices, numColDevices, mapping)
  type(cusolverMpHandle) :: handle
  type(cusolverMpGrid) :: grid
  type(cal_comm) :: comm
  integer(4) :: numRowDevices, numColDevices
  integer(4) :: mapping ! enum above, usually column major in Fortran

6.5.6. cusolverMpDestroyGrid

此函数销毁网格数据结构并释放 cusolverMp 库中使用的资源。

integer(4) function cusolverMpDestroyGrid(grid)
   type(cusolverMpGrid) :: grid

6.5.7. cusolverMpCreateMatrixDesc

此函数初始化 cusolverMp 库中使用的矩阵描述符对象。它接受全局数组中的行数 (M_A) 和列数 (N_A),以及每个维度上的分块因子。 RSRC_A 和 CSRC_A 目前必须为 0。 LLD_A 是本地矩阵的引导维度,在分块和分布矩阵之后。

integer(4) function cusolverMpCreateMatrixDesc(descr, grid, &
          dataType, M_A, N_A, MB_A, NB_A, RSRC_A, CSRC_A, LLD_A)
  type(cusolverMpMatrixDescriptor)  :: descr
  type(cusolverMpGrid) :: grid
  type(cudaDataType)  :: dataType
  integer(8) :: M_A, N_A, MB_A, NB_A
  integer(4) :: RSRC_A, CSRC_A
  integer(8) :: LLD_A

6.5.8. cusolverMpDestroyMatrixDesc

此函数销毁矩阵描述符数据结构并释放 cusolverMp 库中使用的资源。

integer(4) function cusolverMpDestroyMatrixDesc(descr)
   type(cusolverMpMatrixDescriptor) :: descr

6.5.9. cusolverMpNumROC

此实用程序函数返回 iproc 进程拥有的分布式矩阵中的行数或列数。

integer(4) function cusolverMpNumROC(N, NB, iproc, isrcproc, nprocs)
  integer(8), intent(in) :: N, NB
  integer(4), intent(in) :: iproc, isrcproc, nprocs

6.5.10. cusolverMpGetrf_buffersize

此函数计算传递到 cusolverMpGetrf 中的主机和设备工作空间所需的缓冲区大小。

A 矩阵的类型、kind 和秩将被忽略,并且已由 descrA 参数设置。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 M、 N)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpGetrf_buffersize(handle, &
    M, N, A, IA, JA, descrA, devipiv, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverMpHandle) :: handle
    integer(8) :: M, N, IA, JA
    real, device, dimension(*) :: A
    type(cusolverMpMatrixDescriptor) :: descrA
    integer(8), device, dimension(*) :: devipiv
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.5.11. cusolverMpGetrf

此函数计算一般 mxn 矩阵的 LU 分解

A 矩阵的类型、kind 和秩将被忽略,并且已由 descrA 参数设置。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 M、 N)提升为 integer(8),因此可以使用其他整数 kind。只要字节空间足够,工作空间可以是任何类型和 kind。

integer function cusolverMpGetrf(handle, &
    M, N, A, IA, JA, descrA, devipiv, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, info)
    type(cusolverMpHandle) :: handle
    integer(8) :: M, N, IA, JA
    real, device, dimension(*) :: A
    type(cusolverMpMatrixDescriptor) :: descrA
    integer(8), device, dimension(*) :: devipiv
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: info

6.5.12. cusolverMpGetrs_buffersize

此函数计算传递到 cusolverMpGetrs 中的主机和设备工作空间所需的缓冲区大小。

A、 B 矩阵的类型、kind 和秩将被忽略,并且由 descrA、 descrB 参数设置。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 N、 NRHS)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpGetrs_buffersize(handle, trans, &
    N, NRHS, A, IA, JA, descrA, devipiv, B, IB, JB, descrB, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverMpHandle) :: handle
    integer(4) :: trans
    integer(8) :: N, NRHS, IA, JA, IB, JB
    real, device, dimension(*) :: A, B
    type(cusolverMpMatrixDescriptor) :: descrA, descrB
    integer(8), device, dimension(*) :: devipiv
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.5.13. cusolverMpGetrs

此函数求解多个右手侧的线性系统,应用使用 cusolverMpGetrf 进行 LU 分解的通用 nxn 矩阵。

A、 B 矩阵的类型、kind 和秩将被忽略,并且由 descrA、 descrB 参数设置。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 N、 NRHS)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpGetrs(handle, trans, &
    N, NRHS, A, IA, JA, descrA, devipiv, B, IB, JB, descrB, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, devinfo)
    type(cusolverMpHandle) :: handle
    integer(4) :: trans
    integer(8) :: N, NRHS, IA, JA, IB, JB
    real, device, dimension(*) :: A, B
    type(cusolverMpMatrixDescriptor) :: descrA, descrB
    integer(8), device, dimension(*) :: devipiv
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: devinfo

6.5.14. cusolverMpPotrf_buffersize

此函数计算传递到 cusolverMpPotrf 中的主机和设备工作空间所需的缓冲区大小。

A 矩阵的类型、kind 和秩将被忽略,并且已由 descrA 参数设置。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 N)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpPotrf_buffersize(handle, &
    uplo, N, A, IA, JA, descrA, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverMpHandle) :: handle
    integer(4) :: uplo
    integer(8) :: N, IA, JA
    real, device, dimension(*) :: A
    type(cusolverMpMatrixDescriptor) :: descrA
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.5.15. cusolverMpPotrf

此函数计算 Hermitian 正定矩阵的 Cholesky 分解

A 矩阵的类型、kind 和秩将被忽略,并且已由 descrA 参数设置。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 N)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpPotrf(handle, &
    uplo, N, A, IA, JA, descrA, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, info)
    type(cusolverMpHandle) :: handle
    integer(4) :: uplo
    integer(8) :: N, IA, JA
    real, device, dimension(*) :: A
    type(cusolverMpMatrixDescriptor) :: descrA
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: info

6.5.16. cusolverMpPotrs_buffersize

此函数计算传递到 cusolverMpPotrs 中的主机和设备工作空间所需的缓冲区大小。

A、 B 矩阵的类型、kind 和秩将被忽略,并且由 descrA、 descrB 参数设置。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 N、 NRHS)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpPotrs_buffersize(handle, uplo, &
    N, NRHS, A, IA, JA, descrA, B, IB, JB, descrB, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverMpHandle) :: handle
    integer(4) :: uplo
    integer(8) :: N, NRHS, IA, JA, IB, JB
    real, device, dimension(*) :: A, B
    type(cusolverMpMatrixDescriptor) :: descrA, descrB
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.5.17. cusolverMpPotrs

此函数求解由 Hermitian 正定矩阵的 Cholesky 分解产生的线性方程组,使用 cusolverMpPotrf

A、 B 矩阵的类型、kind 和秩将被忽略,并且由 descrA、 descrB 参数设置。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 N、 NRHS)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpPotrs(handle, uplo, &
    N, NRHS, A, IA, JA, descrA, B, IB, JB, descrB, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, info)
    type(cusolverMpHandle) :: handle
    integer(4) :: uplo
    integer(8) :: N, NRHS, IA, JA, IB, JB
    real, device, dimension(*) :: A, B
    type(cusolverMpMatrixDescriptor) :: descrA, descrB
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: info

6.5.18. cusolverMpOrmqr_buffersize

此函数计算传递到 cusolverMpOrmqr 中的主机和设备工作空间所需的缓冲区大小。

A、 C 矩阵的类型、kind 和秩将被忽略,并且已由 descrA、 descrC 参数设置。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 M、 N、 K)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpOrmqr_buffersize(handle, side, trans, &
    M, N, K, A, IA, JA, descrA, tau, C, IC, JC, descrC, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverMpHandle) :: handle
    integer(4) :: side, trans
    integer(8) :: M, N, K, IA, JA, IC, JC
    real, device, dimension(*) :: A, tau, C
    type(cusolverMpMatrixDescriptor) :: descrA, descrC
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.5.19. cusolverMpOrmqr

此函数从 mxn 矩阵的 QR 分解生成酉矩阵 Q,并根据 side 和 trans 参数覆盖数组 C。

A、 C 矩阵的类型、kind 和秩将被忽略,并且已由 descrA、 descrC 参数设置。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 M、 N、 K)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpOrmqr(handle, side, trans, &
    M, N, K, A, IA, JA, descrA, tau, C, IC, JC, descrC, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, info)
    type(cusolverMpHandle) :: handle
    integer(4) :: side, trans
    integer(8) :: M, N, K, IA, JA, IC, JC
    real, device, dimension(*) :: A, tau, C
    type(cusolverMpMatrixDescriptor) :: descrA, descrC
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: info

6.5.20. cusolverMpOrmtr_buffersize

此函数计算传递到 cusolverMpOrmtr 中的主机和设备工作空间所需的缓冲区大小。

A、 tau、 C 矩阵的类型、kind 和秩将被忽略,并且已由 descrA、 descrC 参数设置。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 M、 N、 K)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpOrmtr_buffersize(handle, side, uplo, trans, &
    M, N, A, IA, JA, descrA, tau, C, IC, JC, descrC, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverMpHandle) :: handle
    integer(4) :: side, uplo, trans
    integer(8) :: M, N, IA, JA, IC, JC
    real, device, dimension(*) :: A, tau, C
    type(cusolverMpMatrixDescriptor) :: descrA, descrC
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.5.21. cusolverMpOrmtr

此函数基于 side 和 trans 参数,生成由一系列初等反射向量组成的酉矩阵 Q 并覆盖数组 C。

A、 C 矩阵的类型、kind 和秩将被忽略,并且已由 descrA、 descrC 参数设置。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 M、 N、 K)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpOrmtr(handle, side, uplo, trans, &
    M, N, A, IA, JA, descrA, tau, C, IC, JC, descrC, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, info)
    type(cusolverMpHandle) :: handle
    integer(4) :: side, uplo, trans
    integer(8) :: M, N, IA, JA, IC, JC
    real, device, dimension(*) :: A, tau, C
    type(cusolverMpMatrixDescriptor) :: descrA, descrC
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: info

6.5.22. cusolverMpGels_buffersize

此函数计算传递到 cusolverMpGels 中的主机和设备工作空间所需的缓冲区大小。

A、 B 矩阵的类型、kind 和秩将被忽略,并且由 descrA、 descrB 参数设置。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 N、 NRHS)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpGels_buffersize(handle, trans, &
    M, N, NRHS, A, IA, JA, descrA, B, IB, JB, descrB, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverMpHandle) :: handle
    integer(4) :: trans
    integer(8) :: M, N, NRHS, IA, JA, IB, JB
    real, device, dimension(*) :: A, B
    type(cusolverMpMatrixDescriptor) :: descrA, descrB
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.5.23. cusolverMpGels

此函数使用 QR 或 LQ 分解求解 MxN 矩阵 A 或其转置的超定或欠定线性系统。

A、 B 矩阵的类型、kind 和秩将被忽略,并且由 descrA、 descrB 参数设置。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 N、 NRHS)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpGels(handle, trans, &
    M, N, NRHS, A, IA, JA, descrA, B, IB, JB, descrB, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, info)
    type(cusolverMpHandle) :: handle
    integer(4) :: trans
    integer(8) :: M, N, NRHS, IA, JA, IB, JB
    real, device, dimension(*) :: A, B
    type(cusolverMpMatrixDescriptor) :: descrA, descrB
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: info

6.5.24. cusolverMpStedc_buffersize

此函数计算传递到 cusolverMpStedc 中的主机和设备工作空间所需的缓冲区大小。

D、 E、 Q 矩阵的类型、kind 和秩将被忽略,并且已由 descrQ 参数设置。 computeType 通常设置为相同类型。编译器会将数组偏移和维度(例如 N、 IQ、 JQ)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpStedc_buffersize(handle, compz, &
    N, D, E, Q, IQ, JQ, descrQ, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverMpHandle) :: handle
    character :: compz
    integer(8) :: N, IQ, JQ
    real, device, dimension(*) :: D, E, Q
    type(cusolverMpMatrixDescriptor) :: descrQ
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(4) :: iwork(*)

6.5.25. cusolverMpStedc

此函数使用分治法计算对称三对角矩阵的所有特征值,以及可选的特征向量。

D、 E、 Q 矩阵的类型、kind 和秩将被忽略,并且已由 descrQ 参数设置。 computeType 通常设置为相同类型。编译器会将数组偏移和维度(例如 N、 IQ、 JQ)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpStedc(handle, compz, &
    N, D, E, Q, IQ, JQ, descrQ, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, info)
    type(cusolverMpHandle) :: handle
    character :: compz
    integer(8) :: N, IQ, JQ
    real, device, dimension(*) :: D, E, Q
    type(cusolverMpMatrixDescriptor) :: descrQ
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: info

6.5.26. cusolverMpGeqrf_buffersize

此函数计算传递到 cusolverMpGeqrf 中的主机和设备工作空间所需的缓冲区大小。

A 矩阵的类型、kind 和秩将被忽略,并且已由 descrA 参数设置。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 M、 N)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpGeqrf_buffersize(handle, &
    M, N, A, IA, JA, descrA, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverMpHandle) :: handle
    integer(8) :: M, N, IA, JA
    real, device, dimension(*) :: A
    type(cusolverMpMatrixDescriptor) :: descrA
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.5.27. cusolverMpGeqrf

此函数计算 MxN 矩阵的 QR 分解。

A 矩阵的类型、kind 和秩将被忽略,并且已由 descrA 参数设置。 computeType 通常设置为相同类型。编译器会将数组大小和维度(例如 M、 N、 K)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpGeqrf(handle, &
    M, N, A, IA, JA, descrA, tau, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, info)
    type(cusolverMpHandle) :: handle
    integer(8) :: M, N, IA, JA
    real, device, dimension(*) :: A, tau
    type(cusolverMpMatrixDescriptor) :: descrA
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: info

6.5.28. cusolverMpSytrd_buffersize

此函数计算传递到 cusolverMpSytrd 中的主机和设备工作空间所需的缓冲区大小。

A、 D、 E 矩阵和向量的类型、kind 和秩将被忽略,并且已由 descrA 参数设置。 computeType 通常设置为相同类型。编译器会将数组偏移和维度(例如 N、 IA、 JA)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpSytrd_buffersize(handle, uplo, &
    N, A, IA, JA, descrA, D, E, tau, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverMpHandle) :: handle
    integer(4) :: uplo
    integer(8) :: N, IA, JA
    real, device, dimension(*) :: A, D, E, tau
    type(cusolverMpMatrixDescriptor) :: descrA
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.5.29. cusolverMpSytrd

此函数将对称(Hermitian)NxN 矩阵约化为对称三对角形式。

A、 D、 E 矩阵和向量的类型、kind 和秩将被忽略,并且已由 descrA 参数设置。 computeType 通常设置为相同类型。编译器会将数组偏移和维度(例如 N、 IA、 JA)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpSytrd(handle, uplo, &
    N, A, IA, JA, descrA, D, E, tau, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, info)
    type(cusolverMpHandle) :: handle
    integer(4) :: uplo
    integer(8) :: N, IA, JA
    real, device, dimension(*) :: A, D, E, tau
    type(cusolverMpMatrixDescriptor) :: descrA
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: info

6.5.30. cusolverMpSyevd_buffersize

此函数计算传递到 cusolverMpSyevd 中的主机和设备工作空间所需的缓冲区大小。

A、 D、 Q 矩阵的类型、kind 和秩将被忽略,并且已由 descrA、 descrQ 参数设置。 computeType 通常设置为相同类型。编译器会将数组偏移和维度(例如 N、 IA、 JA)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpSyevd_buffersize(handle, compz, &
    uplo, N, A, IA, JA, descrA, D, Q, IQ, JQ, descrQ, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverMpHandle) :: handle
    character :: compz
    integer(4) :: uplo
    integer(8) :: N, IA, JA, IQ, JQ
    real, device, dimension(*) :: A, D, Q
    type(cusolverMpMatrixDescriptor) :: descrA, descrQ
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.5.31. cusolverMpSyevd

此函数计算对称(Hermitian)nxn 矩阵的特征值和特征向量

A、 D、 Q 矩阵的类型、kind 和秩将被忽略,并且已由 descrA、 descrQ 参数设置。 computeType 通常设置为相同类型。编译器会将数组偏移和维度(例如 N、 IA、 JA)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpSyevd(handle, compz, &
    uplo, N, A, IA, JA, descrA, D, Q, IQ, JQ, descrQ, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, devinfo)
    type(cusolverMpHandle) :: handle
    character :: compz
    integer(4) :: uplo
    integer(8) :: N, IA, JA, IQ, JQ
    real, device, dimension(*) :: A, D, Q
    type(cusolverMpMatrixDescriptor) :: descrA, descrQ
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: devinfo

6.5.32. cusolverMpSygst_buffersize

此函数计算传递到 cusolverMpSygst 中的主机和设备工作空间所需的缓冲区大小。

A、 B 矩阵的类型由 descrA、 descrB 参数设置,而不是传递进来计算缓冲区需求。 computeType 通常设置为相同类型。编译器会将数组偏移和维度(例如 M、 IA、 JA)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpSygst_buffersize(handle, ibtype, uplo, &
    M, IA, JA, descrA, IB, JB, descrB, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverMpHandle) :: handle
    integer(4) :: ibtype, uplo
    integer(8) :: M, IA, JA, IB, JB
    type(cusolverMpMatrixDescriptor) :: descrA, descrB
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.5.33. cusolverMpSygst

此函数将对称正定广义特征值问题简化为标准形式。

A、 B 矩阵的类型、kind 和秩将被忽略,并且已由 descrA、 descrB 参数设置。 computeType 通常设置为相同类型。编译器会将数组偏移和维度(例如 M、 IA、 JA)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpSygst(handle, ibtype, uplo, &
    M, A, IA, JA, descrA, B, IB, JB, descrB, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, info)
    type(cusolverMpHandle) :: handle
    integer(4) :: ibtype, uplo
    integer(8) :: M, IA, JA, IB, JB
    real, device, dimension(*) :: A, B
    type(cusolverMpMatrixDescriptor) :: descrA, descrB
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: info

6.5.34. cusolverMpSygvd_buffersize

此函数计算传递到 cusolverMpSygvd 中的主机和设备工作空间所需的缓冲区大小。

A、 B、 Z 矩阵的类型由 descrA、 descrB、 descrZ 参数设置,而不是传递进来计算缓冲区需求。 computeType 通常设置为相同类型。编译器会将数组偏移和维度(例如 M、 IA、 JA)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpSygvd_buffersize(handle, ibtype, jobz, &
    uplo, M, IA, JA, descrA, IB, JB, descrB, IZ, JZ, descrZ, computeType, &
    workspaceInBytesOnDevice, workspaceInBytesOnHost)
    type(cusolverMpHandle) :: handle
    integer(4) :: ibtype, jobz, uplo
    integer(8) :: M, IA, JA, IB, JB, IZ, JZ
    type(cusolverMpMatrixDescriptor) :: descrA, descrB, descrZ
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost

6.5.35. cusolverMpSygvd

此函数计算对称(Hermitian)广义特征值问题的所有特征值和特征向量。

A、 B、 Z 矩阵的类型、kind 和秩将被忽略,并且已由 descrA、 descrB、 descrZ 参数设置。 computeType 通常设置为相同类型。编译器会将数组偏移和维度(例如 M、 IA、 JA)提升为 integer(8),因此可以使用其他整数 kind。

integer function cusolverMpSygvd(handle, ibtype, jobz, &
    uplo, M, A, IA, JA, descrA, B, IB, JB, descrB, &
    W, Z, IZ, JZ, descrZ, computeType, &
    bufferOnDevice, workspaceInBytesOnDevice, &
    bufferOnHost, workspaceInBytesOnHost, info)
    type(cusolverMpHandle) :: handle
    integer(4) :: ibtype, jobz, uplo
    integer(8) :: M, IA, JA, IB, JB,
    real, device, dimension(*) :: A, B, W, Z
    type(cusolverMpMatrixDescriptor) :: descrA, descrB, descrZ
    type(cudaDataType) :: computeType
    integer(8) :: workspaceInBytesOnDevice, workspaceInBytesOnHost
    integer(1), device :: bufferOnDevice(workspaceInBytesOnDevice)
    integer(1)         :: bufferOnHost(workspaceInBytesOnHost)
    integer(4), device, intent(out) :: info

6.5.36. cusolverMpLoggerSetFile

此函数指定要用作 cusolverMp 日志文件的 Fortran 单元。

integer(4) function cusolverMpLoggerSetFile(unit)
  integer :: unit

6.5.37. cusolverMpLoggerOpenFile

此函数指定要打开并用作 cusolverMp 日志文件的 Fortran 字符串。

integer(4) function cusolverMpLoggerOpenFile(logFile)
  character*(*) :: logFile

6.5.38. cusolverMpLoggerSetLevel

此函数指定 cusolverMp 日志记录级别。

integer(4) function cusolverMpLoggerSetLevel(level)
  integer :: level

6.5.39. cusolverMpLoggerSetMask

此函数指定 cusolverMp 日志记录掩码。

integer(4) function cusolverMpLoggerSetMask(mask)
  integer :: mask

6.5.40. cusolverMpLoggerForceDisable

此函数禁用 cusolverMp 日志记录。

integer(4) function cusolverMpLoggerForceDisable()

6.6. NVLAMATH 运行时库

本节介绍 NVLAmath 运行时库,该库通过将对标准 LAPACK 子例程的调用重定向到 cuSOLVER 函数的包装器,从而能够在 GPU 上卸载这些调用。

在功能和性能方面,此库没有对本章前几节中记录的内容进行任何补充。我们看到的 NVLAmath 最常见的用例是

  • 即插即用加速。在统一内存环境中运行时,NVLAmath 允许重新编译并运行,以将 LAPACK 求解器卸载到 GPU。

  • 快速移植功能,这些功能可能对性能不是至关重要的,但数据已通过 CUDA、OpenACC 或 OpenMP 从应用程序的其他部分驻留在 GPU 上。访问启用 GPU 的函数避免了 GPU 和 CPU 之间昂贵的数据来回移动。

  • 保持传统代码的完整性。 NVLAmath 可以通过最少的代码更改移植到 GPU,例如在同一源中启用 32 位和 64 位整数,并调用所有目标上都可用的求解器库入口点。

NVLAmath 包装器通过 Fortran nvlamath 模块启用,该模块重载了 LAPACK 子例程名称。用户可以通过两种方式将模块插入到他们的 Fortran 子程序单元中。第一种是非侵入式的:将编译器选项 -gpu=nvlamath 添加到包含您希望移动到 GPU 的 LAPACK 调用的文件的编译行中。第二种方法更传统,只需将 use nvlamath 语句添加到包含这些 LAPACK 调用的子例程或函数中。如果您不使用这两种方法,LAPACK 调用可能会由 CPU LAPACK 库解析,无论是我们提供的库还是您决定在链接行上使用的库。在某些情况下,NVLAmath 包装器甚至可能也调用到该 CPU 库。换句话说,不会篡改 CPU LAPACK 符号(库入口点)名称。

要链接 NVLAmath 包装器库,请将 -cudalib=nvlamath 添加到您的链接行。要使用 64 位整数版本的库,请使用 -i8 选项编译和链接,或将 -cudalib=nvlamath_ilp64 添加到您的链接行。

6.6.1. NVLAMATH 自动即插即用加速

在统一内存环境中,将标准 LAPACK 调用移动到 GPU 上运行的最简单方法是通过我们称之为自动即插即用加速的方法。这目前需要支持 CUDA 托管内存的 GPU 和操作系统,以及传递给库函数的数组是动态分配的。

这是一个调用 dgetrf() 和 dgetrs() 的示例测试程序

program testdgetrf
integer, parameter :: M = 1000, N = M, NRHS=2
real(8), allocatable :: A(:,:), B(:,:)
integer, allocatable :: IPIV(:)
real(8), parameter :: eps = 1.0d-10
!
allocate(A(M,N),B(M,NRHS),IPIV(M))
call random_number(A)
do i = 1, M
    A(i,i) = A(i,i) * 10.0d0
    B(i,1) = sum(A(i,:))
    B(i,2) = B(i,1) * 2.0d0
end do
!
lda = M; ldb = M
call dgetrf(M,N,A,lda,IPIV,info1)
call dgetrs('n',n,NRHS,A,lda,IPIV,B,ldb,info2)
!
if ((info1.ne.0) .or. (info2.ne.0)) then
    print *,"test FAILED"
else if (any(abs(B(:,1)-1.0d0) .gt. eps) .or. &
         any(abs(B(:,2)-2.0d0) .gt. eps)) then
    print *,"test FAILED"
else
    print *,"test PASSED"
end if
end

要使用 nvfortran 编译和链接此程序以进行 CPU 执行,最简单的选项是 nvfortran testdgetrf.f90 -llapack -lblas。要在 GPU 上启用加速,最简单的选项是 nvfortran -stdpar -gpu=nvlamath testdgetrf.f90 -cudalib=nvlamath。这里,-stdpar 是指示编译器和运行时将可分配数组视为 CUDA 托管数据的可用方法之一。-gpu=nvlamath 选项指示编译器将语句 use nvhpc_nvlamath 插入到程序单元中,然后将两个 LAPACK 调用重定向到包装器。最后,-cudalib=nvlamath 链接器选项拉入 NVLAmath 包装器运行时库。

6.6.2. 从 CUDA Fortran 使用 NVLAMATH

从 CUDA Fortran 中使用 NVLAmath 非常简单。nvhpc_nvlamath 模块中的接口在性质上与本文档中的所有其他 Fortran 模块相似。库函数设备虚拟参数可以与设备或托管实际参数,或两者的组合匹配,如此处所用。

此示例代码是用 CUDA Fortran 编写的。请注意,所有 CUDA Fortran 添加项都在 !@cuf 标记之后,或在 CUF 内核中,这仍然允许使用任何 Fortran 编译器编译此文件。

program testdgetrf
!@cuf use nvhpc_nvlamath
!@cuf use cutensorex
integer, parameter :: M = 1000, N = M, NRHS=2
real(8), allocatable :: A(:,:), B(:,:)
integer, allocatable :: IPIV(:)
!@cuf attributes(device) :: A, IPIV
!@cuf attributes(managed) :: B
real(8), parameter :: eps = 1.0d-10
!
allocate(A(M,N),B(M,NRHS),IPIV(M))
call random_number(A)
!$cuf kernel do(1)<<<*,*>>>
do i = 1, M
    A(i,i) = A(i,i) * 10.0d0
    B(i,1) = sum(A(i,:))
    B(i,2) = B(i,1) * 2.0d0
end do
!
lda = M; ldb = M
call dgetrf(M,N,A,lda,IPIV,info1)
call dgetrs('n',n,NRHS,A,lda,IPIV,B,ldb,info2)
!
if ((info1.ne.0) .or. (info2.ne.0)) then
    print *,"test FAILED"
else if (any(abs(B(:,1)-1.0d0) .gt. eps) .or. &
         any(abs(B(:,2)-2.0d0) .gt. eps)) then
    print *,"test FAILED"
else
    print *,"test PASSED"
end if
end

这里我们显式地使用了 nvhpc_nvlamath 模块,并且我们还使用了本文档中其他地方讨论的 cutensorex 模块,以在 GPU 上生成随机数。假设此文件具有 .cuf 扩展名,则与此文件一起使用的最简单的编译和链接行是 nvfortran testdgetrf.cuf -cudalib=curand,nvlamath

6.6.3. 从 OpenACC 使用 NVLAMATH

从 OpenACC 中,LAPACK 函数就像 CUBLAS 或 CUSOLVER 函数一样处理。使用 host_data use_device 指令将设备指针传递给函数。

program testdgetrf
integer, parameter :: M = 1000, N = M, NRHS=2
real(8) :: A(M,N), B(M,NRHS)
integer :: IPIV(M)
real(8), parameter :: eps = 1.0d-10
!
call random_number(A)
!$acc data copyin(A), copyout(B), create(IPIV)
!$acc parallel loop
do i = 1, M
  A(i,i) = A(i,i) * 10.0d0
  B(i,1) = sum(A(i,:))
  B(i,2) = B(i,1) * 2.0d0
end do
!
lda = M; ldb = M
!$acc host_data use_device(A, IPIV, B)
call dgetrf(M,N,A,lda,IPIV,info1)
call dgetrs('n',n,NRHS,A,lda,IPIV,B,ldb,info2)
!$acc end host_data
!$acc end data
!
if ((info1.ne.0) .or. (info2.ne.0)) then
  print *,"test FAILED"
else if (any(abs(B(:,1)-1.0d0).gt.eps).or.any(abs(B(:,2)-2.0d0).gt.eps)) then
  print *,"test FAILED"
else
  print *,"test PASSED"
end if
end

这里我们展示了静态数组而不是动态数组,因此我们使用 OpenACC 数据指令来控制数据移动。与此文件一起使用的最简单的编译和链接行是 nvfortran -acc=gpu -gpu=nvlamath testdgetrf.f90 -cudalib=nvlamath

6.6.4. 从 OpenMP 使用 NVLAMATH

从 OpenMP 中使用 NVLAmath 函数与从 OpenACC 中使用基本相同。使用 target data use_device_ptr 指令将设备指针传递给函数。

program testdgetrf
integer, parameter :: M = 1000, N = M, NRHS=2
real(8) :: A(M,N), B(M,NRHS)
integer :: IPIV(M)
real(8), parameter :: eps = 1.0d-10
!
call random_number(A)
!$omp target enter data map(to:A) map(alloc:B,IPIV)
!$omp target teams loop
do i = 1, M
  A(i,i) = A(i,i) * 10.0d0
  B(i,1) = sum(A(i,:))
  B(i,2) = B(i,1) * 2.0d0
end do
!
lda = M; ldb = M
!$omp target data use_device_ptr(A, IPIV, B)
call dgetrf(M,N,A,lda,IPIV,info1)
call dgetrs('n',n,NRHS,A,lda,IPIV,B,ldb,info2)
!$omp end target data
!$omp target exit data map(from:B) map(delete:A,IPIV)
!
if ((info1.ne.0) .or. (info2.ne.0)) then
  print *,"test FAILED"
else if (any(abs(B(:,1)-1.0d0).gt.eps).or.any(abs(B(:,2)-2.0d0).gt.eps)) then
  print *,"test FAILED"
else
  print *,"test PASSED"
end if
end

同样,我们展示了静态数组而不是动态数组,因此我们使用 OpenMP 数据指令来控制数据移动。与此文件一起使用的最简单的编译和链接行是 nvfortran -mp=gpu -gpu=nvlamath testdgetrf.f90 -cudalib=nvlamath

6.6.5. NVLAMATH 当前子例程列表

在数千个 LAPACK 子例程和函数中,目前此库中包装了 31 个最常用和最需要的子例程。

表 1. NVLAMATH 子例程列表

S

C

D

Z

线性求解器

LU

sgetrf

cgetrf

dgetrf

zgetrf

sgetrs

cgetrs

dgetrs

zgetrs

sgesv

Cholesky

dpotrf

zpotrf

dpotrs

特征值求解器

特征值求解器

ssyev

dsyev

zheev

ssyevd

cheevd

dsyevd

zheevd

部分特征值求解器

ssyevx

cheevx

dsyevx

zheevx

ssyevr

dsyevr

广义问题特征值求解器

dsygv

zhegv

dsygvd

zhegvd

广义问题部分特征值求解器

zhegvx

SVD

dgesvd

6.6.6. NVLAMATH 参数检查和 CPU 回退

在大型复杂的应用程序中,编译器(和开发人员)可能会忽略数据数组的属性:它们是主机数组、托管数组还是设备数组。请注意,编译器将可分配数组自动转换为托管数组要求它们是可分配的。考虑来自即插即用案例的示例,但其中枢轴数组是静态声明的。

program testdgetrf
integer, parameter :: M = 1000, N = M, NRHS=2
real(8), allocatable :: A(:,:), B(:,:)
integer :: IPIV(M)
real(8), parameter :: eps = 1.0d-10
!
allocate(A(M,N),B(M,NRHS))
call random_number(A)
do i = 1, M
    A(i,i) = A(i,i) * 10.0d0
    B(i,1) = sum(A(i,:))
    B(i,2) = B(i,1) * 2.0d0
end do
!
lda = M; ldb = M
call dgetrf(M,N,A,lda,IPIV,info1)
call dgetrs('n',n,NRHS,A,lda,IPIV,B,ldb,info2)
!
if ((info1.ne.0) .or. (info2.ne.0)) then
    print *,"test FAILED"
else if (any(abs(B(:,1)-1.0d0) .gt. eps) .or. &
         any(abs(B(:,2)-2.0d0) .gt. eps)) then
    print *,"test FAILED"
else
    print *,"test PASSED"
end if
end

现在,我们像以前一样编译它,nvfortran -stdpar -gpu=nvlamath testdgetrf.f90 -cudalib=nvlamath。回顾一下,-stdpar 指示编译器和运行时将可分配数组视为 CUDA 托管数据。但是,这次程序运行时

** On entry to dgetrf parameter number 5 failed the pointer check
3: Accessible on GPU = T; Accessible on CPU = T
5: Accessible on GPU = F; Accessible on CPU = T
 Fallback to CPU compute disabled.
 Please (1) make sure that input arrays are accessible on the GPU; or (2) set
 environment variable NVCOMPILER_LAMATH_FALLBACK=1 to fallback to CPU execution.
 Terminate the application

除非调用中的每个数组都只能在 CPU 上访问,否则我们假设如果开发人员正在使用 NVLAMATH,则他们打算在 GPU 上运行库函数,因此应报告子例程参数的 GPU 可访问性不匹配。正如错误消息所述,您可以通过将 NVCOMPILER_LAMATH_FALLBACK 环境变量设置为 1 来继续忽略此错误。

** On entry to dgetrf parameter number 5 failed the pointer check
3: Accessible on GPU = T; Accessible on CPU = T
5: Accessible on GPU = F; Accessible on CPU = T
 Fallback to CPU compute
** On entry to dgetrs parameter number 6 failed the pointer check
4: Accessible on GPU = T; Accessible on CPU = T
6: Accessible on GPU = F; Accessible on CPU = T
7: Accessible on GPU = T; Accessible on CPU = T
 Fallback to CPU compute
 test PASSED

最后,我们假设开发人员更愿意通过使 pivot 数组在 GPU 上可访问来解决此问题,可以通过 CUDA Fortran device 或 managed attributes、OpenACC 或 OpenMP 数据指令,或者将其从静态声明更改为可分配数组来实现。

7. 张量原语运行时库 API

本节介绍 CUDA cuTENSOR 库的 Fortran 接口。 cuTENSOR 函数只能从主机代码访问。 大多数运行时 API 例程(除了一些实用程序外)都是返回错误代码的函数;如果调用成功,它们将返回 CUTENSOR_STATUS_SUCCESS 值,如果发生错误,则返回另一个 cuTENSOR 状态返回值。 与早期的 Fortran 模块不同,我们为返回值创建了一个 cutensorStatus 派生类型。 我们还为测试返回状态重载了 .eq..ne. 逻辑运算符。

目前,我们为 cuTENSOR 库提供了两个级别的 Fortran 接口:一个低级模块,它与 cuTENSOR v2.0.0 中的 C 接口一对一映射;以及一个实验性高级模块,它将几个标准的 Fortran 内置函数映射到 cuTENSOR 库中包含的功能。

cuTENSOR 版本 2.0 的文档解释了如何将低级代码从版本 1.x 迁移到 2.x。 简而言之,创建函数 cutensorCreateElementwiseBinary(), cutensorCreateElementwiseTrinary(), cutensorCreatePermutation(), cutensorCreateReduction(), cutensorCreateContraction() 创建一个操作描述符类型。 您可以使用 cutensorCreatePlanPreference() cutensorCreatePlan() 分别创建计划首选项和计划。 某些操作需要工作空间,您可以使用 cutensorEstimateWorkspaceSize() 查询工作空间大小。 此时,您拥有一个 cuTensor 计划类型,可以将其传递到执行函数 cutensorElementwiseBinaryExecute(), cutensorElementwiseTrinaryExecute(), cutensorPermute(), cutensorReduce(), cutensorContract() 之一,以及指向设备数据的实际指针和缩放因子。

第 12 章包含从 OpenACC 和 CUDA Fortran 访问 cuTENSOR 库例程的示例。 在这两种情况下,可以通过添加以下行来公开库的接口

use cutensor_v2

到您的程序单元。

除非提供了特定的 kind,否则接口中使用的普通 integer 类型表示 integer(4),而普通 real 类型表示 real(4)。

7.1. CUTENSOR 定义和辅助函数

本节包含 cuTENSOR 库中使用的定义和数据类型,以及 cuTENSOR 辅助函数的接口。

从 NVHPC 24.1 版本开始,cuTENSOR 2.x 版本库捆绑在发布包中。 版本 2 API 与之前的 1.x 版本有很大不同,并且模块名称已更改以避免混淆。 可以通过添加以下行来公开新的库接口

use cutensor_v2

到您的程序单元。

此 cuTENSOR 模块包含以下派生类型定义

! Definitions from cutensor.h
integer, parameter :: CUTENSOR_MAJOR = 2
integer, parameter :: CUTENSOR_MINOR = 0
integer, parameter :: CUTENSOR_PATCH = 0
! Types from cutensor/types.h
! Algorithm Control
type, bind(c) :: cutensorAlgo
    integer(4) :: algo
end type
type(cutensorAlgo), parameter :: &
    CUTENSOR_ALGO_DEFAULT_PATIENT = cutensorAlgo(-6), &
    CUTENSOR_ALGO_GETT    = cutensorAlgo(-4), &
    CUTENSOR_ALGO_TGETT   = cutensorAlgo(-3), &
    CUTENSOR_ALGO_TTGT    = cutensorAlgo(-2), &
    CUTENSOR_ALGO_DEFAULT = cutensorAlgo(-1)
! Workspace Control
type, bind(c) :: cutensorWorksizePreference
    integer(4) :: wksp
end type
type(cutensorWorksizePreference), parameter :: &
    CUTENSOR_WORKSPACE_MIN         = cutensorWorksizePreference(1), &
    CUTENSOR_WORKSPACE_RECOMMENDED = cutensorWorksizePreference(2), &
    CUTENSOR_WORKSPACE_MAX         = cutensorWorksizePreference(3)
! Unary and Binary Element-wise Operations
type, bind(c) :: cutensorOperator
    integer(4) :: opno
end type
type(cutensorOperator), parameter :: &
    ! Unary
    CUTENSOR_OP_IDENTITY = cutensorOperator(1), & ! Identity operator
    CUTENSOR_OP_SQRT    = cutensorOperator(2), &  ! Square root
    CUTENSOR_OP_RELU    = cutensorOperator(8), &  ! Rectified linear unit
    CUTENSOR_OP_CONJ    = cutensorOperator(9), &  ! Complex conjugate
    CUTENSOR_OP_RCP     = cutensorOperator(10), & ! Reciprocal
    CUTENSOR_OP_SIGMOID = cutensorOperator(11), & ! y=1/(1+exp(-x))
    CUTENSOR_OP_TANH    = cutensorOperator(12), & ! y=tanh(x)
    CUTENSOR_OP_EXP     = cutensorOperator(22), & ! Exponentiation.
    CUTENSOR_OP_LOG     = cutensorOperator(23), & ! Log (base e).
    CUTENSOR_OP_ABS     = cutensorOperator(24), & ! Absolute value.
    CUTENSOR_OP_NEG     = cutensorOperator(25), & ! Negation.
    CUTENSOR_OP_SIN     = cutensorOperator(26), & ! Sine.
    CUTENSOR_OP_COS     = cutensorOperator(27), & ! Cosine.
    CUTENSOR_OP_TAN     = cutensorOperator(28), & ! Tangent.
    CUTENSOR_OP_SINH    = cutensorOperator(29), & ! Hyperbolic sine.
    CUTENSOR_OP_COSH    = cutensorOperator(30), & ! Hyperbolic cosine.
    CUTENSOR_OP_ASIN    = cutensorOperator(31), & ! Inverse sine.
    CUTENSOR_OP_ACOS    = cutensorOperator(32), & ! Inverse cosine.
    CUTENSOR_OP_ATAN    = cutensorOperator(33), & ! Inverse tangent.
    CUTENSOR_OP_ASINH   = cutensorOperator(34), & ! Inverse hyperbolic sine.
    CUTENSOR_OP_ACOSH   = cutensorOperator(35), & ! Inverse hyperbolic cosine.
    CUTENSOR_OP_ATANH   = cutensorOperator(36), & ! Inverse hyperbolic tangent.
    CUTENSOR_OP_CEIL    = cutensorOperator(37), & ! Ceiling.
    CUTENSOR_OP_FLOOR   = cutensorOperator(38), & ! Floor.
    CUTENSOR_OP_MISH    = cutensorOperator(39), & ! Mish y=x*tanh(softplus(x)).
    CUTENSOR_OP_SWISH   = cutensorOperator(40), & ! Swish y=x*sigmoid(x).
    CUTENSOR_OP_SOFT_PLUS = cutensorOperator(41), & ! Softplus y=log(exp(x)+1).
    CUTENSOR_OP_SOFT_SIGN = cutensorOperator(42), & ! Softsign y=x/(abs(x)+1).

    ! Binary
    CUTENSOR_OP_ADD     = cutensorOperator(3), &  ! Addition of two elements
    CUTENSOR_OP_MUL     = cutensorOperator(5), &  ! Multiplication of 2 elements
    CUTENSOR_OP_MAX     = cutensorOperator(6), &  ! Maximum of two elements
    CUTENSOR_OP_MIN     = cutensorOperator(7), &  ! Minimum of two elements
    CUTENSOR_OP_UNKNOWN = cutensorOperator(126)   ! reserved for internal use only
! Status Return Values
type, bind(c) :: cutensorStatus
    integer(4) :: stat
end type
type(cutensorStatus), parameter :: &
    ! The operation completed successfully.
    CUTENSOR_STATUS_SUCCESS                = cutensorStatus(0), &
    ! The cuTENSOR library was not initialized.
    CUTENSOR_STATUS_NOT_INITIALIZED        = cutensorStatus(1), &
    ! Resource allocation failed inside the cuTENSOR library.
    CUTENSOR_STATUS_ALLOC_FAILED           = cutensorStatus(3), &
    ! An unsupported value or parameter was passed to the function.
    CUTENSOR_STATUS_INVALID_VALUE          = cutensorStatus(7), &
    ! Indicates that the device is either not ready,
    ! or the target architecture is not supported.
    CUTENSOR_STATUS_ARCH_MISMATCH          = cutensorStatus(8), &
    ! An access to GPU memory space failed, which is usually caused
    ! by a failure to bind a texture.
    CUTENSOR_STATUS_MAPPING_ERROR          = cutensorStatus(11), &
    ! The GPU program failed to execute. This is often caused by a
    ! launch failure of the kernel on the GPU, which can be caused by
    ! multiple reasons.
    CUTENSOR_STATUS_EXECUTION_FAILED       = cutensorStatus(13), &
    ! An internal cuTENSOR error has occurred.
    CUTENSOR_STATUS_INTERNAL_ERROR         = cutensorStatus(14), &
    ! The requested operation is not supported.
    CUTENSOR_STATUS_NOT_SUPPORTED          = cutensorStatus(15), &
    ! The functionality requested requires some license and an error
    ! was detected when trying to check the current licensing.
    CUTENSOR_STATUS_LICENSE_ERROR          = cutensorStatus(16), &
    ! A call to CUBLAS did not succeed.
    CUTENSOR_STATUS_CUBLAS_ERROR           = cutensorStatus(17), &
    ! Some unknown CUDA error has occurred.
    CUTENSOR_STATUS_CUDA_ERROR             = cutensorStatus(18), &
    ! The provided workspace was insufficient.
    CUTENSOR_STATUS_INSUFFICIENT_WORKSPACE = cutensorStatus(19), &
    ! Indicates that the driver version is insufficient.
    CUTENSOR_STATUS_INSUFFICIENT_DRIVER    = cutensorStatus(20), &
    ! Indicates an error related to file I/O
    CUTENSOR_STATUS_IO_ERROR               = cutensorStatus(21)
! Data Type
type, bind(c) :: cutensorDataType
    integer(4) :: cudaDataType
end type
type(cutensorDataType), parameter :: &
    CUTENSOR_R_16F  =  cutensorDataType(2), & ! real as a half
    CUTENSOR_C_16F  =  cutensorDataType(6), & ! complex as a pair of half numbers
    CUTENSOR_R_16BF = cutensorDataType(14), & ! real as a nv_bfloat16
    CUTENSOR_C_16BF = cutensorDataType(15), & ! complex as a pair of nv_bfloat16 numbers
    CUTENSOR_R_32F  =  cutensorDataType(0), & ! real as a float
    CUTENSOR_C_32F  =  cutensorDataType(4), & ! complex as a pair of float numbers
    CUTENSOR_R_64F  =  cutensorDataType(1), & ! real as a double
    CUTENSOR_C_64F  =  cutensorDataType(5), & ! complex as a pair of double numbers
    CUTENSOR_R_4I   = cutensorDataType(16), & ! real as a signed 4-bit int
    CUTENSOR_C_4I   = cutensorDataType(17), & ! complex as a pair of signed 4-bit int numbers
    CUTENSOR_R_4U   = cutensorDataType(18), & ! real as a unsigned 4-bit int
    CUTENSOR_C_4U   = cutensorDataType(19), & ! complex as a pair of unsigned 4-bit int numbers
    CUTENSOR_R_8I   =  cutensorDataType(3), & ! real as a signed 8-bit int
    CUTENSOR_C_8I   =  cutensorDataType(7), & ! complex as a pair of signed 8-bit int numbers
    CUTENSOR_R_8U   =  cutensorDataType(8), & ! real as a unsigned 8-bit int
    CUTENSOR_C_8U   =  cutensorDataType(9), & ! complex as a pair of unsigned 8-bit int numbers
    CUTENSOR_R_16I  = cutensorDataType(20), & ! real as a signed 16-bit int
    CUTENSOR_C_16I  = cutensorDataType(21), & ! complex as a pair of signed 16-bit int numbers
    CUTENSOR_R_16U  = cutensorDataType(22), & ! real as a unsigned 16-bit int
    CUTENSOR_C_16U  = cutensorDataType(23), & ! complex as a pair of unsigned 16-bit int numbers
    CUTENSOR_R_32I  = cutensorDataType(10), & ! real as a signed 32-bit int
    CUTENSOR_C_32I  = cutensorDataType(11), & ! complex as a pair of signed 32-bit int numbers
    CUTENSOR_R_32U  = cutensorDataType(12), & ! real as a unsigned 32-bit int
    CUTENSOR_C_32U  = cutensorDataType(13), & ! complex as a pair of unsigned 32-bit int numbers
    CUTENSOR_R_64I  = cutensorDataType(24), & ! real as a signed 64-bit int
    CUTENSOR_C_64I  = cutensorDataType(25), & ! complex as a pair of signed 64-bit int numbers
    CUTENSOR_R_64U  = cutensorDataType(26), & ! real as a unsigned 64-bit int
    CUTENSOR_C_64U  = cutensorDataType(27)        ! complex as a pair of unsigned 64-bit int numbers
! Compute Type, no longer used, will be removed
type, bind(c) :: cutensorComputeType
    integer(4) :: ctyp
end type
type(cutensorComputeType), parameter :: &
    CUTENSOR_R_MIN_16F = cutensorComputeType(2**0), & ! real as a half
    CUTENSOR_C_MIN_16F = cutensorComputeType(2**1), & ! complex as a half
    CUTENSOR_R_MIN_32F = cutensorComputeType(2**2), & ! real as a float
    CUTENSOR_C_MIN_32F = cutensorComputeType(2**3), & ! complex as a float
    CUTENSOR_R_MIN_64F = cutensorComputeType(2**4), & ! real as a double
    CUTENSOR_C_MIN_64F = cutensorComputeType(2**5), & ! complex as a double
    CUTENSOR_R_MIN_8U  = cutensorComputeType(2**6), & ! real as a uint8
    CUTENSOR_R_MIN_32U = cutensorComputeType(2**7), & ! real as a uint32
    CUTENSOR_R_MIN_8I  = cutensorComputeType(2**8), & ! real as a int8
    CUTENSOR_R_MIN_32I = cutensorComputeType(2**9), & ! real as a int32
    CUTENSOR_R_MIN_16BF = cutensorComputeType(2**10), & ! real as a bfloat16
    CUTENSOR_R_MIN_TF32 = cutensorComputeType(2**11), & ! real as a tf32
    CUTENSOR_C_MIN_TF32 = cutensorComputeType(2**12) ! complex as a tf32
! Operation Descriptor attribute
type, bind(c) :: cutensorOperationDescriptorAttribute
    integer(4) :: attr
end type
type(cutensorOperationDescriptorAttribute), parameter :: &
    CUTENSOR_OPERATION_DESCRIPTOR_TAG = &
      cutensorOperationDescriptorAttribute(0), &  ! integer(4)
    CUTENSOR_OPERATION_DESCRIPTOR_SCALAR_TYPE = &
      cutensorOperationDescriptorAttribute(1), &  ! cutensorDataType
    CUTENSOR_OPERATION_DESCRIPTOR_FLOPS = &
      cutensorOperationDescriptorAttribute(2), &  ! real(4)
    CUTENSOR_OPERATION_DESCRIPTOR_MOVED_BYTES = &
      cutensorOperationDescriptorAttribute(3), &  ! real(4)
    CUTENSOR_OPERATION_DESCRIPTOR_PADDING_LEFT = &
      cutensorOperationDescriptorAttribute(4), &  ! integer(4)
    CUTENSOR_OPERATION_DESCRIPTOR_PADDING_RIGHT = &
      cutensorOperationDescriptorAttribute(5), &  ! integer(4)
    CUTENSOR_OPERATION_DESCRIPTOR_PADDING_VALUE = &
      cutensorOperationDescriptorAttribute(6)     ! type(c_ptr)
! Plan Preference attribute
type, bind(c) :: cutensorPlanPreferenceAttribute
    integer(4) :: attr
end type
type(cutensorPlanPreferenceAttribute), parameter :: &
    CUTENSOR_PLAN_PREFERENCE_AUTOTUNE_MODE = &
      cutensorPlanPreferenceAttribute(0), &  ! cutensorAutotuneMode type
    CUTENSOR_PLAN_PREFERENCE_CACHE_MODE = &
      cutensorPlanPreferenceAttribute(1), &  ! cutensorCacheMode type
    CUTENSOR_PLAN_PREFERENCE_INCREMENTAL_COUNT = &
      cutensorPlanPreferenceAttribute(2), &  ! integer(4)
    CUTENSOR_PLAN_PREFERENCE_ALGO = &
      cutensorPlanPreferenceAttribute(3), &  ! cutensorAlgo type
    CUTENSOR_PLAN_PREFERENCE_KERNEL_RANK = &
      cutensorPlanPreferenceAttribute(4), &  ! integer(4)
    CUTENSOR_PLAN_PREFERENCE_JIT = &
      cutensorPlanPreferenceAttribute(5)     ! cutensorJitMode type
! Plan Info attribute
type, bind(c) :: cutensorPlanInfoAttribute
    integer(4) :: attr
end type
type(cutensorPlanInfoAttribute), parameter :: &
    ! Pass integer(8), return exact required workspace in bytes needed
    CUTENSOR_PLAN_REQUIRED_WORKSPACE = cutensorPlanInfoAttribute(0)
! Autotune Mode
type, bind(c) :: cutensorAutotuneMode
    integer(4) :: mode
end type
type(cutensorAutotuneMode), parameter :: &
    CUTENSOR_AUTOTUNE_MODE_NONE        = cutensorAutotuneMode(0), &
    CUTENSOR_AUTOTUNE_MODE_INCREMENTAL = cutensorAutotuneMode(1)
! JIT Mode
type, bind(c) :: cutensorJitMode
    integer(4) :: mode
end type
type(cutensorJitMode), parameter :: &
    CUTENSOR_JIT_MODE_NONE        = cutensorJitMode(0), &
    CUTENSOR_JIT_MODE_DEFAULT     = cutensorJitMode(1)
! Cache Mode
type, bind(c) :: cutensorCacheMode
    integer(4) :: mode
end type
type(cutensorCacheMode), parameter :: &
    CUTENSOR_CACHE_MODE_NONE        = cutensorCacheMode(0), &
    CUTENSOR_CACHE_MODE_PEDANTIC    = cutensorCacheMode(1)
! New 2.0 handle types
type cutensorHandle
  TYPE(C_PTR) :: handle
end type

type cutensorTensorDescriptor
  TYPE(C_PTR) :: desc
end type

type cutensorOperationDescriptor
  TYPE(C_PTR) :: desc
end type

type cutensorComputeDescriptor
  TYPE(C_PTR) :: desc
end type

type cutensorPlan
  TYPE(C_PTR) :: desc
end type

type cutensorPlanPreference
  TYPE(C_PTR) :: desc
end type
! These are global C symbols in libcutensor
type(cutensorComputeDescriptor), &
  bind(C, name='CUTENSOR_COMPUTE_DESC_16F') ::  cutensor_Compute_Desc_16F
type(cutensorComputeDescriptor), &
  bind(C, name='CUTENSOR_COMPUTE_DESC_16BF') :: cutensor_Compute_Desc_16BF
type(cutensorComputeDescriptor), &
  bind(C, name='CUTENSOR_COMPUTE_DESC_TF32') :: cutensor_Compute_Desc_TF32
type(cutensorComputeDescriptor), &
  bind(C, name='CUTENSOR_COMPUTE_DESC_3XTF32') :: cutensor_Compute_Desc_3XTF32
type(cutensorComputeDescriptor), &
  bind(C, name='CUTENSOR_COMPUTE_DESC_32F') :: cutensor_Compute_Desc_32F
type(cutensorComputeDescriptor), &
  bind(C, name='CUTENSOR_COMPUTE_DESC_64F') :: cutensor_Compute_Desc_64F

7.1.1. cutensorCreate

此函数初始化 cuTENSOR 库并返回一个句柄,用于后续的 cuTENSOR 调用。

type(cutensorStatus) function cutensorCreate(handle)
   type(cutensorHandle) :: handle

7.1.2. cutensorDestroy

此函数释放 cuTENSOR 库使用的资源。 此函数通常是使用特定句柄调用 cuTENSOR API 的最后一个调用。

type(cutensorStatus) function cutensorDestroy(handle)
   type(cutensorHandle) :: handle

7.1.3. cutensorCreateTensorDescriptor

此函数创建并初始化一个 cuTENSOR 描述符,给定模式数量、范围、步幅和数据类型。

type(cutensorStatus) function cutensorCreateTensorDescriptor(handle, desc, &
        numModes, extent, stride, dataType, alignmentRequirement)
    type(cutensorHandle) :: handle
    type(cutensorTensorDescriptor) :: desc
    integer(4) :: numModes
    integer(8), dimension(*) :: extent
    integer(8), dimension(*) :: stride
    type(cutensorDataType) :: dataType
    integer(4) :: alignmentRequirement

7.1.4. cutensorDestroyTensorDescriptor

此函数删除 cuTENSOR 张量描述符并释放与其关联的资源。

type(cutensorStatus) function cutensorDestroyTensorDescriptor(desc)
    type(cutensorTensorDescriptor) :: desc

7.1.5. cutensorOperationDescriptorGetAttribute

此函数检索操作描述符类型的属性

type(cutensorStatus) function cutensorOperationDescriptorGetAttribute(handle, &
    desc, attr, buf, sizeInBytes)
    type(cutensorHandle) :: handle
    type(cutensorOperationDescriptor) :: desc
    type(cutensorOperationDescriptorAttribute) :: attr
    integer(4) :: buf(*)  ! Any type, of size sizeInBytes
    integer(8) :: sizeInBytes

7.1.6. cutensorOperationDescriptorSetAttribute

此函数设置操作描述符类型的属性

type(cutensorStatus) function cutensorOperationDescriptorSetAttribute(handle, &
    desc, attr, buf, sizeInBytes)
    type(cutensorHandle) :: handle
    type(cutensorOperationDescriptor) :: desc
    type(cutensorOperationDescriptorAttribute) :: attr
    integer(4) :: buf(*)  ! Any type, of size sizeInBytes
    integer(8) :: sizeInBytes

7.1.7. cutensorDestroyOperationDescriptor

此函数释放与操作描述符类型相关的资源

type(cutensorStatus) function cutensorDestroyOperationDescriptor(desc)
    type(cutensorOperationDescriptor) :: desc

7.1.8. cutensorCreatePlanPreference

此函数分配并设置 cuTENSOR 计划首选项类型。

type(cutensorStatus) function cutensorCreatePlanPreference(handle, pref, algo, &
        jitMode)
    type(cutensorHandle) :: handle
    type(cutensorPlanPreference) :: pref
    type(cutensorAlgo) :: algo
    type(cutensorJitMode) :: jitMode

7.1.9. cutensorDestroyPlanPreference

此函数释放与计划首选项类型关联的资源。

type(cutensorStatus) function cutensorDestroyPlanPreference(pref)
    type(cutensorPlanPreference) :: pref

7.1.10. cutensorPlanPreferenceSetAttribute

此函数设置操作描述符类型的属性

type(cutensorStatus) function cutensorPlanPreferenceSetAttribute(handle, pref, &
    attr, buf, sizeInBytes)
    type(cutensorHandle) :: handle
    type(cutensorPlanPreference) :: pref
    type(cutensorPlanPreferenceAttribute) :: attr
    integer(4) :: buf(*)  ! Any type, of size sizeInBytes
    integer(8) :: sizeInBytes

7.1.11. cutensorEstimateWorkspaceSize

此函数确定给定操作和首选项所需的工作空间大小。

type(cutensorStatus) function cutensorEstimateWorkspaceSize(handle, desc, &
        pref, workspacePref, workspaceSizeEstimate)
    type(cutensorHandle) :: handle
    type(cutensorOperationDescriptor) :: desc
    type(cutensorPlanPreference) :: pref
    type(cutensorWorksizePreference) :: workspacePref
    integer(8) :: workspaceSizeEstimate

7.1.12. cutensorCreatePlan

此函数分配并设置 cuTENSOR 计划类型。

type(cutensorStatus) function cutensorCreatePlan(handle, plan, &
        desc, pref, workspaceSizeLimit)
    type(cutensorHandle) :: handle
    type(cutensorPlan), intent(out) :: plan
    type(cutensorOperationDescriptor) :: desc
    type(cutensorPlanPreference) :: pref
    integer(8) :: workspaceSizeLimit

7.1.13. cutensorDestroyPlan

此函数释放与 cuTENSOR 计划类型关联的资源。

type(cutensorStatus) function cutensorDestroyPlan(plan)
    type(cutensorPlan) :: plan

7.1.14. cutensorGetErrorString

此函数返回错误代码的描述字符串。

character*128 function cutensorGetErrorString(ierr)
   type(cutensorStatus) :: ierr

7.1.15. cutensorGetVersion

此函数返回 cuTENSOR 库的版本号。

integer(8) function cutensorGetVersion()

7.1.16. cutensorGetCudartVersion

此函数返回 cuTENSOR 库编译时所针对的 CUDA 运行时的版本。

integer(8) function cutensorGetCudartVersion()

7.2. CUTENSOR 逐元素操作

本节包含 cuTENSOR 函数的接口,这些函数在张量之间执行逐元素操作。

7.2.1. cutensorCreatePermutation

此函数创建以下形式的异位张量置换运算符

B = alpha * opA(perm(A)) 置换操作信息存储在 intent(out) desc 参数中。

数组 A, B 可以是任何支持的类型、种类和秩。 A, B 的置换是使用模式参数设置的。

type(cutensorStatus) function cutensorCreatePermutation(handle, desc, &
    descA, modeA, opA, descB, modeB, descCompute)
    type(cutensorHandle) :: handle
    type(cutensorOperationDescriptor), intent(out) :: desc
    type(cutensorTensorDescriptor) :: descA, descB
    integer(4), dimension(*) :: modeA, modeB
    type(cutensorOperator) :: opA
    type(cutensorComputeDescriptor) :: descCompute

7.2.2. cutensorPermute

此函数执行以下形式的异位张量置换

B = alpha * opA(perm(A))

alpha 标量的类型和种类由 typeScalar 参数确定。 数组 A, B 可以是任何支持的类型、种类和秩。 A, B 的置换是使用模式参数设置的。 操作 opA(perm(A)) 在调用 cutensorInitTensorDescriptor() 时通过 unaryOp 参数设置。

type(cutensorStatus) function cutensorPermute(handle, plan, &
    alpha, A, B, stream)
    type(cutensorHandle) :: handle
    type(cutensorPlan) :: plan
    real :: alpha
    real, device, dimension(*) :: A, B
    integer(kind=cuda_stream_kind) :: stream

7.2.3. cutensorCreateElementwiseBinary

此函数在两个输入上创建逐元素张量运算,形式如下

D=opAC(alpha*op(perm(A)),gamma*op(perm(C)))

opA, opC 参数是逐元素一元运算符。 opAC 参数是逐元素二元运算符。 数组 A, C, D 可以是任何支持的类型、种类和秩。 A, C, D 的置换是使用模式参数设置的。

type(cutensorStatus) function cutensorCreateElementwiseBinary(handle, desc, &
        descA, modeA, opA, descC, modeC, opC, &
        descD, modeD, opAC, descCompute)
    type(cutensorHandle) :: handle
    type(cutensorOperationDescriptor) :: desc
    type(cutensorTensorDescriptor) :: descA, descC, descD
    integer(4), dimension(*) :: modeA, modeC, modeD
    type(cutensorOperator) :: opA, opC, opAC
    type(cutensorComputeDescriptor) :: descCompute

7.2.4. cutensorElementwiseBinaryExecute

此函数在两个输入上执行逐元素张量运算,形式如下

D=opAC(alpha*op(perm(A)),gamma*op(perm(C)))

指定的计划是通过调用 cutensorCreatePlan() 创建的。 数组 A, C, D 可以是任何支持的类型、种类和秩。 alpha, gamma 标量的允许类型和种类由调用 cutensorCreateElementwiseBinary 中的计算描述符确定。

type(cutensorStatus) function cutensorElementwiseBinaryExecute(handle, &
    plan, alpha, A, gamma, C, D, stream)
    type(cutensorHandle) :: handle
    type(cutensorPlan) :: plan
    real :: alpha, gamma  ! Any compatible type and kind
    real, device, dimension(*) :: A, C, D
    integer(kind=cuda_stream_kind) :: stream

7.2.5. cutensorCreateElementwiseTrinary

此函数在三个输入上创建逐元素张量运算,形式如下

D=opABC(opAB(alpha*op(perm(A)),beta*op(perm(B))),gamma*op(perm(C)))

opA, opB, opC 参数是逐元素一元运算符。 opAB 参数是逐元素二元运算符。 数组 A, B, C, D 可以是任何支持的类型、种类和秩。 A, B, C, D 的置换是使用模式参数设置的。

type(cutensorStatus) function cutensorCreateElementwiseTrinary(handle, desc, &
        descA, modeA, opA, descB, modeB, opB, descC, modeC, opC, &
        descD, modeD, opAB, descCompute)
    type(cutensorHandle) :: handle
    type(cutensorOperationDescriptor) :: desc
    type(cutensorTensorDescriptor) :: descA, descB, descC, descD
    integer(4), dimension(*) :: modeA, modeB, modeC, modeD
    type(cutensorOperator) :: opA, opB, opC, opAB
    type(cutensorComputeDescriptor) :: descCompute

7.2.6. cutensorElementwiseTrinaryExecute

此函数在三个输入上执行逐元素张量运算,形式如下

D=opABC(opAB(alpha*op(perm(A)),beta*op(perm(B))),gamma*op(perm(C)))

指定的计划是通过调用 cutensorCreatePlan() 创建的。 数组 A, B, C, D 可以是任何支持的类型、种类和秩。 alpha, gamma 标量的允许类型和种类由调用 cutensorCreateElementwiseTrinary 中的计算描述符确定。

type(cutensorStatus) function cutensorElementwiseTrinaryExecute(handle, plan,  &
    alpha, A, beta, B, gamma, C, D, stream)
    type(cutensorHandle) :: handle
    type(cutensorPlan) :: plan
    real :: alpha, beta, gamma  ! Any compatible type and kind
    real, device, dimension(*) :: A, B, C, D
    integer(kind=cuda_stream_kind) :: stream

7.3. CUTENSOR 归约操作

本节包含 cuTENSOR 函数的接口,这些函数对张量执行归约操作。

7.3.1. cutensorCreateReduction

此函数创建以下形式的归约张量运算

D = alpha * opReduce(opA(A)) + beta * opC(C)

opA, opC 参数是逐元素一元运算符。 opReduce 参数是二元运算符。 数组 A, C, D 可以是任何支持的类型、种类和秩。 A, C 的置换是使用模式参数设置的。

type(cutensorStatus) function cutensorCreateReduction(handle, desc, &
        descA, modeA, opA, descC, modeC, opC, &
        descD, modeD, opReduce, descCompute)
    type(cutensorHandle) :: handle
    type(cutensorOperationDescriptor) :: desc
    type(cutensorTensorDescriptor) :: descA, descC, descD
    integer(4), dimension(*) :: modeA, modeC, modeD
    type(cutensorOperator) :: opA, opC, opReduce
    type(cutensorComputeDescriptor) :: descCompute

7.3.2. cutensorReduce

此函数执行以下形式的归约

D = alpha * opReduce(opA(A)) + beta * opC(C)

指定的计划是通过调用 cutensorCreatePlan() 创建的。 数组 A, C, D 可以是任何支持的类型、种类和秩。 alpha, beta 标量的允许类型和种类由调用 cutensorCreateReduction 中的计算描述符确定。

type(cutensorStatus) function cutensorReduce(handle, plan, &
    alpha, A, beta, C, D, workspace, workspaceSize, stream)
    type(cutensorHandle) :: handle
    type(cutensorPlan) :: plan
    real :: alpha, beta  ! Any compatible type and kind
    real, device, dimension(*) :: A, C, D
    real, device, dimension(*) :: workspace  ! Any type
    integer(8) :: workspaceSize
    integer(kind=cuda_stream_kind) :: stream

7.4. CUTENSOR 缩并操作

本节包含 cuTENSOR 函数的接口,这些函数在张量之间执行缩并操作。

7.4.1. cutensorCreateContraction

此函数创建以下形式的缩并张量运算

D = alpha*(AxB) + beta*C

opA, opB, opC 参数是逐元素一元运算符。 数组 A, B, C, D 可以是任何支持的类型、种类和秩。 A, B, C 的置换是使用模式参数设置的。

type(cutensorStatus) function cutensorCreateContraction(handle, desc, &
        descA, modeA, opA, descB, modeB, opB, &
        descC, modeC, opC, descD, modeD, descCompute)
    type(cutensorHandle) :: handle
    type(cutensorOperationDescriptor) :: desc
    type(cutensorTensorDescriptor) :: descA, descB, descC, descD
    integer(4), dimension(*) :: modeA, modeB, modeC, modeD
    type(cutensorOperator) :: opA, opB, opC
    type(cutensorComputeDescriptor) :: descCompute

7.4.2. cutensorContract

此函数执行以下形式的缩并

D = alpha*(AxB) + beta*C

指定的计划是通过调用 cutensorCreatePlan() 创建的。 数组 A, B, C, D 可以是任何支持的类型、种类和秩。 alpha, beta 标量的允许类型和种类由调用 cutensorCreateContraction 中的计算描述符确定。

type(cutensorStatus) function cutensorContract(handle, plan, &
    alpha, A, B, beta, C, D, workspace, workspaceSize, stream)
    type(cutensorHandle) :: handle
    type(cutensorPlan) :: plan
    real :: alpha, beta  ! Any compatible type and kind
    real, device, dimension(*) :: A, B, C, D
    real, device, dimension(*) :: workspace  ! Any type
    integer(8) :: workspaceSize
    integer(kind=cuda_stream_kind) :: stream

7.5. CUTENSOR Fortran 扩展

本节包含基于 cuTENSOR 库构建的 Fortran 数组内置函数操作、数组表达式和数组赋值的 cuTENSOR 接口扩展。 在 CUDA Fortran 中,这些操作采用具有 device 或 managed 属性的数据。 在 OpenACC 中,可以使用 host_data 构造调用它们。 通过在程序单元中添加行 use cutensorEx 来公开这些扩展的接口,或者可以使用 Fortran 块功能将其应用于特定语句,如下一个示例所示。

block; use cutensorEx
  D = reshape(A,shape=[ni,nk,nj],order=[1,3,2])
end block

为了使操作在一次底层内核调用中进行,RHS 表达式被延迟,直到重载的赋值操作同时具有 LHS 和 RHS。 这保证了在任何可能的情况下,性能与低级 cuTENSOR API 相当。 通用性受到影响,因此目前仅支持特定形式的 Fortran 语句,这些语句将在本章的后续章节中进行文档说明。

由于 cuTENSOR 库操作采用流参数,因此我们添加了一种设置 cuTENSOR 默认流的方法,我们的运行时将维护该默认流,每个 CPU 线程一个副本。 也就是

integer function cutensorexSetStream(stream)
integer(kind=cuda_stream_kind) :: stream

7.5.1. Fortran Reshape

此 Fortran 函数更改数组的形状,并可能置换维度和布局。 它的调用方式如下

D = alpha * func(reshape(A, shape=[...], order=[...]))

数组 A 和 D 的类型可以是 real(2)、real(4)、real(8)、complex(4) 或 complex(8)。 A 和 D 的秩(维度数)可以是 1 到 7。 alpha 值应与 A 的类型相同,或者与 func(reshape(A)) 的类型相同(如果不同)。 可以应用于 reshape 结果的接受函数在本节末尾列出。 当前不支持 F90 reshape 函数的 pad 参数。 除了初始化和设置 cuTENSOR 描述符外,此 Fortran 调用还映射到 cutensorPermutation()

! Example to switch the 2nd and 3rd dimension layout
D = reshape(a,shape=[ni,nk,nj], order=[1,3,2])
! Same example, take the absolute value and scale by 2.5
D = 2.5 * abs(reshape(a,shape=[ni,nk,nj], order=[1,3,2]))

7.5.2. Fortran Transpose

此 Fortran 函数转置矩阵(二维数组)。 它的调用方式如下

D = alpha * func(transpose(A))

数组 A 和 D 的类型可以是 real(2)、real(4)、real(8)、complex(4) 或 complex(8)。 A 和 D 的秩(维度数)为 2。 应用缩放(alpha 参数)或将函数应用于转置结果是可选的。 alpha 值应与 A 的类型相同,或者与 func(transpose(A)) 的类型相同(如果不同)。 可以应用于 transpose 结果的接受函数在本节末尾列出。 除了初始化和设置 cuTENSOR 描述符外,此 Fortran 调用还映射到 cutensorPermutation()

! Example of transpose
D = transpose(A)
! Same example, take the absolute value and scale by 2.5
D = 2.5 * abs(tranpose(A))

7.5.3. Fortran Spread

此 Fortran 函数通过指定的维度将数组的秩增加一,并在新维度上广播值。 它的调用方式如下

D = alpha * func(spread(A, dim=i, ncopies=n))

数组 A 和 D 的类型可以是 real(2)、real(4)、real(8)、complex(4) 或 complex(8)。 A 和 D 的秩(维度数)可以是 1 到 7。 alpha 值应与 A 的类型相同。 可以应用于 spread 结果的接受函数在本节末尾列出。 除了初始化和设置 cuTENSOR 描述符外,此 Fortran 调用还映射到 cutensorPermutation()

! Example to add and broadcast values over the new first dimension
D = spread(A, dim=1, ncopies=n1)
! Same example, take the absolute value and scale by 2.5
D = 2.5 * abs(spread(A, dim=1, ncopies=n1))

7.5.4. Fortran 逐元素表达式

对将涉及两个或三个源数组的表达式转换为 cuTENSOR 调用的支持有限。 第一个或前两个操作数可以是置换数组,reshape()、transpose() 或 spread() 调用的结果。 元素函数可以应用于数组操作数(无论是否置换),它们也可以缩放。 以下是一些支持的形式

D = A + B

D = permute(A) + B

D = A + permute(B)

D = permute(A) - B

D = A - permute(B)

D = A + func(permute(B))

D = func(permute(A)) + permute(B)

D = alpha * func(permute(A)) + beta * permute(B) + gamma * C

数组 A、B、C 和 D 的类型可以是 real(2)、real(4)、real(8)、complex(4) 或 complex(8)。 A、B、C 和 D 的秩(维度数)可以是 1 到 7。 对于三操作数情况,数组 C 和 D 必须具有相同的形状、步幅和类型。 alpha 值应与 A 的类型相同。 beta 和 B 以及 gamma 和 C 也是如此。 Fortran 包装器不进行类型转换,但 cuTENSOR 可能会进行类型转换。 对数组一致性的编译时检查是有限的。 来自 Fortran 包装器或 cuTENSOR 的其他运行时检查可能用于不支持的组合。 可以应用于置换或未置换数组的接受函数在本节末尾列出。 除了初始化和设置 cuTENSOR 描述符外,这些 Fortran 表达式还映射到 cutensorElementwiseBinary()cutensorElementwiseTrinary()

! Example to scale and add two arrays together
D = alpha * A + beta * B
! Same example, take the absolute value of A and B and add to C
D = alpha * abs(A) + beta * abs(B) + C
! Transpose the first array before adding to the second
D = alpha * abs(transpose(A)) + beta * abs(B) + C

7.5.5. Fortran Matmul 操作

矩阵乘法是张量缩并的一个实例。 matmul 的任一操作数都可以是置换数组,reshape()、transpose() 或 spread() 调用的结果。 cuTENSOR 库当前不支持将元素函数应用于数组操作数,但可以缩放结果和累加器。 以下是一些支持的形式

D = matmul(A, B)

D = matmul(permute(A), B)

D = matmul(A, permute(B))

D = matmul(permute(A), permute(B))

D = C + matmul(A, B)

D = C - matmul(A, B)

D = alpha * matmul(A, B) + beta * C

数组 A、B、C 和 D 的类型可以是 real(2)、real(4)、real(8)、complex(4) 或 complex(8)。 在任何置换之后,A、B、C 和 D 的秩(维度数)必须为 2。 数组 C 和 D 目前必须具有相同的形状、步幅和类型。 alpha 值应与 A 和 B 的类型相同。 beta 值应与 C 的类型相同。 Fortran 包装器不进行类型转换,但 cuTENSOR 可能会进行类型转换。 对数组一致性的编译时检查是有限的。 来自 Fortran 包装器或 cuTENSOR 的其他运行时检查可能用于不支持的组合。 除了初始化和设置 cuTENSOR 描述符外,Fortran 对 Matmul 的支持还映射到 cutensorContraction()

! Example to multiply two matrices together
D = matmul(A, B)
! Same example, accumulate into C
C = C +  matmul(A, B)
! Same example, transpose the first argument
C = C + matmul(transpose(A), B)

在支持 TF32 类型的 GPU 上,为了指示缩并对 real(4) 使用计算类型 CUTENSOR_R_MIN_TF32 而不是 CUTENSOR_R_MIN_32F(或对 complex(4) 类似),我们提供了一种设置内部参数的方法,类似于默认流,我们的运行时将维护该参数。 默认优化级别为 0。 将优化级别设置为大于 0 将使用 CUTENSOR_R_MIN_TF32。

integer function cutensorExSetOptLevel(level)
integer(4) :: level

7.5.6. Fortran Dot_Product 操作

点积是张量缩并的另一个实例。 在此实现中,我们添加了一个新的 dim 参数,使 dot_product 更普遍地适用于高阶数组。 它与上一节中的 matmul 功能非常相似。 dot_product 的两个操作数中的任何一个都可以是置换数组,reshape()、transpose() 或 spread() 调用的结果。 请注意,只有 reshape() 可以生成一维数组。 其他调用可以与 dim 参数一起使用。 cuTENSOR 库当前不支持将元素函数应用于数组操作数,但可以缩放结果和累加器。 以下是一些支持的形式

X = dot_product(A, B)

X = dot_product(reshape(A,shape=[n]), B)

X = dot_product((A, reshape(B,shape=[n]))

D = dot_product(permute(A), permute(B),dim=i)

D = C + dot_product(A, B, dim=i)

D = C - dot_product(A, B, dim=i)

D = C + alpha * dot_product(A, B, dim=i)

数组 A、B、C 和 D 以及标量 X 的类型可以是 real(2)、real(4)、real(8)、complex(4) 或 complex(8)。 数组 C 和 D 目前必须具有相同的形状、步幅和类型。 对于使用 dim 参数的情况,D 和 C 的秩比 A 和 B 小 1。 alpha 值应与 A 和 B 的类型相同。 Fortran 包装器不进行类型转换,但 cuTENSOR 可能会进行类型转换。 对数组一致性的编译时检查是有限的。 来自 Fortran 包装器或 cuTENSOR 的其他运行时检查可能用于不支持的组合。 除了初始化和设置 cuTENSOR 描述符外,Fortran 对 Dot_Product 的支持还映射到 cutensorContraction()

7.5.7. 支持的逐元素函数

从上面列出的 cuTENSOR 定义支持的逐元素函数列表中,高级接口支持其中几个函数。 cuTENSOR 库当前不支持为复杂数据列出的许多函数;有关最新信息,请查阅 cuTENSOR 文档。 以下是至少具有一定程度 Fortran 接口支持的函数

SQRT RELU CONJG RCP SIGMOID

TANH EXP LOG ABS NEG

SIN COS TAN SINH COSH

ASIN ACOS ATAN ASINH ACOSH

ATANH CEIL FLOOR

请注意,C 语言的复共轭函数 conj 在 Fortran 中拼写为 conjg。此外,C 语言和 Fortran 语言中 ceilfloor 函数的返回值类型有所不同。我们保留了 C 语言的拼写和行为(返回实数,而不是整数)。

在当前的实现中,只有 ABS、 CEIL、 CONJG、 COS、 SIN 可以用于裸数组。所有函数都可以应用于置换的结果。使用 reshape(A, shape=shape(A)) 作为一个空操作 (NOP),将裸数组转换为当前可以识别的形式。

用户会发现,二元或三元内核的性能,例如

D = sin(A) + cos(B) + C

将不如为该特定操作编写和编译的内核(使用 CUDA、CUDA Fortran 或 OpenACC)的性能好,这是因为将函数通用地应用于操作数时,cuTENSOR 内核存在开销。如果操作置换操作数,例如

D = sin(permute(A)) + cos(permute(B)) + C

用户可能会看到与其他朴素实现相比良好的性能,这取决于输入数组上的置换有多复杂。

8. NVIDIA 集体通信库 (NCCL) API

本节介绍 NCCL 库的 Fortran 接口。NCCL 函数只能从主机代码访问。大多数运行时 API 例程,除了一些实用程序外,都是返回错误代码的函数;如果调用成功,它们返回 ncclSuccess 值,如果出现错误,则返回另一个值。与早期的 Fortran 模块不同,我们为返回值创建了一个 ncclResult 派生类型。我们还为测试返回状态重载了 .eq..ne. 逻辑运算符。

通过添加以下行,可以在主机代码中公开本章中描述的 NCCL 接口和定义

use nccl

到您的程序单元。

除非提供了特定的 kind,否则接口中使用的普通 integer 类型表示 integer(4),而普通 real 类型表示 real(4)。

8.1. NCCL 定义和辅助函数

本节包含 NCCL 库中使用的定义和数据类型,以及 NCCL 通信器创建和管理函数的接口。

Fortran NCCL 模块包含以下派生类型定义

! Definitions from nccl.h
integer, parameter :: NCCL_MAJOR = 2
integer, parameter :: NCCL_MINOR = 19
integer, parameter :: NCCL_PATCH = 3
integer, parameter :: NCCL_VERSION = &
    (NCCL_MAJOR * 10000 + NCCL_MINOR * 100 + NCCL_PATCH)

integer, parameter :: NCCL_SPLIT_NOCOLOR = -1
! Types from nccl.h
! ncclUniqueId
type, bind(c) :: ncclUniqueId
  character(c_char) :: internal(NCCL_UNIQUE_ID_BYTES)
end type ncclUniqueId

! ncclComm
type, bind(c) :: ncclComm
  type(c_ptr) :: member
end type ncclComm

! ncclResult
type, bind(c) :: ncclResult
  integer(c_int) :: member
end type ncclResult

type(ncclResult), parameter :: &
    ncclSuccess             = ncclResult(0), &
    ncclUnhandledCudaError  = ncclResult(1), &
    ncclSystemError         = ncclResult(2), &
    ncclInternalError       = ncclResult(3), &
    ncclInvalidArgument     = ncclResult(4), &
    ncclInvalidUsage        = ncclResult(5), &
    ncclRemoteError         = ncclResult(6), &
    ncclInProgress          = ncclResult(7), &
    ncclNumResults          = ncclResult(8)
! ncclDataType
type, bind(c) :: ncclDataType
  integer(c_int) :: member
end type ncclDataType

type(ncclDataType), parameter :: &
    ncclInt8     = ncclDataType(0), &
    ncclChar     = ncclDataType(0), &
    ncclUint8    = ncclDataType(1), &
    ncclInt32    = ncclDataType(2), &
    ncclInt      = ncclDataType(2), &
    ncclUint32   = ncclDataType(3), &
    ncclInt64    = ncclDataType(4), &
    ncclUint64   = ncclDataType(5), &
    ncclFloat16  = ncclDataType(6), &
    ncclHalf     = ncclDataType(6), &
    ncclFloat32  = ncclDataType(7), &
    ncclFloat    = ncclDataType(7), &
    ncclFloat64  = ncclDataType(8), &
    ncclDouble   = ncclDataType(8), &
    ncclNumTypes = ncclDataType(9)
! ncclRedOp
type, bind(c) :: ncclRedOp
  integer(c_int) :: member
end type ncclRedOp

type(ncclRedOp), parameter :: &
    ncclSum    = ncclRedOp(0), &
    ncclProd   = ncclRedOp(1), &
    ncclMax    = ncclRedOp(2), &
    ncclMin    = ncclRedOp(3), &
    ncclAvg    = ncclRedOp(4), &
    ncclNumOps = ncclRedOp(5)
! ncclConfig
type, bind(c) :: ncclConfig
  integer(c_size_t) :: size = 48
  integer(c_int) :: magic = z'cafebeef'
  integer(c_int) :: version = NCCL_VERSION
  integer(c_int) :: blocking = z'80000000'
  integer(c_int) :: cgaClusterSize = z'80000000'
  integer(c_int) :: minCTAs = z'80000000'
  integer(c_int) :: maxCTAs = z'80000000'
  type(c_ptr)    :: netName = c_null_ptr
  integer(c_int) :: splitShare = z'80000000'
end type ncclConfig

8.1.1. ncclGetVersion

此函数返回 NCCL 库的版本号。

type(ncclResult) function ncclGetVersion(version)
integer(4) :: version

8.1.2. ncclGetUniqueId

此函数生成一个 ID,用于 ncclCommInitRank。此例程应调用一次,生成的 ID 应分发给所有 rank。

type(ncclResult) function ncclGetUniqueId(uniqueId)
type(ncclUniqueId) :: uniqueId

8.1.3. ncclCommInitRank

此函数生成一个新的 NCCL 通信器,类型为 type(ncclCom)。rank 参数必须介于 0 和 nranks-1 之间。uniqueId 参数应使用 ncclGetUniqueId 生成。

type(ncclResult) function ncclCommInitRank(comm, nranks, uniqueId, rank)
type(ncclComm) :: comm
integer(4) :: nranks
type(ncclUniqueId) :: uniqueId
integer(4) :: rank

8.1.4. ncclCommInitRankConfig

此函数使用配置参数生成一个新的 NCCL 通信器,类型为 type(ncclCom)。rank 参数必须介于 0 和 nranks-1 之间。uniqueId 参数应使用 ncclGetUniqueId 生成。此接口的一个变体将接受 c_null_ptr 作为最后一个参数。

type(ncclResult) function ncclCommInitRankConfig(comm, nranks, &
        commId, rank, config)
type(ncclComm) :: comm
integer(4) :: nranks
type(ncclUniqueId) :: commId
integer(4) :: rank
type(ncclConfig) :: config

8.1.5. ncclCommInitAll

此函数创建一个单进程通信器 clique,类型为 type(ncclCom) 的数组。

type(ncclResult) function ncclCommInitAll(comms, ndev, devlist)
type(ncclComm) :: comms(*)
integer(4) :: ndev
integer(4) :: devlist(*)

8.1.6. ncclCommDestroy

此函数释放分配给 NCCL 通信器的资源。它将等待未完成的操作。

type(ncclResult) function ncclCommDestroy(comm)
type(ncclComm) :: comm

8.1.7. ncclCommFinalize

此函数最终确定 NCCL 通信器对象。

type(ncclResult) function ncclCommFinalize(comm)
type(ncclComm) :: comm

8.1.8. ncclCommSplit

此函数从现有的 NCCL 通信器创建一个新的 NCCL 通信器,类型为 type(ncclCom),基于输入的 color 和 key。此接口的一个变体将接受 c_null_ptr 作为最后一个参数。

type(ncclResult) function ncclCommSplit(comm, color, &
        key, newcomm, config)
type(ncclComm) :: comm
integer(4) :: color, key
type(ncclComm) :: newcomm
type(ncclConfig) :: config

8.1.9. ncclCommAbort

此函数释放分配给 NCCL 通信器的资源。它将中止未完成的操作。

type(ncclResult) function ncclCommAbort(comm)
type(ncclComm) :: comm

8.1.10. ncclCommRegister

此函数注册一个 CUDA 缓冲区,使其可用于零拷贝操作。缓冲区可以是任何类型。

type(ncclResult) function ncclCommRegister(comm, buff, size, handle)
type(ncclComm) :: comm
real(4), device :: buff(*)  ! Any type of device array
integer(8)      :: size
type(c_ptr), intent(out) :: handle

8.1.11. ncclCommDeregister

此函数注销用于零拷贝操作的 CUDA 缓冲区。

type(ncclResult) function ncclCommDeregister(comm, handle)
type(ncclComm) :: comm
type(c_ptr), intent(in) :: handle

8.1.12. ncclGetErrorString

此函数为给定的 ncclResult 值返回一个错误字符串。

character*128 function ncclGetErrorString(ierr)
type(ncclResult) :: ierr

8.1.13. ncclGetLastError

此函数返回最近发生的错误的字符串。

character*128 function ncclGetLastError(comm)
type(ncclComm) :: comm

8.1.14. ncclCommGetAsyncError

此函数查询通信器是否遇到任何异步错误。

type(ncclResult) function ncclCommGetAsyncError(comm, asyncError)
type(ncclComm) :: comm
type(ncclResult) :: asyncError

8.1.15. ncclCommCount

此函数将 count 参数设置为 NCCL 通信器中 rank 的数量。

type(ncclResult) function ncclCommCount(comm, count)
type(ncclComm) :: comm
integer(4) :: count

8.1.16. ncclCommCuDevice

此函数将 device 参数设置为与 NCCL 通信器关联的 CUDA 设备。

type(ncclResult) function ncclCommCuDevice(comm, device)
type(ncclComm) :: comm
integer(4) :: device

8.1.17. ncclCommUserRank

此函数将 rank 参数设置为 NCCL 通信器内的 rank。

type(ncclResult) function ncclCommUserRank(comm, rank)
type(ncclComm) :: comm
integer(4) :: rank

8.2. NCCL 集体通信函数

本节包含用于在设备数据上执行集体通信操作的 NCCL 函数的接口。所有函数都可以接受 CUDA Fortran 设备数组、host_data use_device 数据指令中的 OpenACC 数组或 Fortran type(c_devptr) 参数。

8.2.1. ncclAllReduce

此函数对跨设备的数据执行指定的归约操作,并将结果写入每个 rank 的接收缓冲区。

type(ncclResult) function ncclAllReduce(sendbuff, recvbuff, &
    count, datatype, op, comm, stream)
type(c_devptr) :: sendbuff, recvbuff
  ! These combinations of sendbuff, recvbuff are also accepted:
  ! integer(4), device :: sendbuff(*), recvbuff(*)
  ! integer(8), device :: sendbuff(*), recvbuff(*)
  ! real(2), device :: sendbuff(*), recvbuff(*)
  ! real(4), device :: sendbuff(*), recvbuff(*)
  ! real(8), device :: sendbuff(*), recvbuff(*)
integer(cuda_count_kind) :: count
type(ncclDataType) :: datatype
type(ncclRedOp) :: op
type(ncclComm) :: comm
integer(cuda_stream_kind) :: stream

8.2.2. ncclBroadcast

此函数将根 rank 上的发送缓冲区复制到 NCCL 通信器中的所有其他 rank。如果 sendbuff 和 recvbuff 是相同的地址,则会发生就地操作。

type(ncclResult) function ncclBroadcast(sendbuff, recvbuff, &
    count, datatype, root, comm, stream)
type(c_devptr) :: sendbuff, recvbuff
  ! These combinations of sendbuff, recvbuff are also accepted:
  ! integer(4), device :: sendbuff(*), recvbuff(*)
  ! integer(8), device :: sendbuff(*), recvbuff(*)
  ! real(2), device :: sendbuff(*), recvbuff(*)
  ! real(4), device :: sendbuff(*), recvbuff(*)
  ! real(8), device :: sendbuff(*), recvbuff(*)
integer(cuda_count_kind) :: count
type(ncclDataType) :: datatype
integer(4) :: root
type(ncclComm) :: comm
integer(cuda_stream_kind) :: stream

8.2.3. ncclReduce

此函数执行与 AllReduce 相同的操作,但仅将结果写入指定根 rank 的接收缓冲区。

type(ncclResult) function ncclReduce(sendbuff, recvbuff, &
    count, datatype, op, root, comm, stream)
type(c_devptr) :: sendbuff, recvbuff
  ! These combinations of sendbuff, recvbuff are also accepted:
  ! integer(4), device :: sendbuff(*), recvbuff(*)
  ! integer(8), device :: sendbuff(*), recvbuff(*)
  ! real(2), device :: sendbuff(*), recvbuff(*)
  ! real(4), device :: sendbuff(*), recvbuff(*)
  ! real(8), device :: sendbuff(*), recvbuff(*)
integer(cuda_count_kind) :: count
type(ncclDataType) :: datatype
type(ncclRedOp) :: op
integer(4) :: root
type(ncclComm) :: comm
integer(cuda_stream_kind) :: stream

8.2.4. ncclAllGather

此函数收集来自每个 rank 的发送缓冲区,并将它们按 rank 顺序存储在所有 rank 的接收缓冲区中。

type(ncclResult) function ncclAllGather(sendbuff, recvbuff, &
    sendcount, datatype, comm, stream)
type(c_devptr) :: sendbuff, recvbuff
  ! These combinations of sendbuff, recvbuff are also accepted:
  ! integer(4), device :: sendbuff(*), recvbuff(*)
  ! integer(8), device :: sendbuff(*), recvbuff(*)
  ! real(2), device :: sendbuff(*), recvbuff(*)
  ! real(4), device :: sendbuff(*), recvbuff(*)
  ! real(8), device :: sendbuff(*), recvbuff(*)
integer(cuda_count_kind) :: sendcount
type(ncclDataType) :: datatype
type(ncclComm) :: comm
integer(cuda_stream_kind) :: stream

8.2.5. ncclReduceScatter

此函数对数据执行指定的归约操作,并根据 rank 索引将结果分散在 rank 之间的相等块中。

type(ncclResult) function ncclReduceScatter(sendbuff, recvbuff, &
    recvcount, datatype, op, comm, stream)
type(c_devptr) :: sendbuff, recvbuff
  ! These combinations of sendbuff, recvbuff are also accepted:
  ! integer(4), device :: sendbuff(*), recvbuff(*)
  ! integer(8), device :: sendbuff(*), recvbuff(*)
  ! real(2), device :: sendbuff(*), recvbuff(*)
  ! real(4), device :: sendbuff(*), recvbuff(*)
  ! real(8), device :: sendbuff(*), recvbuff(*)
integer(cuda_count_kind) :: recvcount
type(ncclDataType) :: datatype
type(ncclRedOp) :: op
type(ncclComm) :: comm
integer(cuda_stream_kind) :: stream

8.3. NCCL 点对点通信函数

本节包含用于在设备数据上执行点对点通信操作的 NCCL 函数的接口。所有函数都可以接受 CUDA Fortran 设备数组、host_data use_device 数据指令中的 OpenACC 数组或 Fortran type(c_devptr) 参数。点对点操作在 NCCL 2.7 中添加。

8.3.1. ncclSend

此函数将数据从发送缓冲区发送到通信器对等方。此操作会阻塞 GPU。接收对等方必须使用相同的数据类型和计数调用 ncclRecv。

type(ncclResult) function ncclSend(sendbuff, &
    count, datatype, peer, comm, stream)
type(c_devptr) :: sendbuff
  ! These types for sendbuff are also accepted:
  ! integer(4), device :: sendbuff(*)
  ! integer(8), device :: sendbuff(*)
  ! real(2), device :: sendbuff(*)
  ! real(4), device :: sendbuff(*)
  ! real(8), device :: sendbuff(*)
integer(cuda_count_kind) :: count
type(ncclDataType) :: datatype
integer(4) :: peer
type(ncclComm) :: comm
integer(cuda_stream_kind) :: stream

8.3.2. ncclRecv

此函数从通信器对等方接收数据。此操作会阻塞 GPU。发送对等方必须使用相同的数据类型和计数调用 ncclSend。

type(ncclResult) function ncclRecv(recvbuff, &
    count, datatype, peer, comm, stream)
type(c_devptr) :: recvbuff
  ! These types for recvbuff are also accepted:
  ! integer(4), device :: recvbuff(*)
  ! integer(8), device :: recvbuff(*)
  ! real(2), device :: recvbuff(*)
  ! real(4), device :: recvbuff(*)
  ! real(8), device :: recvbuff(*)
integer(cuda_count_kind) :: count
type(ncclDataType) :: datatype
integer(4) :: peer
type(ncclComm) :: comm
integer(cuda_stream_kind) :: stream

8.4. NCCL 组调用

本节包含用于开始和结束组的 NCCL 函数的接口,以便可以合并多个调用。

8.4.1. ncclGroupStart

此函数启动组调用。由于 CPU 间同步,后续对 NCCL 函数的所有调用都可能不会阻塞。

type(ncclResult) function ncclGroupStart()

8.4.2. ncclGroupEnd

此函数结束组调用。当自相应的 ncclGroupStart 调用以来的所有操作都已处理(但不一定完成)时,它会返回。

type(ncclResult) function ncclGroupEnd()

9. NVSHMEM 通信库 API

本节介绍 NVSHMEM 库的 Fortran 接口。NVSHMEM 是一个软件库,它为 NVIDIA GPU 集群实现了 OpenSHMEM 应用程序编程接口 (API)。OpenSHMEM 是一个社区标准、单边通信 API,它提供了一个分区全局地址空间 (PGAS) 并行编程模型。NVSHMEM 为分配对称内存提供了一个易于使用的主机端接口,该对称内存可以分布在通过 NVLink、PCIe 和 InfiniBand 互连的 NVIDIA GPU 集群中。NVSHMEM 通信函数可以从主机和设备代码访问。大多数运行时 API 例程都编写为 C void 函数,我们已将其 Fortran 包装器实现为子例程。

通过添加以下行,可以公开本章中描述的 NVSHMEM 接口和定义

use nvshmem

到您的程序单元。相同的模块用于主机和设备代码。在线程块或 warp 上运行的设备函数声明为 acc vector nohost 例程。其他的是 acc seq 例程。

除非提供了特定的 kind,否则接口中使用的普通 integer 类型表示 integer(4),而普通 real 类型表示 real(4)。

9.1. NVSHMEM 定义、设置、退出和查询函数

本节包含 NVSHMEM 库中使用的定义和数据类型,以及 NVSHMEM 初始化和访问 PE 并行环境的接口。

Fortran NVSHMEM 模块包含以下常量和派生类型定义

! These are not available to the user, internal only
! defines, from nvshmemx_api.h
#define INIT_HANDLE_BYTES 128

! defines, from nvshmem_constants.h
#define SYNC_SIZE 27648
! Constant Definitions
integer, parameter :: NVSHMEM_SYNC_VALUE = 0
integer, parameter :: NVSHMEM_SYNC_SIZE = (2 * SYNC_SIZE)
integer, parameter :: NVSHMEM_BARRIER_SYNC_SIZE = (2 * SYNC_SIZE)
integer, parameter :: NVSHMEM_BCAST_SYNC_SIZE = SYNC_SIZE
integer, parameter :: NVSHMEM_REDUCE_SYNC_SIZE = SYNC_SIZE
integer, parameter :: NVSHMEM_REDUCE_MIN_WRKDATA_SIZE = SYNC_SIZE
integer, parameter :: NVSHMEM_COLLECT_SYNC_SIZE = SYNC_SIZE
integer, parameter :: NVSHMEM_ALLTOALL_SYNC_SIZE = SYNC_SIZE

integer, parameter :: NVSHMEMX_CMP_EQ = 0
integer, parameter :: NVSHMEMX_CMP_NE = 1
integer, parameter :: NVSHMEMX_CMP_GT = 2
integer, parameter :: NVSHMEMX_CMP_LE = 3
integer, parameter :: NVSHMEMX_CMP_LT = 4
integer, parameter :: NVSHMEMX_CMP_GE = 5

integer, parameter :: NVSHMEMX_THREAD_SINGLE     = 0
integer, parameter :: NVSHMEMX_THREAD_FUNNELED   = 1
integer, parameter :: NVSHMEMX_THREAD_SERIALIZED = 2
integer, parameter :: NVSHMEMX_THREAD_MULTIPLE   = 3

integer, parameter :: NVSHMEM_TEAM_INVALID = -1
integer, parameter :: NVSHMEM_TEAM_WORLD   = 0
integer, parameter :: NVSHMEM_TEAM_SHARED  = 1
integer, parameter :: NVSHMEMX_TEAM_NODE   = 2

integer, parameter :: NVSHMEMX_INIT_THREAD_PES    = 1
integer, parameter :: NVSHMEMX_INIT_WITH_MPI_COMM = 2
integer, parameter :: NVSHMEMX_INIT_WITH_SHMEM    = 4
integer, parameter :: NVSHMEMX_INIT_WITH_HANDLE   = 8
! Types from nvshmemx_api.h
type, bind(c) :: nvshmemx_init_handle
  character(c_char) :: content(INIT_HANDLE_BYTES)
end type nvshmemx_init_handle
! Types from nvshmemx_api.h
type, bind(c) :: nvshmemx_init_attr_type
  integer(8)  heap_size
  integer(4)  num_threads
  integer(4)  n_pes
  integer(4)  my_pe
  type(c_ptr) mpi_comm
  type(nvshmemx_init_handle) handle
end type nvshmemx_init_attr_type
! Types from nvshmem_types.h
type, bind(c) :: nvshmem_team_config
  integer(c_int) :: num_contexts
end type nvshmem_team_config
! nvshmemx_status, from nvshmem_error.h
type, bind(c) :: nvshmemx_status
  integer(c_int) :: member
end type nvshmemx_status

type(nvshmemx_status), parameter :: &
  NVSHMEMX_SUCCESS = nvshmemx_status(0), &
  NVSHMEMX_ERROR_INVALID_VALUE = nvshmemx_status(1), &
  NVSHMEMX_ERROR_OUT_OF_MEMORY = nvshmemx_status(2), &
  NVSHMEMX_ERROR_NOT_SUPPORTED = nvshmemx_status(3), &
  NVSHMEMX_ERROR_SYMMETRY = nvshmemx_status(4), &
  NVSHMEMX_ERROR_GPU_NOT_SELECTED = nvshmemx_status(5), &
  NVSHMEMX_ERROR_COLLECTIVE_LAUNCH_FAILED = nvshmemx_status(6), &
  NVSHMEMX_ERROR_INTERNAL = nvshmemx_status(7)

9.1.1. nvshmem_init

此子例程分配和初始化 NVSHMEM 库使用的资源。

subroutine nvshmem_init()

9.1.2. nvshmemx_init_attr

此函数基于现有的 MPI 通信器初始化 NVSHMEM 库。由于 C 和 Fortran mpi_comm 对象不同,因此此函数具有与相应的 C 库入口点不同的参数列表。

type(nvshmemx_status) function nvshmemx_init_attr(flags, comm)
    integer(4) :: flags, comm

以下是使用 MPI 的此函数的示例

use nvshmem
type(nvshmemx_status) :: nvstat
. . .
! Setup MPI
call MPI_Init(ierror)
call MPI_Comm_rank(MPI_COMM_WORLD, my_rank, ierror)
call MPI_Comm_size(MPI_COMM_WORLD, nranks, ierror)
!
nvstat = nvshmemx_init_attr(NVSHMEMX_INIT_WITH_MPI_COMM, MPI_COMM_WORLD)

9.1.3. nvshmem_my_pe

此函数返回调用 PE 的 PE 编号,编号介于 0 和 npes-1 之间。

integer(4) function nvshmem_my_pe()

9.1.4. nvshmem_n_pes

此函数返回程序中运行的 PE 数量。

integer(4) function nvshmem_n_pes()

9.1.5. nvshmem_team_my_pe

此函数返回调用 PE 在指定 team 中的 PE 编号。

integer(4) function nvshmem_team_my_pe(team)
    integer(4) :: team

9.1.6. nvshmem_team_n_pes

此函数返回指定 team 中的 PE 数量。

integer(4) function nvshmem_team_n_pes(team)
    integer(4) :: team

9.1.7. nvshmem_team_get_config

此函数返回配置参数,如 config 参数中的掩码所述。

integer(4) function nvshmem_team_get_config(team, mask, config)
    integer(4) :: team
    integer(8) :: mask
    type(nvshmem_team_config) :: config

9.1.8. nvshmem_team_translate_pe

给定源 team、源 pe 和目标 team,此函数返回转换后的目标 pe。

integer(4) function nvshmem_team_translate_pe(src_team, src_pe, dest_team)
    integer(4) :: src_team, src_pe, dest_team

9.1.9. nvshmem_team_split_strided

此函数执行集体操作,并根据父 team 和父 team 中所需的切片(start、stride 和 size)创建一个新 team。

integer(4) function nvshmem_team_split_strided(parent_team, &
        start, stride, size, config, mask, new_team)
    integer(4) :: parent_team
    integer(4) :: start, stride, size
    type(nvshmem_team_config) :: config
    integer(8) :: mask
    integer(4) :: new_team

9.1.10. nvshmem_team_split_2d

此函数执行集体操作,并根据父 team 和 2D 空间的规范创建两个新 team。结果是两个 team,其中包含映射到 2D 空间的行和列的 PE。

integer(4) function nvshmem_team_split_2d(parent_team, &
        xrange, xaxis_config, xaxis_mask, xaxis_team, &
        yaxis_config, yaxis_mask, yaxis_team)
    integer(4) :: parent_team
    integer(4) :: xrange
    type(nvshmem_team_config) :: xaxis_config, yaxis_config
    integer(8) :: xaxis_mask, yaxis_mask
    integer(4), intent(out) :: xaxis_team, yaxis_team

9.1.11. nvshmem_team_destroy

此函数是一个集体操作,它销毁 team 并释放与其关联的资源。

integer(4) function nvshmem_team_destroy(team)
    integer(4) :: team

9.1.12. nvshmem_info_get_version

此子例程返回 NVSHMEM 库的主版本号和次版本号。

subroutine nvshmem_info_get_version(major, minor)
    integer(4) :: major, minor

9.1.13. nvshmem_info_get_name

此子例程返回库的供应商定义的名称字符串。

subroutine nvshmem_info_get_name(name)
    character*256, intent(out) :: name

9.1.14. nvshmem_finalize

此子例程释放资源并结束使用 nvshmem_init() 启动的程序的 NVSHMEM 部分。

subroutine nvshmem_finalize()

9.1.15. nvshmem_ptr

此函数返回一个本地地址,该地址可用于直接引用指定 PE 上的目标数据。函数 nvshmem_ptr 实现为 Fortran 泛型函数,可以接受任何数据类型,只要它是对称地址即可。

type(c_devptr) function nvshmem_ptr(dest, pe)
    ! dest can be of type integer, logical, real, complex, character,
    ! or a type(c_devptr)
    integer(4) :: pe

还支持以下特定函数

type(c_devptr) function nvshmem_ptri(dest, pe)
    integer :: dest ! Any kind and rank
    integer(4) :: pe
type(c_devptr) function nvshmem_ptrl(dest, pe)
    logical :: dest ! Any kind and rank
    integer(4) :: pe
type(c_devptr) function nvshmem_ptrr(dest, pe)
    real :: dest ! Any kind and rank
    integer(4) :: pe
type(c_devptr) function nvshmem_ptrc(dest, pe)
    complex :: dest ! Any kind and rank
    integer(4) :: pe
type(c_devptr) function nvshmem_ptrc1(dest, pe)
    character :: dest ! Any kind and rank
    integer(4) :: pe
type(c_devptr) function nvshmem_ptrcd(dest, pe)
    type(c_devptr) :: dest
    integer(4) :: pe

9.2. NVSHMEM 内存管理函数

本节包含用于管理对称堆的 NVSHMEM 函数的 Fortran 接口。

9.2.1. nvshmem_malloc

此函数从对称堆分配一个包含指定字节数的块。此例程是一个集体操作,需要所有 PE 的参与。

type(c_devptr) function nvshmem_malloc(size)
    integer(8) :: size  ! Size is in bytes

type(c_devptr) 类型的实体可以通过几种方式转换为 Fortran 数组。以下是一些示例

use nvshmem
! Contiguous will avoid some runtime checks
real(8), device, pointer, contiguous :: array(:)
. . .
call c_f_pointer(nvshmem_malloc(N*8), array, [N])
use nvshmem
! Cray Pointer
real(8), device :: array(N); pointer(pa,array)
. . .
pa = transfer(nvshmem_malloc(N*8), pa)

9.2.2. nvshmem_free

此子例程释放先前分配的对称数据块。

subroutine nvshmem_free(ptr)
    ! ptr can be of type(c_devptr), or other types if it was cast to a Fortran
    ! array using the techniques described in the nvshmem_malloc section.

9.2.3. nvshmem_align

此函数从对称堆分配一个块,该块具有由 alignment 参数指定的字节对齐方式。

type(c_devptr) function nvshmem_align(alignment, size)
    integer(8) :: alignment
    integer(8) :: size  ! Size is in bytes

9.2.4. nvshmem_calloc

此函数从对称堆分配一个包含指定字节数的块。此例程是一个集体操作,需要所有 PE 的参与。该空间也初始化为零。

type(c_devptr) function nvshmem_calloc(size)
    integer(8) :: size  ! Size is in bytes

9.2.5. nvshmemx_buffer_register

此函数向远程传输和 CUDA 注册给定的缓冲区,以便进行后续的 nvshmem 操作。作为第一个参数传递的地址可以是任何类型,具有主机或设备属性。

integer(4) function nvshmemx_buffer_register(addr, len)
    real(4) :: addr(*)  ! Any type is accepted
    integer(8) :: len   ! Size is in bytes

9.2.6. nvshmemx_buffer_unregister

此函数注销先前使用 nvshmemx_buffer_register 库函数注册的缓冲区。

integer(4) function nvshmemx_buffer_unregister(addr)
    real(4) :: addr(*)  ! Any type is accepted

9.2.7. nvshmemx_buffer_unregister_all

此子例程注销先前使用 nvshmemx_buffer_register 库函数注册的所有缓冲区。

subroutine nvshmemx_buffer_unregister_all()

9.3. NVSHMEM 远程内存访问函数

本节包含用于对对称数据对象执行读写操作的 NVSHMEM 函数的 Fortran 接口。CUDA C 库为每种 C 类型包含许多函数。我们已尝试将这些函数提炼成对 Fortran 程序员有用但不冗余的集合。此外,我们还提供了以下泛型接口,这些接口被重载以接受多种类型

  • nvshmem_put

  • nvshmem_p

  • nvshmem_iput

  • nvshmem_put_nbi

  • nvshmemx_put_block

  • nvshmemx_put_warp

  • nvshmem_get

  • nvshmem_g

  • nvshmem_iget

  • nvshmem_get_nbi

  • nvshmemx_get_block

  • nvshmemx_get_warp

这些函数中的许多函数在主机和设备上都可用。某些编程模型可能目前不支持设备上的泛型函数。某些函数仅在设备上可用(最值得注意的是,由整个块或整个 warp 执行的函数)。

9.3.1. nvshmem_put

此子例程在数据已从本地 PE 上的源数组复制出来后返回。子例程 nvshmem_put 被重载以接受许多不同的参数集。具体的名称和参数列表如下。

subroutine nvshmem_putmem(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_putmem_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int8_put(dest, source, nelems, pe)
    integer(1), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int8_put_on_stream(dest, source, nelems, pe, stream)
    integer(1), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int16_put(dest, source, nelems, pe)
    integer(2), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int16_put_on_stream(dest, source, nelems, pe, stream)
    integer(2), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int32_put(dest, source, nelems, pe)
    integer(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int32_put_on_stream(dest, source, nelems, pe, stream)
    integer(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int64_put(dest, source, nelems, pe)
    integer(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int64_put_on_stream(dest, source, nelems, pe, stream)
    integer(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_float_put(dest, source, nelems, pe)
    real(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_float_put_on_stream(dest, source, nelems, pe, stream)
    real(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_double_put(dest, source, nelems, pe)
    real(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_double_put_on_stream(dest, source, nelems, pe, stream)
    real(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_complex_put(dest, source, nelems, pe)
    complex(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_complex_put_on_stream(dest, source, nelems, pe, stream)
    complex(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_dcomplex_put(dest, source, nelems, pe)
    complex(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_dcomplex_put_on_stream(dest, source, nelems, pe, stream)
    complex(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream

以下 nvshmem put 子例程不是泛型 nvshmem_put 组的一部分,但为了灵活性和与 C 名称的兼容性而提供

subroutine nvshmem_put8(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put8_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_put16(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put16_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_put32(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put32_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_put64(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put64_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_put128(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put128_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream

9.3.2. nvshmem_p

此子例程在数据已从本地 PE 上的源数组复制出来后返回。子例程 nvshmem_p 被重载以接受许多不同的参数集。这些子例程可以从主机或设备调用,并且源通过值传递,并且应分别是驻留在主机或设备上的。具体的名称和参数列表如下。

subroutine nvshmem_int8_p(dest, source, nelems, pe)
    integer(1), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int8_p_on_stream(dest, source, nelems, pe, stream)
    integer(1), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int16_p(dest, source, nelems, pe)
    integer(2), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int16_p_on_stream(dest, source, nelems, pe, stream)
    integer(2), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int32_p(dest, source, nelems, pe)
    integer(4), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int32_p_on_stream(dest, source, nelems, pe, stream)
    integer(4), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int64_p(dest, source, nelems, pe)
    integer(8), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int64_p_on_stream(dest, source, nelems, pe, stream)
    integer(8), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_float_p(dest, source, nelems, pe)
    real(4), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_float_p_on_stream(dest, source, nelems, pe, stream)
    real(4), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_double_p(dest, source, nelems, pe)
    real(8), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_double_p_on_stream(dest, source, nelems, pe, stream)
    real(8), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream

9.3.3. nvshmem_iput

此子例程提供了一种将步幅数据元素复制到目标的方法。此子例程在数据已从本地 PE 上的源数组复制出来后返回。子例程 nvshmem_iput 被重载以接受许多不同的参数集。这些子例程可以从主机或设备调用。具体的名称和参数列表如下。

subroutine nvshmem_int8_iput(dest, source, dst, sst, nelems, pe)
    integer(1), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_int8_iput_on_stream(dest, source, dst, sst, nelems, pe, stream)
    integer(1), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int16_iput(dest, source, dst, sst, nelems, pe)
    integer(2), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_int16_iput_on_stream(dest, source, dst, sst, nelems, pe, stream)
    integer(2), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int32_iput(dest, source, dst, sst, nelems, pe)
    integer(4), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_int32_iput_on_stream(dest, source, dst, sst, nelems, pe, stream)
    integer(4), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int64_iput(dest, source, dst, sst, nelems, pe)
    integer(8), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_int64_iput_on_stream(dest, source, dst, sst, nelems, pe, stream)
    integer(8), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_float_iput(dest, source, dst, sst, nelems, pe)
    real(4), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_float_iput_on_stream(dest, source, dst, sst, nelems, pe, stream)
    real(4), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_double_iput(dest, source, dst, sst, nelems, pe)
    real(8), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_double_iput_on_stream(dest, source, dst, sst, nelems, pe, stream)
    real(8), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_complex_iput(dest, source, dst, sst, nelems, pe)
    complex(4), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_complex_iput_on_stream(dest, source, dst, sst, nelems, pe, stream)
    complex(4), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_dcomplex_iput(dest, source, dst, sst, nelems, pe)
    complex(8), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_dcomplex_iput_on_stream(dest, source, dst, sst, nelems, pe, stream)
    complex(8), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream

以下 nvshmem iput 子例程不是泛型 nvshmem_iput 组的一部分,但为了灵活性和与 C 名称的兼容性而提供

subroutine nvshmem_iput8(dest, source, dst, sst, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_iput8_on_stream(dest, source, dst, sst, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_iput16(dest, source, dst, sst, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_iput16_on_stream(dest, source, dst, sst, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_iput32(dest, source, dst, sst, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_iput32_on_stream(dest, source, dst, sst, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_iput64(dest, source, dst, sst, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_iput64_on_stream(dest, source, dst, sst, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_iput128(dest, source, dst, sst, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_iput128_on_stream(dest, source, dst, sst, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream

9.3.4. nvshmem_put_nbi

此子例程在启动 put 操作后返回。子例程 nvshmem_put_nbi 被重载以接受许多不同的参数集。这些子例程可以从主机或设备调用。具体的名称和参数列表如下。

subroutine nvshmem_int8_put_nbi(dest, source, nelems, pe)
    integer(1), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int8_put_nbi_on_stream(dest, source, nelems, pe, stream)
    integer(1), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int16_put_nbi(dest, source, nelems, pe)
    integer(2), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int16_put_nbi_on_stream(dest, source, nelems, pe, stream)
    integer(2), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int32_put_nbi(dest, source, nelems, pe)
    integer(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int32_put_nbi_on_stream(dest, source, nelems, pe, stream)
    integer(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int64_put_nbi(dest, source, nelems, pe)
    integer(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int64_put_nbi_on_stream(dest, source, nelems, pe, stream)
    integer(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_float_put_nbi(dest, source, nelems, pe)
    real(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_float_put_nbi_on_stream(dest, source, nelems, pe, stream)
    real(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_double_put_nbi(dest, source, nelems, pe)
    real(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_double_put_nbi_on_stream(dest, source, nelems, pe, stream)
    real(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_complex_put_nbi(dest, source, nelems, pe)
    complex(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_complex_put_nbi_on_stream(dest, source, nelems, pe, stream)
    complex(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_dcomplex_put_nbi(dest, source, nelems, pe)
    complex(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_dcomplex_put_nbi_on_stream(dest, source, nelems, pe, stream)
    complex(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream

以下 nvshmem put_nbi 子例程不是泛型 nvshmem_put_nbi 组的一部分,但为了灵活性和与 C 名称的兼容性而提供

subroutine nvshmem_put8_nbi(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put8_nbi_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_put16_nbi(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put16_nbi_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_put32_nbi(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put32_nbi_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_put64_nbi(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put64_nbi_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_put128_nbi(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put128_nbi_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream

9.3.5. nvshmemx_put_block

此子例程在数据已从本地 PE 上的源数组复制出来后返回。它仅在设备代码中可用。子例程 nvshmemx_put_block 被重载以接受许多不同的参数集。具体的名称和参数列表如下。

subroutine nvshmemx_putmem_block(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int8_put_block(dest, source, nelems, pe)
    integer(1), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int16_put_block(dest, source, nelems, pe)
    integer(2), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int32_put_block(dest, source, nelems, pe)
    integer(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int64_put_block(dest, source, nelems, pe)
    integer(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_fp16_put_block(dest, source, nelems, pe)
    real(2), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_float_put_block(dest, source, nelems, pe)
    real(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_double_put_block(dest, source, nelems, pe)
    real(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_complex_put_block(dest, source, nelems, pe)
    complex(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_dcomplex_put_block(dest, source, nelems, pe)
    complex(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe

以下 nvshmem put block 子例程不是泛型 nvshmemx_put_block 组的一部分,但为了灵活性和与 C 名称的兼容性而提供

subroutine nvshmemx_int_put_block(dest, source, nelems, pe)
    integer(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_long_put_block(dest, source, nelems, pe)
    integer(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put8_block(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put16_block(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put32_block(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put64_block(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put128_block(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe

9.3.6. nvshmemx_put_warp

此子例程在数据已从本地 PE 上的源数组复制出来后返回。它仅在设备代码中可用。子例程 nvshmemx_put_warp 被重载以接受许多不同的参数集。具体的名称和参数列表如下。

subroutine nvshmemx_putmem_warp(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int8_put_warp(dest, source, nelems, pe)
    integer(1), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int16_put_warp(dest, source, nelems, pe)
    integer(2), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int32_put_warp(dest, source, nelems, pe)
    integer(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int64_put_warp(dest, source, nelems, pe)
    integer(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_fp16_put_warp(dest, source, nelems, pe)
    real(2), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_float_put_warp(dest, source, nelems, pe)
    real(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_double_put_warp(dest, source, nelems, pe)
    real(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_complex_put_warp(dest, source, nelems, pe)
    complex(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_dcomplex_put_warp(dest, source, nelems, pe)
    complex(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe

以下 nvshmem put warp 子例程不是泛型 nvshmemx_put_warp 组的一部分,但为了灵活性和与 C 名称的兼容性而提供

subroutine nvshmemx_int_put_warp(dest, source, nelems, pe)
    integer(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_long_put_warp(dest, source, nelems, pe)
    integer(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put8_warp(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put16_warp(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put32_warp(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put64_warp(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_put128_warp(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe

9.3.7. nvshmem_get

此子例程在数据已从本地 PE 上的源数组复制出来后返回。子例程 nvshmem_get 被重载以接受许多不同的参数集。具体的名称和参数列表如下。

subroutine nvshmem_getmem(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_getmem_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int8_get(dest, source, nelems, pe)
    integer(1), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int8_get_on_stream(dest, source, nelems, pe, stream)
    integer(1), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int16_get(dest, source, nelems, pe)
    integer(2), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int16_get_on_stream(dest, source, nelems, pe, stream)
    integer(2), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int32_get(dest, source, nelems, pe)
    integer(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int32_get_on_stream(dest, source, nelems, pe, stream)
    integer(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int64_get(dest, source, nelems, pe)
    integer(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int64_get_on_stream(dest, source, nelems, pe, stream)
    integer(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_float_get(dest, source, nelems, pe)
    real(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_float_get_on_stream(dest, source, nelems, pe, stream)
    real(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_double_get(dest, source, nelems, pe)
    real(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_double_get_on_stream(dest, source, nelems, pe, stream)
    real(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_complex_get(dest, source, nelems, pe)
    complex(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_complex_get_on_stream(dest, source, nelems, pe, stream)
    complex(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_dcomplex_get(dest, source, nelems, pe)
    complex(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_dcomplex_get_on_stream(dest, source, nelems, pe, stream)
    complex(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream

以下 nvshmem get 子例程不是泛型 nvshmem_get 组的一部分,但为了灵活性和与 C 名称的兼容性而提供

subroutine nvshmem_get8(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get8_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_get16(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get16_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_get32(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get32_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_get64(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get64_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_get128(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get128_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream

9.3.8. nvshmem_g

此子例程在数据已从本地 PE 上的源数组复制出来后返回。子例程 nvshmem_g 被重载以接受许多不同的参数集。这些子例程可以从主机或设备调用,并且源通过值传递,并且应分别是驻留在主机或设备上的。具体的名称和参数列表如下。

subroutine nvshmem_int8_g(dest, source, nelems, pe)
    integer(1), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int8_g_on_stream(dest, source, nelems, pe, stream)
    integer(1), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int16_g(dest, source, nelems, pe)
    integer(2), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int16_g_on_stream(dest, source, nelems, pe, stream)
    integer(2), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int32_g(dest, source, nelems, pe)
    integer(4), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int32_g_on_stream(dest, source, nelems, pe, stream)
    integer(4), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int64_g(dest, source, nelems, pe)
    integer(8), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int64_g_on_stream(dest, source, nelems, pe, stream)
    integer(8), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_float_g(dest, source, nelems, pe)
    real(4), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_float_g_on_stream(dest, source, nelems, pe, stream)
    real(4), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_double_g(dest, source, nelems, pe)
    real(8), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_double_g_on_stream(dest, source, nelems, pe, stream)
    real(8), device :: dest(*), source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream

9.3.9. nvshmem_iget

此子例程提供了一种将步幅数据元素复制到目标的方法。此子例程在数据已从本地 PE 上的源数组复制出来后返回。子例程 nvshmem_iget 被重载以接受许多不同的参数集。这些子例程可以从主机或设备调用。具体的名称和参数列表如下。

subroutine nvshmem_int8_iget(dest, source, dst, sst, nelems, pe)
    integer(1), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_int8_iget_on_stream(dest, source, dst, sst, nelems, pe, stream)
    integer(1), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int16_iget(dest, source, dst, sst, nelems, pe)
    integer(2), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_int16_iget_on_stream(dest, source, dst, sst, nelems, pe, stream)
    integer(2), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int32_iget(dest, source, dst, sst, nelems, pe)
    integer(4), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_int32_iget_on_stream(dest, source, dst, sst, nelems, pe, stream)
    integer(4), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int64_iget(dest, source, dst, sst, nelems, pe)
    integer(8), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_int64_iget_on_stream(dest, source, dst, sst, nelems, pe, stream)
    integer(8), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_float_iget(dest, source, dst, sst, nelems, pe)
    real(4), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_float_iget_on_stream(dest, source, dst, sst, nelems, pe, stream)
    real(4), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_double_iget(dest, source, dst, sst, nelems, pe)
    real(8), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_double_iget_on_stream(dest, source, dst, sst, nelems, pe, stream)
    real(8), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_complex_iget(dest, source, dst, sst, nelems, pe)
    complex(4), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_complex_iget_on_stream(dest, source, dst, sst, nelems, pe, stream)
    complex(4), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_dcomplex_iget(dest, source, dst, sst, nelems, pe)
    complex(8), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_dcomplex_iget_on_stream(dest, source, dst, sst, nelems, pe, stream)
    complex(8), device :: dest(*), source(*)
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream

以下 nvshmem iget 子例程不是泛型 nvshmem_iget 组的一部分,但为了灵活性和与 C 名称的兼容性而提供

subroutine nvshmem_iget8(dest, source, dst, sst, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_iget8_on_stream(dest, source, dst, sst, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_iget16(dest, source, dst, sst, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_iget16_on_stream(dest, source, dst, sst, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_iget32(dest, source, dst, sst, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_iget32_on_stream(dest, source, dst, sst, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_iget64(dest, source, dst, sst, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_iget64_on_stream(dest, source, dst, sst, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_iget128(dest, source, dst, sst, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
subroutine nvshmemx_iget128_on_stream(dest, source, dst, sst, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: dst, sst, nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream

9.3.10. nvshmem_get_nbi

此子例程在启动 get 操作后返回。子例程 nvshmem_get_nbi 被重载以接受许多不同的参数集。这些子例程可以从主机或设备调用。具体的名称和参数列表如下。

subroutine nvshmem_int8_get_nbi(dest, source, nelems, pe)
    integer(1), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int8_get_nbi_on_stream(dest, source, nelems, pe, stream)
    integer(1), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int16_get_nbi(dest, source, nelems, pe)
    integer(2), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int16_get_nbi_on_stream(dest, source, nelems, pe, stream)
    integer(2), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int32_get_nbi(dest, source, nelems, pe)
    integer(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int32_get_nbi_on_stream(dest, source, nelems, pe, stream)
    integer(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int64_get_nbi(dest, source, nelems, pe)
    integer(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int64_get_nbi_on_stream(dest, source, nelems, pe, stream)
    integer(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_float_get_nbi(dest, source, nelems, pe)
    real(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_float_get_nbi_on_stream(dest, source, nelems, pe, stream)
    real(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_double_get_nbi(dest, source, nelems, pe)
    real(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_double_get_nbi_on_stream(dest, source, nelems, pe, stream)
    real(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_complex_get_nbi(dest, source, nelems, pe)
    complex(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_complex_get_nbi_on_stream(dest, source, nelems, pe, stream)
    complex(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_dcomplex_get_nbi(dest, source, nelems, pe)
    complex(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_dcomplex_get_nbi_on_stream(dest, source, nelems, pe, stream)
    complex(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream

以下 nvshmem get_nbi 子例程不是泛型 nvshmem_get_nbi 组的一部分,但为了灵活性和与 C 名称的兼容性而提供

subroutine nvshmem_get8_nbi(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get8_nbi_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_get16_nbi(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get16_nbi_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_get32_nbi(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get32_nbi_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_get64_nbi(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get64_nbi_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_get128_nbi(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get128_nbi_on_stream(dest, source, nelems, pe, stream)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
    integer(cuda_stream_kind) :: stream

9.3.11. nvshmemx_get_block

此子例程在数据已从本地 PE 上的源数组复制出来后返回。它仅在设备代码中可用。子例程 nvshmemx_get_block 被重载以接受许多不同的参数集。具体的名称和参数列表如下。

subroutine nvshmemx_getmem_block(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int8_get_block(dest, source, nelems, pe)
    integer(1), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int16_get_block(dest, source, nelems, pe)
    integer(2), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int32_get_block(dest, source, nelems, pe)
    integer(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int64_get_block(dest, source, nelems, pe)
    integer(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_fp16_get_block(dest, source, nelems, pe)
    real(2), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_float_get_block(dest, source, nelems, pe)
    real(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_double_get_block(dest, source, nelems, pe)
    real(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_complex_get_block(dest, source, nelems, pe)
    complex(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_dcomplex_get_block(dest, source, nelems, pe)
    complex(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe

以下 nvshmem get block 子例程不是泛型 nvshmemx_get_block 组的一部分,但为了灵活性和与 C 名称的兼容性而提供

subroutine nvshmemx_int_get_block(dest, source, nelems, pe)
    integer(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_long_get_block(dest, source, nelems, pe)
    integer(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get8_block(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get16_block(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get32_block(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get64_block(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get128_block(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe

9.3.12. nvshmemx_get_warp

此子例程在数据已从本地 PE 上的源数组复制出来后返回。它仅在设备代码中可用。子例程 nvshmemx_get_warp 被重载以接受许多不同的参数集。具体的名称和参数列表如下。

subroutine nvshmemx_getmem_warp(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int8_get_warp(dest, source, nelems, pe)
    integer(1), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int16_get_warp(dest, source, nelems, pe)
    integer(2), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int32_get_warp(dest, source, nelems, pe)
    integer(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_int64_get_warp(dest, source, nelems, pe)
    integer(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_fp16_get_warp(dest, source, nelems, pe)
    real(2), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_float_get_warp(dest, source, nelems, pe)
    real(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_double_get_warp(dest, source, nelems, pe)
    real(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_complex_get_warp(dest, source, nelems, pe)
    complex(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_dcomplex_get_warp(dest, source, nelems, pe)
    complex(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe

以下 nvshmem get warp 子例程不是泛型 nvshmemx_get_warp 组的一部分,但为了灵活性和与 C 名称的兼容性而提供

subroutine nvshmemx_int_get_warp(dest, source, nelems, pe)
    integer(4), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_long_get_warp(dest, source, nelems, pe)
    integer(8), device :: dest(*), source(*)
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get8_warp(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get16_warp(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get32_warp(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get64_warp(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe
subroutine nvshmemx_get128_warp(dest, source, nelems, pe)
    type(c_devptr) :: dest, source
    integer(8) :: nelems
    integer(4) :: pe

9.4. NVSHMEM 集体通信函数

本节包含用于在 PE 组内执行协调通信或同步操作的 NVSHMEM 函数的 Fortran 接口。本节可以进一步划分为 barrier 和 sync 函数、all-to-all、broadcast 和 collect 函数以及 reductions。

9.4.1. nvshmem_barrier, nvshmem_barrier_all

这些子例程对所有 (nvshmem_barrier_all) 或提供的 PE 子集 (nvshmem_barrier) 执行集体同步。在 CPU 上启动的排序 API 仅对从 CPU 发出的通信操作进行排序。使用 cudaDeviceSynchronize() 或类似方法来确保 GPU 操作已完成。子例程名称和参数列表如下。

subroutine nvshmem_barrier_all()
subroutine nvshmemx_barrier_all_on_stream(stream)
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_barrier(pe_start, pe_stride, pe_size, psync)
    integer(4) :: pe_start, pe_stride, pe_size
    integer(8), device :: psync(*)
subroutine nvshmemx_barrier_on_stream(pe_start, pe_stride, pe_size, psync, stream)
    integer(4) :: pe_start, pe_stride, pe_size
    integer(8), device :: psync(*)
    integer(cuda_stream_kind) :: stream

9.4.2. nvshmem_sync, nvshmem_sync_all

这些子例程对所有 (nvshmem_sync_all) 或提供的 PE 子集 (nvshmem_sync) 执行集体同步。与 barrier 例程不同,这些子例程仅确保先前发出的内存存储的完成和可见性,而不确保远程内存更新的完成。子例程名称和参数列表如下。

subroutine nvshmem_sync_all()
subroutine nvshmemx_sync_all_on_stream(stream)
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_sync(pe_start, pe_stride, pe_size, psync)
    integer(4) :: pe_start, pe_stride, pe_size
    integer(8), device :: psync(*)
subroutine nvshmemx_sync_on_stream(pe_start, pe_stride, pe_size, psync, stream)
    integer(4) :: pe_start, pe_stride, pe_size
    integer(8), device :: psync(*)
    integer(cuda_stream_kind) :: stream

9.4.3. nvshmem_alltoall

这些函数在 team 上执行集体 all-to-all 操作。从 nvshmem 版本 2.0 开始,集体操作的特定名称采用 team 参数并且特定于类型。这些函数与 team 中的所有其他 PE 交换指定数量的数据元素。Fortran 接口中支持以下泛型名称:nvshmem_alltoall、nvshmemx_alltoall_block 和 nvshmemx_alltoall_warp。nvshmem_alltoall 函数可从主机或设备调用,nvshmemx_alltoall_on_stream 函数仅可从主机调用,而 block 和 warp 函数仅可从设备调用。

integer function nvshmem_int8_alltoall(team, dest, source, nelems)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nelems

integer function nvshmem_int16_alltoall(team, dest, source, nelems)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nelems

integer function nvshmem_int32_alltoall(team, dest, source, nelems)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nelems

integer function nvshmem_int64_alltoall(team, dest, source, nelems)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nelems

integer function nvshmem_float_alltoall(team, dest, source, nelems)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nelems

integer function nvshmem_double_alltoall(team, dest, source, nelems)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nelems
integer function nvshmemx_int8_alltoall_on_stream(team, &
        dest, source, nelems, stream)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nelems
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int16_alltoall_on_stream(team, &
        dest, source, nelems, stream)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nelems
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int32_alltoall_on_stream(team, &
        dest, source, nelems, stream)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nelems
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int64_alltoall_on_stream(team, &
        dest, source, nelems, stream)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nelems
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_float_alltoall_on_stream(team, &
        dest, source, nelems, stream)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nelems
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_double_alltoall_on_stream(team, &
        dest, source, nelems, stream)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nelems
    integer(cuda_stream_kind) :: stream
integer function nvshmemx_int8_alltoall_block(team, dest, source, nelems)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_int16_alltoall_block(team, dest, source, nelems)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_int32_alltoall_block(team, dest, source, nelems)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_int64_alltoall_block(team, dest, source, nelems)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_float_alltoall_block(team, dest, source, nelems)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_double_alltoall_block(team, dest, source, nelems)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nelems
integer function nvshmemx_int8_alltoall_warp(team, dest, source, nelems)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_int16_alltoall_warp(team, dest, source, nelems)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_int32_alltoall_warp(team, dest, source, nelems)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_int64_alltoall_warp(team, dest, source, nelems)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_float_alltoall_warp(team, dest, source, nelems)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_double_alltoall_warp(team, dest, source, nelems)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nelems

9.4.4. nvshmem_broadcast

这些函数在一个团队上执行集体广播操作。从 nvshmem 2.0 版本开始,集体操作的特定名称接受一个团队参数并且特定于类型。这些函数将指定数量的源数据元素从指定的根发送到团队中的所有其他 PE。Fortran 接口支持以下通用名称:nvshmem_broadcast、nvshmemx_broadcast_block 和 nvshmemx_broadcast_warp。nvshmem_broadcast 函数可以从主机或设备调用,nvshmemx_broadcast_on_stream 函数只能从主机调用,而 block 和 warp 函数只能从设备调用。

integer function nvshmem_int8_broadcast(team, dest, source, nelems, pe_root)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root

integer function nvshmem_int16_broadcast(team, dest, source, nelems, pe_root)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root

integer function nvshmem_int32_broadcast(team, dest, source, nelems, pe_root)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root

integer function nvshmem_int64_broadcast(team, dest, source, nelems, pe_root)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root

integer function nvshmem_float_broadcast(team, dest, source, nelems, pe_root)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root

integer function nvshmem_double_broadcast(team, dest, source, nelems, pe_root)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root
integer function nvshmemx_int8_broadcast_on_stream(team, &
        dest, source, nelems, pe_root, stream)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int16_broadcast_on_stream(team, &
        dest, source, nelems, pe_root, stream)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int32_broadcast_on_stream(team, &
        dest, source, nelems, pe_root, stream)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int64_broadcast_on_stream(team, &
        dest, source, nelems, pe_root, stream)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_float_broadcast_on_stream(team, &
        dest, source, nelems, pe_root, stream)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_double_broadcast_on_stream(team, &
        dest, source, nelems, pe_root, stream)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root
    integer(cuda_stream_kind) :: stream
integer function nvshmemx_int8_broadcast_block(team, dest, source, nelems, pe_root)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root

integer function nvshmemx_int16_broadcast_block(team, dest, source, nelems, pe_root)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root

integer function nvshmemx_int32_broadcast_block(team, dest, source, nelems, pe_root)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root

integer function nvshmemx_int64_broadcast_block(team, dest, source, nelems, pe_root)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root

integer function nvshmemx_float_broadcast_block(team, dest, source, nelems, pe_root)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root

integer function nvshmemx_double_broadcast_block(team, dest, source, nelems, pe_root)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root
integer function nvshmemx_int8_broadcast_warp(team, dest, source, nelems, pe_root)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root

integer function nvshmemx_int16_broadcast_warp(team, dest, source, nelems, pe_root)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root

integer function nvshmemx_int32_broadcast_warp(team, dest, source, nelems, pe_root)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root

integer function nvshmemx_int64_broadcast_warp(team, dest, source, nelems, pe_root)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root

integer function nvshmemx_float_broadcast_warp(team, dest, source, nelems, pe_root)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root

integer function nvshmemx_double_broadcast_warp(team, dest, source, nelems, pe_root)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nelems
    integer(4) :: pe_root

9.4.5. nvshmem_collect

这些函数执行集体操作,将每个源数组中指定数量的元素连接到团队中每个 PE 的 dest 数组中。从 nvshmem 2.0 版本开始,集体操作的特定名称接受一个团队参数并且特定于类型。收集的数据按照团队中 PE 的顺序排列,并且 nelems 可能因 PE 而异。Fortran 接口支持以下通用名称:nvshmem_collect、nvshmemx_collect_block 和 nvshmemx_collect_warp。nvshmem_collect 函数可以从主机或设备调用,nvshmemx_collect_on_stream 函数只能从主机调用,而 block 和 warp 函数只能从设备调用。

integer function nvshmem_int8_collect(team, dest, source, nelems)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nelems

integer function nvshmem_int16_collect(team, dest, source, nelems)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nelems

integer function nvshmem_int32_collect(team, dest, source, nelems)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nelems

integer function nvshmem_int64_collect(team, dest, source, nelems)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nelems

integer function nvshmem_float_collect(team, dest, source, nelems)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nelems

integer function nvshmem_double_collect(team, dest, source, nelems)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nelems
integer function nvshmemx_int8_collect_on_stream(team, &
        dest, source, nelems, stream)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nelems
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int16_collect_on_stream(team, &
        dest, source, nelems, stream)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nelems
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int32_collect_on_stream(team, &
        dest, source, nelems, stream)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nelems
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int64_collect_on_stream(team, &
        dest, source, nelems, stream)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nelems
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_float_collect_on_stream(team, &
        dest, source, nelems, stream)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nelems
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_double_collect_on_stream(team, &
        dest, source, nelems, stream)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nelems
    integer(cuda_stream_kind) :: stream
integer function nvshmemx_int8_collect_block(team, dest, source, nelems)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_int16_collect_block(team, dest, source, nelems)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_int32_collect_block(team, dest, source, nelems)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_int64_collect_block(team, dest, source, nelems)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_float_collect_block(team, dest, source, nelems)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_double_collect_block(team, dest, source, nelems)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nelems
integer function nvshmemx_int8_collect_warp(team, dest, source, nelems)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_int16_collect_warp(team, dest, source, nelems)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_int32_collect_warp(team, dest, source, nelems)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_int64_collect_warp(team, dest, source, nelems)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_float_collect_warp(team, dest, source, nelems)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nelems

integer function nvshmemx_double_collect_warp(team, dest, source, nelems)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nelems

9.4.6. NVSHMEM 归约

本节包含 NVSHMEM 函数的 Fortran 接口,这些函数执行归约操作,归约操作是在一组 PE 中执行的同步操作,执行按位或算术运算,将一组值归约为一个值。

9.4.6.1. nvshmem_and_reduce

这些函数在一个团队中的一组 PE 上执行按位 AND 归约。从 nvshmem 2.0 版本开始,归约操作的特定名称接受一个团队参数并且特定于类型。Fortran 接口支持以下通用名称:nvshmem_and_reduce、nvshmemx_and_reduce_block 和 nvshmemx_and_reduce_warp。nvshmem_and_reduce 函数可以从主机或设备调用,nvshmemx_and_reduce_on_stream 函数只能从主机调用,而 block 和 warp 函数只能从设备调用。

integer function nvshmem_int8_and_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int16_and_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int32_and_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int64_and_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce
integer function nvshmemx_int8_and_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int16_and_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int32_and_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int64_and_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream
integer function nvshmemx_int8_and_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int16_and_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int32_and_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int64_and_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce
integer function nvshmemx_int8_and_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int16_and_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int32_and_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int64_and_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce

9.4.6.2. nvshmem_or_reduce

这些函数在一个团队中的一组 PE 上执行按位 OR 归约。从 nvshmem 2.0 版本开始,归约操作的特定名称接受一个团队参数并且特定于类型。Fortran 接口支持以下通用名称:nvshmem_or_reduce、nvshmemx_or_reduce_block 和 nvshmemx_or_reduce_warp。nvshmem_or_reduce 函数可以从主机或设备调用,nvshmemx_or_reduce_on_stream 函数只能从主机调用,而 block 和 warp 函数只能从设备调用。

integer function nvshmem_int8_or_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int16_or_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int32_or_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int64_or_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce
integer function nvshmemx_int8_or_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int16_or_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int32_or_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int64_or_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream
integer function nvshmemx_int8_or_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int16_or_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int32_or_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int64_or_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce
integer function nvshmemx_int8_or_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int16_or_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int32_or_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int64_or_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce

9.4.6.3. nvshmem_xor_reduce

这些函数在一个团队中的一组 PE 上执行按位 XOR 归约。从 nvshmem 2.0 版本开始,归约操作的特定名称接受一个团队参数并且特定于类型。Fortran 接口支持以下通用名称:nvshmem_xor_reduce、nvshmemx_xor_reduce_block 和 nvshmemx_xor_reduce_warp。nvshmem_xor_reduce 函数可以从主机或设备调用,nvshmemx_xor_reduce_on_stream 函数只能从主机调用,而 block 和 warp 函数只能从设备调用。

integer function nvshmem_int8_xor_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int16_xor_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int32_xor_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int64_xor_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce
integer function nvshmemx_int8_xor_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int16_xor_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int32_xor_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int64_xor_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream
integer function nvshmemx_int8_xor_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int16_xor_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int32_xor_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int64_xor_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce
integer function nvshmemx_int8_xor_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int16_xor_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int32_xor_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int64_xor_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce

9.4.6.4. nvshmem_max_reduce

这些函数在一个团队中的一组 PE 上执行最大值 (MAX) 归约。从 nvshmem 2.0 版本开始,归约操作的特定名称接受一个团队参数并且特定于类型。Fortran 接口支持以下通用名称:nvshmem_max_reduce、nvshmemx_max_reduce_block 和 nvshmemx_max_reduce_warp。nvshmem_max_reduce 函数可以从主机或设备调用,nvshmemx_max_reduce_on_stream 函数只能从主机调用,而 block 和 warp 函数只能从设备调用。

integer function nvshmem_int8_max_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int16_max_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int32_max_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int64_max_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_float_max_reduce(team, dest, source, nreduce)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_double_max_reduce(team, dest, source, nreduce)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nreduce
integer function nvshmemx_int8_max_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int16_max_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int32_max_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int64_max_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_float_max_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_double_max_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream
integer function nvshmemx_int8_max_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int16_max_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int32_max_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int64_max_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_float_max_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_double_max_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nreduce
integer function nvshmemx_int8_max_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int16_max_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int32_max_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int64_max_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_float_max_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_double_max_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nreduce

9.4.6.5. nvshmem_min_reduce

这些函数在一个团队中的一组 PE 上执行最小值 (MIN) 归约。从 nvshmem 2.0 版本开始,归约操作的特定名称接受一个团队参数并且特定于类型。Fortran 接口支持以下通用名称:nvshmem_min_reduce、nvshmemx_min_reduce_block 和 nvshmemx_min_reduce_warp。nvshmem_min_reduce 函数可以从主机或设备调用,nvshmemx_min_reduce_on_stream 函数只能从主机调用,而 block 和 warp 函数只能从设备调用。

integer function nvshmem_int8_min_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int16_min_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int32_min_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int64_min_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_float_min_reduce(team, dest, source, nreduce)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_double_min_reduce(team, dest, source, nreduce)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nreduce
integer function nvshmemx_int8_min_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int16_min_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int32_min_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int64_min_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_float_min_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_double_min_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream
integer function nvshmemx_int8_min_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int16_min_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int32_min_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int64_min_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_float_min_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_double_min_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nreduce
integer function nvshmemx_int8_min_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int16_min_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int32_min_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int64_min_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_float_min_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_double_min_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nreduce

9.4.6.6. nvshmem_sum_reduce

这些函数在一个团队中的一组 PE 上执行求和 (SUM) 归约。从 nvshmem 2.0 版本开始,归约操作的特定名称接受一个团队参数并且特定于类型。Fortran 接口支持以下通用名称:nvshmem_sum_reduce、nvshmemx_sum_reduce_block 和 nvshmemx_sum_reduce_warp。nvshmem_sum_reduce 函数可以从主机或设备调用,nvshmemx_sum_reduce_on_stream 函数只能从主机调用,而 block 和 warp 函数只能从设备调用。

integer function nvshmem_int8_sum_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int16_sum_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int32_sum_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int64_sum_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_float_sum_reduce(team, dest, source, nreduce)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_double_sum_reduce(team, dest, source, nreduce)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nreduce
integer function nvshmemx_int8_sum_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int16_sum_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int32_sum_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int64_sum_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_float_sum_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_double_sum_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream
integer function nvshmemx_int8_sum_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int16_sum_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int32_sum_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int64_sum_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_float_sum_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_double_sum_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nreduce
integer function nvshmemx_int8_sum_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int16_sum_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int32_sum_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int64_sum_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_float_sum_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_double_sum_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nreduce

9.4.6.7. nvshmem_prod_reduce

这些函数在一个团队中的一组 PE 上执行乘积归约。从 nvshmem 2.0 版本开始,归约操作的特定名称接受一个团队参数并且特定于类型。Fortran 接口支持以下通用名称:nvshmem_prod_reduce、nvshmemx_prod_reduce_block 和 nvshmemx_prod_reduce_warp。nvshmem_prod_reduce 函数可以从主机或设备调用,nvshmemx_prod_reduce_on_stream 函数只能从主机调用,而 block 和 warp 函数只能从设备调用。

integer function nvshmem_int8_prod_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int16_prod_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int32_prod_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_int64_prod_reduce(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_float_prod_reduce(team, dest, source, nreduce)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmem_double_prod_reduce(team, dest, source, nreduce)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nreduce
integer function nvshmemx_int8_prod_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int16_prod_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int32_prod_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_int64_prod_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_float_prod_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream

integer function nvshmemx_double_prod_reduce_on_stream(team, &
        dest, source, nreduce, stream)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nreduce
    integer(cuda_stream_kind) :: stream
integer function nvshmemx_int8_prod_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int16_prod_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int32_prod_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int64_prod_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_float_prod_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_double_prod_reduce_block(team, dest, source, nreduce)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nreduce
integer function nvshmemx_int8_prod_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(1), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int16_prod_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(2), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int32_prod_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_int64_prod_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    integer(8), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_float_prod_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    real(4), device :: dest, source
    integer(8) :: nreduce

integer function nvshmemx_double_prod_reduce_warp(team, dest, source, nreduce)
    integer(4) :: team
    real(8), device :: dest, source
    integer(8) :: nreduce

9.5. NVSHMEM 点对点同步函数

本节包含 NVSHMEM 函数的 Fortran 接口,这些接口提供了一种机制,用于基于对称内存中的值在两个 PE 之间进行同步。

9.5.1. nvshmem_wait_until

此子例程会阻塞,直到调用 PE 上的对称数据对象中包含的值满足比较运算符和比较值指定的条件。子例程 nvshmem_wait_until 已重载,可以接受多组不同的参数。具体名称和参数列表如下。

subroutine nvshmem_int32_wait_until(ivar, cmp, value)
    integer(4), device :: ivar
    integer(4) :: cmp, value
subroutine nvshmemx_int32_wait_until_on_stream(ivar, cmp, value, stream)
    integer(4), device :: ivar
    integer(4) :: cmp, value
    integer(cuda_stream_kind) :: stream
subroutine nvshmem_int64_wait_until(ivar, cmp, value)
    integer(8), device :: ivar
    integer(4) :: cmp
    integer(8) :: value
subroutine nvshmemx_int64_wait_until_on_stream(ivar, cmp, value, stream)
    integer(8), device :: ivar
    integer(4) :: cmp
    integer(8) :: value
    integer(cuda_stream_kind) :: stream

9.6. NVSHMEM 内存排序函数

本节包含 NVSHMEM 函数的 Fortran 接口,这些接口提供机制以确保 NVSHMEM 操作的排序和/或完成交付。

9.6.1. nvshmem_fence

此子例程确保对称数据对象上操作交付的顺序。

subroutine nvshmem_fence()

9.6.2. nvshmem_quiet

这些子例程确保完成调用 PE 发出的对称数据对象上的所有操作。

subroutine nvshmem_quiet()
subroutine nvshmemx_quiet_on_stream(stream)
    integer(cuda_stream_kind) :: stream

10. NVTX 性能分析库 API

本章介绍 NVIDIA 工具扩展 (NVTX) 库的 Fortran 接口。NVTX 是一组函数,开发人员可以使用这些函数向工具提供附加信息,例如 NVIDIA 的 Nsight Systems 性能分析工具。NVTX 函数可以从主机代码访问,但在标记和查看应用程序主机和设备部分的时间跨度(范围)时非常有用。

通过添加以下行,可以公开本章中描述的 NVTX 接口和定义

use nvtx

到您的程序单元。此模块的一个版本过去已通过其他方式提供,但本章档介绍了现在包含在 NVIDIA HPC SDK 中的 Fortran 模块。由于我们的目标是 NVTX v3 API(一个仅包含头文件的 C 库),因此我们实例化了可从 Fortran 调用的包装器,并在库 libnvhpcwrapnvtx.[a|so] 中提供这些包装器;链接需要开发人员将 -cudalib=nvtx 添加到其链接行,或者显式添加某种形式的 -lnvhpcwrapnvtx

本章分为三个部分。第一部分介绍以前可用的传统 Fortran NVTX 接口。第二部分介绍 NVTX v3 API 现在支持的高级函数。第三部分介绍了一种利用 nvfortran -Minstrument 选项在子程序入口和出口自动插入 NVTX 范围的方法。

除非提供了特定的 kind,否则接口中使用的普通整数类型意味着 integer(4)。

10.1. NVTX 基本工具 API

本节介绍 NVIDIA 工具扩展 (NVTX) 库的最基本 Fortran 接口。这些接口最初在博客文章中和通过公开可用的源代码存储库定义。最简单的接口只是推送和弹出用户标记的嵌套时间范围。

StartRange/EndRange 名称最初为了易于使用而从高级 RangeStart/RangeEnd 转换而来。这两种类型都可以在同一个程序中使用。

10.1.1. nvtxStartRange

此子例程使用 NVTX 库开始一个简单的标记时间跨度范围。icolor 参数是可选的,并将映射到多种预定义颜色之一。范围可以嵌套。

subroutine nvtxStartRange( label, icolor )
  character(len=*) :: label
  integer, optional :: icolor

10.1.2. nvtxEndRange

此子例程终止由 nvtxStartRange 启动的简单标记时间跨度范围。它不接受任何参数。

subroutine nvtxEndRange()

10.2. NVTX 高级工具 API

本节介绍 NVIDIA 工具扩展 (NVTX) 库的高级 Fortran 接口,这些接口针对 NVTX v3 API。

10.2.1. NVTX 定义和派生类型

本节包含 NVIDIA 工具扩展 (NVTX) 库 v3 API 的高级 Fortran 接口中使用的定义和数据类型。

! Parameters
integer, parameter :: NVTX_VERSION = 3
integer, parameter :: NVTX_EVENT_ATTRIB_STRUCT_SIZE = 48
! NVTX Status
enum, bind(C)
    enumerator :: NVTX_SUCCESS = 0
    enumerator :: NVTX_FAIL = 1
    enumerator :: NVTX_ERR_INIT_LOAD_PROPERTY = 2
    enumerator :: NVTX_ERR_INIT_ACCESS_LIBRARY = 3
    enumerator :: NVTX_ERR_INIT_LOAD_LIBRARY = 4
    enumerator :: NVTX_ERR_INIT_MISSING_LIBRARY_ENTRY_POINT = 5
    enumerator :: NVTX_ERR_INIT_FAILED_LIBRARY_ENTRY_POINT = 6
    enumerator :: NVTX_ERR_NO_INJECTION_LIBRARY_AVAILABLE = 7
end enum
! nvtxColorType_t, from nvToolsExt.h
type, bind(c) :: nvtxColorType
  integer(4) :: type
end type
type(nvtxColorType), parameter :: &
    NVTX_COLOR_UNKNOWN  = nvtxColorType(0), &
    NVTX_COLOR_ARGB     = nvtxColorType(1)
! nvtxMessageType_t, from nvToolsExt.h
type, bind(c) :: nvtxMessageType
  integer(4) :: type
end type
type(nvtxMessageType), parameter :: &
  NVTX_MESSAGE_UNKNOWN          = nvtxMessageType(0), &
  NVTX_MESSAGE_TYPE_ASCII       = nvtxMessageType(1), &
  NVTX_MESSAGE_TYPE_UNICODE     = nvtxMessageType(2), &
  NVTX_MESSAGE_TYPE_REGISTERED  = nvtxMessageType(3)
! nvtxPayloadType_t, from nvToolsExt.h
type, bind(c) :: nvtxPayloadType
  integer(4) :: type
end type
type(nvtxPayloadType), parameter :: &
  NVTX_PAYLOAD_UNKNOWN             = nvtxPayloadType(0), &
  NVTX_PAYLOAD_TYPE_UNSIGNED_INT64 = nvtxPayloadType(1), &
  NVTX_PAYLOAD_TYPE_INT64          = nvtxPayloadType(2), &
  NVTX_PAYLOAD_TYPE_DOUBLE         = nvtxPayloadType(3), &
  NVTX_PAYLOAD_TYPE_UNSIGNED_INT32 = nvtxPayloadType(4), &
  NVTX_PAYLOAD_TYPE_INT32          = nvtxPayloadType(5), &
  NVTX_PAYLOAD_TYPE_FLOAT          = nvtxPayloadType(6)
! Something just for Fortran ease of use, C compat.
! The Fortran structure is bigger, but the first 48 bytes are the same
! Making it allocatable means it will get deallocated properly
type nvtxFtnStringType
  character(1), allocatable :: chars(:)
end type
! nvtxEventAttributes_v2, from nvToolsExt.h
type, bind(C):: nvtxEventAttributes
  integer(C_INT16_T)      :: version = NVTX_VERSION
  integer(C_INT16_T)      :: size = NVTX_EVENT_ATTRIB_STRUCT_SIZE
  integer(C_INT)          :: category = 0
  type(nvtxColorType)     :: colorType = NVTX_COLOR_ARGB
  integer(C_INT)          :: color = z'ffffffff'
  type(nvtxPayloadType)   :: payloadType = NVTX_PAYLOAD_UNKNOWN
  integer(C_INT)          :: reserved0
  integer(C_INT64_T)      :: payload  ! union uint,int,double
  type(nvtxMessageType)   :: messageType = NVTX_MESSAGE_TYPE_ASCII
  type(nvtxFtnStringType) :: message  ! ascii char
end type
! This module provides a type constructor for the nvtxEventAttributes type.
! For example:
! event = nvtxEventAttributes(message, color)
! message can be a Fortran character string, or
! an nvtx registered string.
! color is an optional argument, integer(C_INT), assigned to
! the color field
type nvtxRangeId
  integer(8) :: id
end type
type nvtxDomainHandle
  type(C_PTR) :: handle
end type
type nvtxStringHandle
  type(C_PTR) :: handle
end type

10.2.2. nvtxInitialize

此子例程强制 NVTX 库初始化。它可用于移动初始化开销以进行计时。它不接受任何参数。

subroutine nvtxInitialize()

10.2.3. nvtxDomainCreate

此函数创建一个新的命名 NVTX 域。每个域维护其自身的推送和弹出堆栈。

function nvtxDomainCreate(message) result(domain)
   character(len=*) :: message
   type(nvtxDomainHandle) :: domain

10.2.4. nvtxDomainDestroy

此子例程销毁一个 NVTX 域。

subroutine nvtxDomainDestroy(domain)
   type(nvtxDomainHandle) :: domain

10.2.5. nvtxDomainRegisterString

此函数向 NVTX 注册一个不可变字符串,用于 type(eventAttributes) 消息字段。

function nvtxDomainRegisterString(domain, message) &
  result(stringHandle)
  type(nvtxDomainHandle) :: domain
  character(len=*) :: message
  type(nvtxStringHandle) :: stringHandle

使用此模块中定义的重载赋值,用户可以使用以下两个语句启用注册的字符串

event%message = nvtxDomainRegisterString(domain, "Str 1")
event%messageType = NVTX_MESSAGE_TYPE_REGISTERED

也可以通过将注册的字符串传递给类型构造函数以及可选颜色来初始化 type(eventAttributes) 变量

regstr = nvtxDomainRegisterString(domain, "Str 2")
  event = nvtxEventAttributes(regstr, icolor)

10.2.6. nvtxDomainNameCategory

此子例程允许用户为特定于域的类别 ID 分配一个名称。

subroutine nvtxDomainNameCategory(domain, category, name)
  type(nvtxDomainHandle) :: domain
  integer(4) :: category
  character(len=*) :: name

10.2.7. nvtxNameCategory

此子例程允许用户为类别 ID 分配一个名称。

subroutine nvtxNameCategory(category, name)
  integer(4) :: category
  character(len=*) :: name

10.2.8. nvtxDomainMarkEx

此子例程在应用程序中标记一个瞬时事件,可以完全控制 NVTX 域和事件属性。

subroutine nvtxDomainMarkEx(domain, event)
  type(nvtxDomainHandle) :: domain
  type(nvtxEventAttributes) :: event

10.2.9. nvtxMarkEx

此子例程在应用程序中标记一个瞬时事件,并带有用户提供的 NVTX 事件属性。

subroutine nvtxMarkEx(event)
  type(nvtxEventAttributes) :: event

10.2.10. nvtxMark

此子例程在应用程序中标记一个瞬时事件,并带有用户提供的消息。

subroutine nvtxMark(message)
  character(len=*) :: message

10.2.11. nvtxDomainRangeStartEx

此函数在应用程序中启动一个进程范围,可以完全控制 NVTX 域和事件属性,并返回唯一的范围 ID。

function nvtxDomainRangeStartEx(domain, event) result(id)
  type(nvtxDomainHandle) :: domain
  type(nvtxEventAttributes) :: event
  type(nvtxRangeId) :: id

10.2.12. nvtxRangeStartEx

此函数在应用程序中启动一个进程范围,并带有用户提供的 NVTX 事件属性,并返回唯一的范围 ID。

function nvtxRangeStartEx(event) result(id)
  type(nvtxEventAttributes) :: event
  type(nvtxRangeId) :: id

10.2.13. nvtxRangeStart

此函数在应用程序中启动一个进程范围,并带有用户提供的消息,并返回唯一的范围 ID。

function nvtxRangeStart(message) result(id)
  character(len=*) :: message
  type(nvtxRangeId) :: id

10.2.14. nvtxDomainRangeEnd

此子例程结束应用程序中的进程范围。参数是先前调用 nvtxDomainRangeStartEx 中的域和范围 ID。

subroutine nvtxDomainRangeEnd(domain, id)
  type(nvtxDomainHandle) :: domain
  type(nvtxRangeId) :: id

10.2.15. nvtxRangeEnd

此子例程结束应用程序中的进程范围。参数是从先前调用任何 nvtxRangeStart 函数返回的范围 ID。

subroutine nvtxRangeEnd(id)
  type(nvtxRangeId) :: id

10.2.16. nvtxDomainRangePushEx

此函数在应用程序中启动一个嵌套线程范围,可以完全控制 NVTX 域和事件属性,并返回嵌套范围级别。

function nvtxDomainRangePushEx(domain, event) result(ilvl)
  type(nvtxDomainHandle) :: domain
  type(nvtxEventAttributes) :: event
  integer(4) :: ilvl

10.2.17. nvtxRangePushEx

此函数在应用程序中启动一个嵌套线程范围,并带有用户提供的事件属性,并返回嵌套范围级别。

function nvtxRangePushEx(event) result(ilvl)
  type(nvtxEventAttributes) :: event
  integer(4) :: ilvl

10.2.18. nvtxRangePush

此函数在应用程序中启动一个嵌套范围,并带有用户提供的消息,并返回正在启动的范围级别。

function nvtxRangePush(message) result(ilvl)
  character(len=*) :: message
  integer(4) :: ilvl

10.2.19. nvtxDomainRangePop

此函数结束应用程序中特定域内的嵌套线程范围。

function nvtxDomainRangePop(domain) result(ilvl)
  type(nvtxDomainHandle) :: domain
  integer(4) :: ilvl

10.2.20. nvtxRangePop

此函数结束应用程序中的嵌套线程范围,并返回正在结束的范围级别。

function nvtxRangePop() result(ilvl)
  integer(4) :: ilvl

10.3. NVTX 自动Instrumentation

本节介绍一种在不进行源代码更改的情况下自动将 NVIDIA 工具扩展 (NVTX) 范围插入到代码中的方法。此方法仅在 Linux 系统上受支持。

第一步是确定要查看 NVTX 标签的源文件。在构建过程中,为这些文件添加以下编译器选项

-Minstrument

此标准编译器选项指示编译器在生成的代码中插入两个调用:在子程序入口处,它将插入对 __cyg_profile_func_enter() 的调用,在子程序出口处,它将插入对 __cyg_profile_func_exit() 的调用。这些入口点旨在由性能分析工具提供。编译器插入到这些函数中的一个重要输入参数是函数地址。

下一步,为了获得最佳用户体验,请使用以下选项链接您的可执行文件

-traceback  -lnvhpcwrapnvtx

或者,也可以

-fPIC  -Wl,-export-dynamic  -lnvhpcwrapnvtx

这些选项将使运行时能够通过 dladdr() 系统调用将函数或子例程地址转换为符号。如果没有这些选项,标签将包含十六进制的子程序单元地址,这很有用,但确实需要一些其他手动处理步骤来确定关联的符号名称。

与所有 NVTX instrumentation 方法一样,您需要在运行时启用 NVTX API 调用的处理。使用 Nsight Systems 启用 NVTX 的一个示例是使用

nsys profile --trace=nvtx

这将导致 NVTX 时间跨度范围显示在 Nsight 时间轴上。目前,

--trace=nvtx

默认情况下已设置,因此只需指定

nsys profile ./a.out

将为您提供 NVTX 注释以及 CUDA 跟踪。

11. NVIDIA 通信抽象库 (CAL) API

本节介绍 CAL 库的 Fortran 接口。此库包含少量函数,这些函数与其他多处理器库结合使用,用于初始化用于处理分布式矩阵和数组的通信层。

通过添加以下行,可以在主机代码中公开本章中描述的 CAL 接口和定义

use nvf_cal_comm

到您的程序单元,但由于模块定义也在此文档的其他模块中使用,因此建议您通过更高级别的模块访问它们,例如

use cublasMp

use cusolverMp

.

11.1. CAL API

本节介绍 CAL 模块中定义的参数和派生类型。

! Definitions from cal.h
integer, parameter :: CAL_VER_MAJOR = 0
integer, parameter :: CAL_VER_MINOR = 4
integer, parameter :: CAL_VER_PATCH = 2
integer, parameter :: CAL_VER_BUILD = 0
integer, parameter :: CAL_VERSION = &
        (CAL_VER_MAJOR * 1000 + CAL_VER_MINOR * 100 + CAL_VER_PATCH)
enum, bind(c)
    enumerator :: CAL_OK = 0                       ! Success
    enumerator :: CAL_ERROR_INPROGRESS = 1         ! Request is in progress
    enumerator :: CAL_ERROR = 2                    ! Generic error
    enumerator :: CAL_ERROR_INVALID_PARAMETER = 3  ! Invalid parameter to the interface function.
    enumerator :: CAL_ERROR_INTERNAL = 4           ! Internal error
    enumerator :: CAL_ERROR_CUDA = 5               ! Error in CUDA runtime/driver API
    enumerator :: CAL_ERROR_UCC = 6                ! Error in UCC call
    enumerator :: CAL_ERROR_NOT_SUPPORTED = 7      ! Requested configuration not supported
end enum
! Types from cal.h
    TYPE cal_comm
      TYPE(C_PTR) :: handle
    END TYPE cal_comm

11.1.1. cal_comm_create_mpi

CAL 是 cublasMp 和其他多处理器库使用的通信库。它使用 MPI 进行初始化以及可能的其他用途。这是一个 Fortran 提供的便利函数,用于初始化 cal 通信器。由于依赖于 MPI,因此某些 cal Fortran 包装器的源代码随 NVHPC 软件包一起提供,并且可以使用应用程序中使用的 MPI 头文件进行构建。我们提供的版本适用于 NVHPC 软件包中捆绑的默认 MPI。此函数输出的 cal 通信器派生类型是 cublasMpGridCreate()、 cusolverMpCreateDeviceGrid() 和类似函数的输入。

integer(4) function cal_comm_create_mpi(mpi_comm, &
      rank, nranks, local_device, comm)
  integer(4), intent(in) :: mpi_comm, rank, nranks, local_device
  type(cal_comm), intent(out) :: comm

11.1.2. cal_comm_destroy

此函数销毁 cal_comm 数据结构并释放与其关联的资源。

integer(4) function cal_comm_destroy(comm)
  type(cal_comm) :: comm

11.1.3. cal_stream_sync

此函数会阻塞调用线程,直到指定 stream 中所有未完成的设备操作(包括 cal 操作)完成。

integer(4) function cal_stream_sync(comm, stream)
  type(cal_comm) :: comm
  integer(cuda_stream_kind) :: stream

11.1.4. cal_comm_barrier

此函数同步 cal 通信器中所有进程的流,基本上是全对全同步。

integer(4) function cal_comm_barrier(comm, stream)
  type(cal_comm) :: comm
  integer(cuda_stream_kind) :: stream

11.1.5. cal_comm_get_rank

此函数返回 CAL 通信器中调用线程的 rank。

integer(4) function cal_comm_get_rank(comm, rank)
  type(cal_comm) :: comm
  integer(4) :: rank

11.1.6. cal_comm_get_size

此函数返回 CAL 通信器的大小。

integer(4) function cal_comm_get_size(comm, size)
  type(cal_comm) :: comm
  integer(4) :: size

12. 示例

本节包含带有源代码的示例。

12.1. 从 OpenACC 主机代码使用 cuBLAS

此示例演示了如何从 OpenACC 数据区域使用 cublas 模块、cublasHandle 类型和多种形式的 blas 调用。

简单的 OpenACC BLAS 测试

program testcublas
! compile with pgfortran -ta=tesla -cudalib=cublas -cuda testcublas.f90
call testcu1(1000)
call testcu2(1000)
end
!
subroutine testcu1(n)
use openacc
use cublas
integer :: a(n), b(n)
type(cublasHandle) :: h
istat = cublasCreate(h)
! Force OpenACC kernels and cuBLAS to use the OpenACC stream.
istat = cublasSetStream(h, acc_get_cuda_stream(acc_async_sync))
!$acc data copyout(a, b)
!$acc kernels
a = 1
b = 2
!$acc end kernels
! No host_data, we are lexically inside a data region
! sswap will accept any kind(4) data type
call sswap(n, a, 1, b, 1)
call cublasSswap(n, a, 1, b, 1)
!$acc end data
if (all(a.eq.1).and.all(b.eq.2)) then
  print *,"Test PASSED"
else
  print *,"Test FAILED"
endif
end
!
subroutine testcu2(n)
use openacc
use cublas
real(8) :: a(n), b(n)
a = 1.0d0
b = 2.0d0
!$acc data copy(a, b)
!$acc host_data use_device(a,b)
call dswap(n, a, 1, b, 1)
call cublasDswap(n, a, 1, b, 1)
!$acc end host_data
!$acc end data
if (all(a.eq.1.0d0).and.all(b.eq.2.0d0)) then
  print *,"Test PASSED"
else
  print *,"Test FAILED"
endif
end

CUBLASXT BLAS 测试

此示例演示了 cublasxt 模块的使用

program testcublasxt
call testxt1(1000)
call testxt2(1000)
end
!
subroutine testxt1(n)
use cublasxt
real(4) :: a(n,n), b(n,n), c(n,n), alpha, beta
type(cublasXtHandle) :: h
integer ndevices(1)
a = 1.0
b = 2.0
c = -1.0
alpha = 1.0
beta = 0.0
istat = cublasXtCreate(h)
if (istat .ne. CUBLAS_STATUS_SUCCESS) print *,istat
ndevices(1) = 0
istat = cublasXtDeviceSelect(h, 1, ndevices)
if (istat .ne. CUBLAS_STATUS_SUCCESS) print *,istat
istat = cublasXtSgemm(h, CUBLAS_OP_N, CUBLAS_OP_N, &
                      n, n, n, &
                      alpha, A, n, B, n, beta, C, n)
if (istat .ne. CUBLAS_STATUS_SUCCESS) print *,istat
istat = cublasXtDestroy(h)
if (istat .ne. CUBLAS_STATUS_SUCCESS) print *,istat
if (all(c.eq.2.0*n)) then
  print *,"Test PASSED"
else
  print *,"Test FAILED"
endif
print *,c(1,1),c(n,n)
end
!
subroutine testxt2(n)
use cublasxt
real(8) :: a(n,n), b(n,n), c(n,n), alpha, beta
type(cublasXtHandle) :: h
integer ndevices(1)
a = 1.0d0
b = 2.0d0
c = -1.0d0
alpha = 1.0d0
beta = 0.0
istat = cublasXtCreate(h)
if (istat .ne. CUBLAS_STATUS_SUCCESS) print *,istat
ndevices(1) = 0
istat = cublasXtDeviceSelect(h, 1, ndevices)
if (istat .ne. CUBLAS_STATUS_SUCCESS) print *,istat
istat = cublasXtDgemm(h, CUBLAS_OP_N, CUBLAS_OP_N, &
                      n, n, n, &
                      alpha, A, n, B, n, beta, C, n)
if (istat .ne. CUBLAS_STATUS_SUCCESS) print *,istat
istat = cublasXtDestroy(h)
if (istat .ne. CUBLAS_STATUS_SUCCESS) print *,istat
if (all(c.eq.2.0d0*n)) then
  print *,"Test PASSED"
else
  print *,"Test FAILED"
endif
print *,c(1,1),c(n,n)
end

12.2. 从 CUDA Fortran 主机代码使用 cuBLAS

此示例演示了 cublas 模块、cublasHandle 类型和多种形式的 blas 调用的使用。

简单的 BLAS 测试

program testisamax
! Compile with "pgfortran testisamax.cuf -cudalib=cublas -lblas"
! Use the NVIDIA cudafor and cublas modules
use cudafor
use cublas
!
real*4, device, allocatable :: xd(:)
real*4 x(1000)
integer, device :: kd
type(cublasHandle) :: h

call random_number(x)

! F90 way
i = maxloc(x,dim=1)
print *,i
print *,x(i-1),x(i),x(i+1)

! Host way
j = isamax(1000,x,1)
print *,j
print *,x(j-1),x(j),x(j+1)

! CUDA Generic BLAS way
allocate(xd(1000))
xd = x
k = isamax(1000,xd,1)
print *,k
print *,x(k-1),x(k),x(k+1)

! CUDA Specific BLAS way
k = cublasIsamax(1000,xd,1)
print *,k
print *,x(k-1),x(k),x(k+1)

! CUDA V2 Host Specific BLAS way
istat = cublasCreate(h)
if (istat .ne. 0) print *,"cublasCreate returned ",istat
k = 0
istat = cublasIsamax_v2(h, 1000, xd, 1, k)
if (istat .ne. 0) print *,"cublasIsamax 1 returned ",istat
print *,k
print *,x(k-1),x(k),x(k+1)

! CUDA V2 Device Specific BLAS way
k = 0
istat = cublasIsamax_v2(h, 1000, xd, 1, kd)
if (istat .ne. 0) print *,"cublasIsamax 2 returned ",istat
k = kd
print *,k
print *,x(k-1),x(k),x(k+1)

istat = cublasDestroy(h)
if (istat .ne. 0) print *,"cublasDestroy returned ",istat

end program

多线程 BLAS 测试

此示例演示了如何在多线程代码中使用 cublas 模块。每个线程将连接到不同的 GPU,创建一个上下文,并在最后合并结果。

program tsgemm
!
! Multi-threaded example calling sgemm from cuda fortran.
! Compile with "pgfortran -mp tsgemm.cuf -cudalib=cublas"
! Set OMP_NUM_THREADS=number of GPUs in your system.
!
use cublas
use cudafor
use omp_lib
!
! Size this according to number of GPUs
!
! Small
!integer, parameter :: K = 2500
!integer, parameter :: M = 2000
!integer, parameter :: N = 2000
! Large
integer, parameter :: K = 10000
integer, parameter :: M = 10000
integer, parameter :: N = 10000
integer, parameter :: NTIMES = 10
!
real*4, device, allocatable :: a_d(:,:), b_d(:,:), c_d(:,:)
!$omp THREADPRIVATE(a_d,b_d,c_d)
real*4 a(m,k), b(k,n), c(m,n)
real*4 alpha, beta
integer, allocatable :: offs(:)
type(cudaEvent) :: start, stop

a = 1.0; b = 0.0; c = 0.0
do i = 1, N
  b(i,i) = 1.0
end do
alpha = 1.0; beta  = 1.0

! Break up the B and C array into sections
nthr = omp_get_max_threads()
nsec = N / nthr
print *,"Running with ",nthr," threads, each section = ",nsec
allocate(offs(nthr))
offs = (/ (i*nsec,i=0,nthr-1) /)

! Allocate and initialize the arrays
! Each thread connects to a device and creates a CUDA context.
!$omp PARALLEL private(i,istat)
    i = omp_get_thread_num() + 1
    istat = cudaSetDevice(i-1)
    allocate(a_d(M,K), b_d(K,nsec), c_d(M,nsec))
    a_d = a
    b_d = b(:,offs(i)+1:offs(i)+nsec)
    c_d = c(:,offs(i)+1:offs(i)+nsec)
!$omp end parallel

istat = cudaEventCreate(start)
istat = cudaEventCreate(stop)

time = 0.0
istat = cudaEventRecord(start, 0)
! Run the traditional blas kernel
!$omp PARALLEL private(j,istat)
    do j = 1, NTIMES
      call sgemm('n','n', M, N/nthr, K, alpha, a_d, M, b_d, K, beta, c_d, M)
    end do
    istat = cudaDeviceSynchronize()
!$omp end parallel

istat = cudaEventRecord(stop, 0)
istat = cudaEventElapsedTime(time, start, stop)
time = time / (NTIMES*1.0e3)
!$omp PARALLEL private(i)
    i = omp_get_thread_num() + 1
    c(:,offs(i)+1:offs(i)+nsec) = c_d
!$omp end parallel
nerrors = 0
do j = 1, N
    do i = 1, M
        if (c(i,j) .ne. NTIMES) nerrors = nerrors + 1
    end do
end do
print *,"Number of Errors:",nerrors
gflops = 2.0 * N * M * K/time/1e9
write (*,901) m,k,k,N,time*1.0e3,gflops
901 format(i0,'x',i0,' * ',i0,'x',i0,':\t',f8.3,' ms\t',f12.3,' GFlops/s')
end

12.3. 从 OpenACC 主机代码使用 cuFFT

此示例演示了 cufft 模块、cufftHandle 类型和多个 cuFFT 库调用的使用。

简单的 cuFFT 测试

program cufft2dTest
  use cufft
  use openacc
  integer, parameter :: m=768, n=512
  complex, allocatable  :: a(:,:),b(:,:),c(:,:)
  real, allocatable     :: r(:,:),q(:,:)
  integer :: iplan1, iplan2, iplan3, ierr

  allocate(a(m,n),b(m,n),c(m,n))
  allocate(r(m,n),q(m,n))

  a = 1; r = 1
  xmx = -99.0

  ierr = cufftPlan2D(iplan1,n,m,CUFFT_C2C)
  ierr = ierr + cufftSetStream(iplan1,acc_get_cuda_stream(acc_async_sync))
  !$acc host_data use_device(a,b,c)
  ierr = ierr + cufftExecC2C(iplan1,a,b,CUFFT_FORWARD)
  ierr = ierr + cufftExecC2C(iplan1,b,c,CUFFT_INVERSE)
  !$acc end host_data

  ! scale c
  !$acc kernels
  c = c / (m*n)
  !$acc end kernels

  ! Check forward answer
  write(*,*) 'Max error C2C FWD: ', cmplx(maxval(real(b)) - sum(real(b)), &
                                          maxval(imag(b)))
  ! Check inverse answer
  write(*,*) 'Max error C2C INV: ', maxval(abs(a-c))

  ! Real transform
  ierr = ierr + cufftPlan2D(iplan2,n,m,CUFFT_R2C)
  ierr = ierr + cufftPlan2D(iplan3,n,m,CUFFT_C2R)
  ierr = ierr + cufftSetStream(iplan2,acc_get_cuda_stream(acc_async_sync))
  ierr = ierr + cufftSetStream(iplan3,acc_get_cuda_stream(acc_async_sync))

  !$acc host_data use_device(r,b,q)
  ierr = ierr + cufftExecR2C(iplan2,r,b)
  ierr = ierr + cufftExecC2R(iplan3,b,q)
  !$acc end host_data

  !$acc kernels
  xmx = maxval(abs(r-q/(m*n)))
  !$acc end kernels

  ! Check R2C + C2R answer
  write(*,*) 'Max error R2C/C2R: ', xmx

  ierr = ierr + cufftDestroy(iplan1)
  ierr = ierr + cufftDestroy(iplan2)
  ierr = ierr + cufftDestroy(iplan3)

  if (ierr.eq.0) then
    print *,"test PASSED"
  else
    print *,"test FAILED"
  endif

end program cufft2dTest

12.4. 从 CUDA Fortran 主机代码使用 cuFFT

此示例演示了 cuFFT 模块、cufftHandle 类型和多个 cuFFT 库调用的使用。

简单的 cuFFT 测试

program cufft2dTest
  use cudafor
  use cufft
  implicit none
  integer, parameter :: m=768, n=512
  complex, managed :: a(m,n),b(m,n)
  real, managed :: ar(m,n),br(m,n)
  real    x
  integer plan, ierr
  logical passing

  a = 1; ar = 1

  ierr = cufftPlan2D(plan,n,m,CUFFT_C2C)
  ierr = ierr + cufftExecC2C(plan,a,b,CUFFT_FORWARD)
  ierr = ierr + cufftExecC2C(plan,b,b,CUFFT_INVERSE)
  ierr = ierr + cudaDeviceSynchronize()
  x = maxval(abs(a-b/(m*n)))
  write(*,*) 'Max error C2C: ', x
  passing = x .le. 1.0e-5

  ierr = ierr + cufftPlan2D(plan,n,m,CUFFT_R2C)
  ierr = ierr + cufftExecR2C(plan,ar,b)
  ierr = ierr + cufftPlan2D(plan,n,m,CUFFT_C2R)
  ierr = ierr + cufftExecC2R(plan,b,br)
  ierr = ierr + cudaDeviceSynchronize()
  x = maxval(abs(ar-br/(m*n)))
  write(*,*) 'Max error R2C/C2R: ', x
  passing = passing .and. (x .le. 1.0e-5)

  ierr = ierr + cufftDestroy(plan)
  print *,ierr
  passing = passing .and. (ierr .eq. 0)
  if (passing) then
    print *,"Test PASSED"
  else
    print *,"Test FAILED"
  endif
end program cufft2dTest

12.5. 从 CUDA Fortran 主机代码使用 cufftXt

此示例演示了 cufftXt 模块、cudaLibXtDesc 类型、许多 cufftXt API 调用、实/复数 FFT 所需的填充以及跨多个 GPU 的活动模式分布的使用。

简单的 Poisson 3D CufftXt 测试

program cufftXt3DTest
  use cudafor
  use cufftXt   ! cufftXt module includes cufft
  implicit none

  integer, parameter :: nGPUs = 2
  integer, parameter :: M = 1, N = 1, P = 1
  integer, parameter :: nx = 32, ny=32, nz=32
  real, parameter :: twopi = 8.0*atan(1.0)
  real, parameter :: Lx = 1.0, Ly = 1.0, Lz = 1.0
  logical, parameter :: printModes = .true.

  ! GPU
  integer :: nodeGPUs
  integer :: whichGPUs(nGPUs)

  ! grid
  real :: x(nx), y(ny), z(nz)
  real :: hx, hy, hz

  ! wavenumbers
  real :: kx(nx/2+1), ky(ny), kz(nz)
  type realDeviceArray
     real, device, allocatable :: v(:)
  end type realDeviceArray
  type(realDeviceArray) :: kx_da(nGPUs), ky_da(nGPUs), kz_da(nGPUs)

  real :: phi(nx+2,ny, nz), u(nx+2,ny,nz), ua(nx,ny,nz)
  integer :: status, i, j, k

  ! check M, N

  if (M==0 .or. N==0 .or. P==0) then
     write(*,*) 'M, N or P is 0 thus solution is u=0'
     stop
  else
     write(*,"(' Running with modes M, N, P = ', i0, ', ', i0, ', ', i0)") M, N, P
     write(*,"('  on a grid of ', i0, 'x', i0, 'x', i0)") nx, ny, nz
  end if

  ! choose GPUs

  ! check for multiple GPUs
  status = cudaGetDeviceCount(nodeGPUs)
  if (status /= cudaSuccess) write(*,*) 'Error in cudaGetDeviceCount()'
  if (nodeGPUs .lt. nGPUs) then
     write(*,*) 'Number of GPUs on node:', nodeGPUs
     write(*,*) 'Insufficient number of GPUs for this code, exiting ...'
     stop
  end if

  ! check for GPUs of same compute capability
  block
    type(cudaDeviceProp) :: prop
    integer :: cc(0:nodeGPUs-1,2)
    logical :: foundIdenticalGPUs = .false.
    integer :: iWG, nIdentGPUs

    write(*,*) 'Available devices:'
    do i = 0, nodeGPUs-1
       status = cudaGetDeviceProperties(prop, i)
       if (status /= cudaSuccess) write(*,*) 'Error in cudaGetDeviceProperties()'
       cc(i,1) = prop%major
       cc(i,2) = prop%minor
       write(*,"('  ', i0, ' CC: ', i0, '.', i0)") i, cc(i,1), cc(i,2)
    enddo

    do i = 0, nodeGPUs-1
       nIdentGPUs = 1
       do j = i+1, nodeGPUs
          if (all(cc(i,:) == cc(j,:))) nIdentGPUs = nIdentGPUs+1
       enddo

       if (nIdentGPUs .ge. nGPUs) then
          foundIdenticalGPUs = .true.
          iWG = 1
          whichGPUs(iWG) = i
          do j = i+1, nodeGPUs-1
             if (all(cc(i,:) == cc(j,:))) then
                iWG = iWG+1
                whichGPUs(iWG) = j
             end if
             if (iWG == nGPUs) exit
          end do
          exit
       end if
    end do

    if (foundIdenticalGPUS) then
       write(*,*) 'Running on GPUs:'
       write(*,*) whichGPUs
    else
       write(*,"(' No ', i0, ' identical GPUs found, exiting ...')"), nGPUs
       stop
    end if

  end block

  ! Physical grid

  hx = Lx/nx
  do i = 1, nx
     x(i) = hx*i
  enddo

  hy = Ly/ny
  do j = 1, ny
     y(j) = hy*j
  enddo

  hz = Lz/nz
  do k = 1, nz
     z(k) = hz*k
  enddo

  ! Wavenumbers

  do i = 1, nx/2+1
     kx(i) = (i-1)*(twoPi/Lx)
  enddo

  do j = 1, ny/2
     ky(j) = (j-1)*(twoPi/Ly)
  enddo
  do j = ny/2+1, ny
     ky(j) = (j-1-ny)*(twoPi/Ly)
  enddo

  do k = 1, nz/2
     kz(k) = (k-1)*(twoPi/Lz)
  enddo
  do k = nz/2+1, nz
     kz(k) = (k-1-nz)*(twoPi/Lz)
  enddo

  ! copy wavenumber arrays to each device
  do i = 1, nGPUs
     status = cudaSetDevice(whichGPUs(i))
     allocate(kx_da(i)%v, source=kx)
     allocate(ky_da(i)%v, source=ky)
     allocate(kz_da(i)%v, source=kz)
  enddo

  ! Initialize phi and get analytical solution

  do k = 1, nz
     do j = 1, ny
        do i = 1, nx
           phi(i,j,k) = sin(twoPi*M*x(i))*sin(twoPi*N*y(j))*sin(twoPi*P*z(k))
           ua(i,j,k) = -phi(i,j,k)/((twoPi*M)**2 + (twoPi*N)**2 + (twoPi*P)**2)
        enddo
     enddo
  end do

  ! cufft block

  block
    integer :: planR2C, planC2R
    integer(c_size_t) :: worksize(nGPUs)
    type(cudaLibXtDesc), pointer :: phi_desc

    status = cufftCreate(planR2C)
    if (status /= CUFFT_SUCCESS) write(*,*) 'Error in cufftCreate'

    status = cufftCreate(planC2R)
    if (status /= CUFFT_SUCCESS) write(*,*) 'Error in cufftCreate'

    status = cufftXtSetGPUs(planR2C, nGPUs, whichGPUs)
    if (status /= CUFFT_SUCCESS) write(*,*) 'cufftXtSetGPUs failed'

    status = cufftXtSetGPUs(planC2R, nGPUs, whichGPUs)
    if (status /= CUFFT_SUCCESS) write(*,*) 'cufftXtSetGPUs failed'

    status = cufftMakePlan3d(planR2C, nz, ny, nx, CUFFT_R2C, worksize)
    if (status /= CUFFT_SUCCESS) write(*,*) 'Error in cufftMakePlan2d'

    status = cufftMakePlan3d(planC2R, nz, ny, nx, CUFFT_C2R, worksize)
    if (status /= CUFFT_SUCCESS) write(*,*) 'Error in cufftMakePlan2d'

    ! allocate memory on seperate devices
    status = cufftXtMalloc(planR2C, phi_desc, CUFFT_XT_FORMAT_INPLACE)
    if (status /= CUFFT_SUCCESS) write(*,*) 'cufftXtMalloc failed'

    ! H2D transfer
    write(*,*) 'cufftXtMemcpy H2D ...'
    status = cufftXtMemcpy(planR2C, phi_desc, phi, CUFFT_COPY_HOST_TO_DEVICE)
    if (status /= CUFFT_SUCCESS) write(*,*) 'cufftXtMemcpy H2D failed'

    ! forward FFT
    write(*,*) 'Forward transform ...'
    status = cufftXtExecDescriptorR2C(planR2C, phi_desc, phi_desc)
    if (status /= CUFFT_SUCCESS) write(*,*) 'cufftXtExecDescriptorR2C failed:', status

    if (printModes) then
       block
         real :: threshold = 1.e-3
         type(cudaXtDesc), pointer :: phiXtDesc
         complex, device, pointer :: phi_d(:,:,:)
         integer :: dev, g, jl, nyl
         complex :: phi_h(nx/2+1, ny, nz)

         call c_f_pointer(phi_desc%descriptor, phiXtDesc)

         do g = 1, nGPUs
            write(*,"(' Active modes on g = ', i0)") g
            dev = phiXtDesc%GPUs(g)
            status = cudaSetDevice(dev)
            if (status /= cudaSuccess) write(*,*) 'cudaSetDevice failed'

            ! XtMalloc done with FORMAT_INPLACE, so data prior to transform
            ! are in natural order (split in least frequently changing index,
            ! in this case z), and after transform are in shuffled order (split in
            ! second least frequently changing index, in this case y)

            nyl = ny/nGPUs
            if (g .le. mod(ny, nGPUs)) nyl = nyl+1

            call c_f_pointer(phiXtDesc%data(g), phi_d, [nx/2+1, nyl, nz])

            !$cuf kernel do (3)
            do k = 1, nz
               do jl = 1, nyl
                  do i = 1, nx/2+1
                     if (abs(phi_d(i,jl,k)) .gt. threshold) print*, i, jl, k, phi_d(i,jl,k)
                  enddo
               enddo
            enddo
            status = cudaDeviceSynchronize()
            call flush()
         end do

         status = cufftXtMemcpy(planR2C, phi_h, phi_desc, CUFFT_COPY_DEVICE_TO_HOST)
         if (status /= CUFFT_SUCCESS) write(*,*) 'cufftXtMemcpy D2H failed'
         write(*,*) 'Active modes on host (after D2H):'
         do k = 1, nz
            do j = 1, ny
               do i = 1, nx/2+1
                  if (abs(phi_h(i,j,k)) .gt. threshold) print*, i, j, k, phi_h(i,j,k)
               end do
            end do
         enddo
       end block
    end if

    ! solve Poisson equation
    write(*,*) 'Solve Poisson Eq ...'
    block
      type(cudaXtDesc), pointer :: phiXtDesc
      complex, device, pointer :: phi_d(:,:,:)
      integer :: dev, g, jl, nyl, yOffset
      real :: k2

      call c_f_pointer(phi_desc%descriptor, phiXtDesc)

      yOffset = 0
      do g = 1, nGPUs
         dev = phiXtDesc%GPUs(g)
         status = cudaSetDevice(dev)
         if (status /= cudaSuccess) write(*,*) 'cudaSetDevice failed'

         ! XtMalloc done with FORMAT_INPLACE, so data prior to transform
         ! are in natural order (split in least frequently changing index,
         ! in this case z), and after transform are in shuffled order (split in
         ! second least frequently changing index, in this case y)

         nyl = ny/nGPUs
         if (g .le. mod(ny, nGPUs)) nyl = nyl+1

         call c_f_pointer(phiXtDesc%data(g), phi_d, [nx/2+1, nyl, nz])

         associate(kx_d => kx_da(g)%v, ky_d => ky_da(g)%v, kz_d => kz_da(g)%v)
           !$cuf kernel do (3)
           do k = 1, nz
              do jl = 1, nyl
                 j = jl + yOffset
                 do i = 1, nx/2+1
                    k2 = kx_d(i)**2 + ky_d(j)**2 + kz_d(k)**2
                    phi_d(i,jl,k) = -phi_d(i,jl,k)/k2/(nx*ny*nz)
                 enddo
              enddo
           enddo
         end associate

         ! specify mean (corrects division by zero wavenumber above)
         if (g == 1) phi_d(1,1,1) = 0.0

         yOffset = yOffset + nyl
      end do

      do g = 1, nGPUs
         dev = phiXtDesc%GPUs(g)
         status = cudaSetDevice(dev)
         if (status /= cudaSuccess) write(*,*) 'cudaSetDevice failed'
         status = cudaDeviceSynchronize()
         if (status /= cudaSuccess) write(*,*) 'CUF kernel sync error'
      end do

    end block ! poisson

    ! inverse FFT
    write(*,*) 'Inverse transform ...'
    status = cufftXtExecDescriptorC2R(planC2R, phi_desc, phi_desc)
    if (status /= CUFFT_SUCCESS) write(*,*) 'cufftXtExecDescriptorC2R failed'

    ! D2H transfer
    write(*,*) 'cufftXtMemcpy D2H ...'
    status = cufftXtMemcpy(planC2R, u, phi_desc, CUFFT_COPY_DEVICE_TO_HOST)
    if (status /= CUFFT_SUCCESS) write(*,*) 'cufftXtMemcpy D2H failed'

    ! cufft block cleanup
    status = cufftXtFree(phi_desc)
    if (status /= CUFFT_SUCCESS) write(*,*) 'cufftXtFree failed'

    status = cufftDestroy(planR2C)
    if (status /= CUFFT_SUCCESS) write(*,*) 'cufftXtFree failed'

    status = cufftDestroy(planC2R)
    if (status /= CUFFT_SUCCESS) write(*,*) 'cufftXtFree failed'

  end block

  write(*,*) 'Max error: ', maxval(abs(u(1:nx,1:ny,1:nz)-ua(1:nx,1:ny,1:nz)))

  ! cleanup

  do i = 1, nGPUs
     status = cudaSetDevice(whichGPUs(i))
     deallocate(kx_da(i)%v, ky_da(i)%v, kz_da(i)%v)
  enddo

  write(*,*) '... finished'

end program cufftXt3DTest

12.6. 从 OpenACC 或 CUDA Fortran 使用 cuFFTMp

此示例演示了如何从 cuFFTXt 模块使用 cuFFTMp API、cudaLibXtDesc 和 cudaXtDesc 类型,以及将 MPI COMM 附加到 cuFFT 计划。

实数到复数和复数到实数 cuFFTMp 测试

!
! This samples illustrates a basic use of cuFFTMp using the built-in, optimized,
! data distributions.
!
!  It assumes the CPU data is initially distributed according to
!  CUFFT_XT_FORMAT_INPLACE, a.k.a. X-Slabs.
!  Given a global array of size X!  Y!  Z, every MPI rank owns approximately
!  (X / ngpus)!  Y*Z entries.
!  More precisely,
!  - The first (ngpus % X) MPI rank each own (X/ngpus+1) planes of size Y*Z,
!  - The remaining MPI rank each own (X / ngpus) planes of size Y*Z
!
!  The CPU data is then copied on GPU and a forward transform is applied.
!
!  After that transform, GPU data is distributed according to
!  CUFFT_XT_FORMAT_INPLACE_SHUFFLED, a.k.a. Y-Slabs.
!  Given a global array of size X * Y * Z, every MPI rank owns approximately
!  X * (Y / ngpus) * Z entries.
!  More precisely,
!  - The first (ngpus % Y) MPI rank each own (Y/ngpus+1) planes of size X*Z,
!  - The remaining MPI rank each own (Y / ngpus) planes of size X*Z
!
!  A scaling kerel is applied, on the distributed GPU data (distributed
!  according to CUFFT_XT_FORMAT_INPLACE)
!  This kernel prints some elements to illustrate the
!  CUFFT_XT_FORMAT_INPLACE_SHUFFLED data distribution and normalize entries
!  by (nx * ny * nz)
!
!  Finally, a backward transform is applied.
!  After this, data is again distributed according to CUFFT_XT_FORMAT_INPLACE,
!  same as the input data.
!
!  Data is finally copied back to CPU and compared to the input data. They
!  should be almost identical.
!
!  This program can be used by either OpenACC or CUDA Fortran:
!    mpif90 -acc cufftmp_r2c.F90 -cudalib=cufftmp
!  Or:
!    mpif90 -cuda cufftmp_r2c.F90 -cudalib=cufftmp
!
module cufft_required
    integer :: planr2c, planc2r
    integer :: local_rshape(3), local_rshape_permuted(3)
    integer :: local_permuted_cshape(3)
end module cufft_required

program cufftmp_r2c
    use iso_c_binding
    use cufftXt
    use cufft
!@cuf use cudafor
!@acc use openacc
    use mpi
    use cufft_required
    implicit none

    integer :: size, rank, ndevices, ierr
    integer :: nx, ny, nz ! nx slowest
    integer :: i, j, k
    integer :: my_nx, my_ny, my_nz, ranks_cutoff, whichgpu(1)
    real, dimension(:, :, :), allocatable :: u, ref
    complex, dimension(:,:,:), allocatable :: u_permuted
    real :: max_norm, max_diff

    ! cufft stuff
    integer(c_size_t) :: worksize(1)
    type(cudaLibXtDesc), pointer :: u_desc
    type(cudaXtDesc), pointer    :: u_descptr
#ifdef _OPENACC
    complex, pointer             :: u_dptr(:,:,:)
    type(c_ptr)                  :: tmpcptr
#else
    complex, pointer, device     :: u_dptr(:,:,:)
#endif

    call mpi_init(ierr)
    call mpi_comm_size(MPI_COMM_WORLD,size,ierr)
    call mpi_comm_rank(MPI_COMM_WORLD,rank,ierr)

#ifdef _OPENACC
    ndevices = acc_get_num_devices(acc_device_nvidia)
    call acc_set_device_num(mod(rank, ndevices), acc_device_nvidia)
#else
    call checkCuda(cudaGetDeviceCount(ndevices))
    call checkCuda(cudaSetDevice(mod(rank, ndevices)))
#endif
    whichgpu(1) = mod(rank, ndevices)

    print*,"Hello from rank ",rank," gpu id",mod(rank,ndevices),"size",size

    nx = 256
    ny = nx
    nz = nx

    ! We start with X-Slabs
    ! Ranks 0 ... (nx % size - 1) have 1 more element in the X dimension
    ! and every rank own all elements in the Y and Z dimensions.
    ranks_cutoff = mod(nx, size)
    my_nx = nx / size
    if (rank < ranks_cutoff) my_nx = my_nx + 1
    my_ny =  ny;
    my_nz =  nz;
    ! Note nz is first dimension, nx third
    local_rshape = [2*(nz/2+1), ny, my_nx]
    local_permuted_cshape = [nz/2+1, ny/size, nx]
    local_rshape_permuted = [2*(nz/2+1), ny/size, nx]
    if (mod(ny, size) > 0) then
        print*," ny has to divide evenly by mpi_procs"
        call mpi_finalize(ierr)
    end if
    if (rank == 0) then
        write(*,*) "local_rshape          :", local_rshape(1:3)
        write(*,*) "local_permuted_cshape :", local_permuted_cshape(1:3)
    end if

    ! Generate local, distributed data
    allocate(u(local_rshape(1), local_rshape(2), local_rshape(3)))
    allocate(u_permuted(local_permuted_cshape(1), local_permuted_cshape(2), &
        local_permuted_cshape(3)))
    allocate(ref(local_rshape(1), local_rshape(2), local_rshape(3)))
    print*,'shape of u is ', shape(u)
    print*,'shape of u_permuted is ', shape(u_permuted)
    call generate_random(nz, local_rshape(1), local_rshape(2), &
        local_rshape(3), u)
    ref = u
    u_permuted = (0.0,0.0)

    call checkNorm(nz, local_rshape(1), local_rshape(2), local_rshape(3), &
        u, max_norm)
    print*, "initial data on ", rank, " max_norm is ", max_norm

    call checkCufft(cufftCreate(planr2c))
    call checkCufft(cufftCreate(planc2r))
    call checkCufft(cufftMpAttachComm(planr2c, CUFFT_COMM_MPI, &
        MPI_COMM_WORLD), 'cufftMpAttachComm error')
    call checkCufft(cufftMpAttachComm(planc2r, CUFFT_COMM_MPI, &
        MPI_COMM_WORLD), 'cufftMpAttachComm error')

    ! Note nx, ny, nz order
    call checkCufft(cufftMakePlan3d(planr2c, nx, ny, nz, CUFFT_R2C, &
        worksize), 'cufftMakePlan3d r2c error')
    call checkCufft(cufftMakePlan3d(planc2r, nx, ny, nz, CUFFT_C2R, &
        worksize), 'cufftMakePlan3d c2r error')

    call checkCufft(cufftXtMalloc(planr2c, u_desc, &
        CUFFT_XT_FORMAT_INPLACE), 'cufftXtMalloc error')

    ! These are equivalent, and work as well
    ! istat = cufftXtMemcpy(planr2c, u_desc, u, CUFFT_COPY_HOST_TO_DEVICE)
    ! call cufft_memcpyH2D(u_desc, u, CUFFT_XT_FORMAT_INPLACE, .false.)
    call cufft_memcpyH2D(u_desc, u, CUFFT_XT_FORMAT_INPLACE, .true.)

    ! now reset u to make sure the check later is valid
    u = 0.0

    !xxxxxxxxxxxxxxxxxxxxxxxxxx Forward
    call checkCufft(cufftXtExecDescriptor(planr2c, u_desc, u_desc, &
        CUFFT_FORWARD),'forward fft failed')

    ! in case we want to check the results after Forward
    !call checkCufft(cufftXtMemcpy(planr2c, u_permuted, u_desc, CUFFT_COPY_DEVICE_TO_HOST), 'permuted D2H error')
    !call checkNormComplex(local_permuted_cshape(1), local_permuted_cshape(2), local_permuted_cshape(3), u_permuted, max_norm)
    !write(*,'(A18, I1, A14, F25.8)') "after R2C ", rank, " max_norm is ", max_norm

    ! Data is now distributed as Y-Slab. We need to scale the output
    call c_f_pointer(u_desc%descriptor, u_descptr)

#ifdef _OPENACC
    tmpcptr = transfer(u_descptr%data(1), tmpcptr)
    call c_f_pointer(tmpcptr, u_dptr, local_permuted_cshape(1:3))

    call scalingData(local_permuted_cshape(1), local_permuted_cshape(2), &
        local_permuted_cshape(3), u_dptr, real(nx*ny*nz))
#else
    call c_f_pointer(u_descptr%data(1), u_dptr, local_permuted_cshape(1:3))
    !$cuf kernel do (3)
    do k =1, local_permuted_cshape(3)
        do j = 1, local_permuted_cshape(2)
            do i = 1, local_permuted_cshape(1)
                u_dptr(i,j,k) = u_dptr(i,j,k) / real(nx*ny*nz)
            end do
        end do
    end do
    call checkCuda(cudaDeviceSynchronize())
#endif

    ! in case we want to check again after scaling
    call checkCufft(cufftXtMemcpy(planr2c, u_permuted, u_desc, &
        CUFFT_COPY_DEVICE_TO_HOST), 'permuted D2H error')
    call checkNormComplex(local_permuted_cshape(1), &
        local_permuted_cshape(2), local_permuted_cshape(3), &
        u_permuted, max_norm)
    write(*,'(A18, I1, A14, F25.8)') "after scaling ", rank, &
        " max_norm is ", max_norm

    !xxxxxxxxxxxxxxxxxxxxxxxxxxxx inverse
    call checkCufft(cufftXtExecDescriptor(planc2r, u_desc, u_desc, &
        CUFFT_INVERSE), 'inverse fft failed')

    ! These are equivalent, and work as well
    ! istat = cufftXtMemcpy(planc2r, u, u_desc, CUFFT_COPY_DEVICE_TO_HOST)
    ! call cufft_memcpyD2H(u, u_desc, CUFFT_XT_FORMAT_INPLACE, .false.)
    call cufft_memcpyD2H(u, u_desc, CUFFT_XT_FORMAT_INPLACE, .true.)

    call checkCufft(cufftXtFree(u_desc))
    call checkCufft(cufftDestroy(planr2c))
    call checkCufft(cufftDestroy(planc2r))

    call checkNormDiff(nz, local_rshape(1), local_rshape(2), &
        local_rshape(3), u, ref, max_norm, max_diff)
    write(*,'(A18,I1,A14,F25.8,A14,F15.8)') "after C2R ", rank, &
        " max_norm is ", max_norm, " max_diff is ", max_diff
    write(*,'(A25,I1,A14,F25.8)') "Relative Linf on rank ", rank, &
        " is ", max_diff/max_norm
    deallocate(u)
    deallocate(ref)
    deallocate(u_permuted)

    call mpi_finalize(ierr)

    if(max_diff / max_norm > 1e-5) then
        print*, ">>>> FAILED on rank ", rank
        stop 1
    else
        print*, ">>>> PASSED on rank ", rank
    end if

contains
#ifdef _CUDA
    subroutine checkCuda(istat, message)
        implicit none
        integer, intent(in)                   :: istat
        character(len=*),intent(in), optional :: message
        if (istat /= cudaSuccess) then
            write(*,"('Error code: ',I0, ': ')") istat
            write(*,*) cudaGetErrorString(istat)
            if(present(message)) write(*,*) message
            call mpi_finalize(ierr)
        endif
    end subroutine checkCuda
#endif

    subroutine checkCufft(istat, message)
        implicit none
        integer, intent(in)                   :: istat
        character(len=*),intent(in), optional :: message
        if (istat /= CUFFT_SUCCESS) then
            write(*,"('Error code: ',I0, ': ')") istat
!@cuf       write(*,*) cudaGetErrorString(istat)
            if(present(message)) write(*,*) message
            call mpi_finalize(ierr)
        endif
    end subroutine checkCufft

    subroutine generate_random(nz1, nz, ny, nx, data)
        implicit none
        integer, intent(in) :: nx, ny, nz, nz1
        real, dimension(nz, ny, nx), intent(out) :: data
        real :: rand(1)
        integer :: i,j,k
        !call random_seed(put=(/seed, seed+1/))
        do k =1, nx
            do j = 1, ny
                do i = 1, nz1
                    call random_number(rand)
                    data(i,j,k) = rand(1)
                end do
            end do
        end do

    end subroutine generate_random

    subroutine checkNorm(nz1, nz, ny, nx, data, max_norm)
        implicit none
        integer, intent(in)  :: nx, ny, nz, nz1
        real, dimension(nz, ny, nx), intent(in) :: data
        real :: max_norm
        integer :: i, j, k
        max_norm = 0
        do k =1, nx
            do j = 1, ny
                do i = 1, nz1
                    max_norm = max(max_norm, abs(data(i,j,k)))
                end do
            end do
        end do
    end subroutine checkNorm

    subroutine checkNormComplex(nz, ny, nx, data, max_norm)
        implicit none
        integer, intent(in)  :: nx, ny, nz
        complex, dimension(nz, ny, nx), intent(in) :: data
        real :: max_norm, max_diff
        integer :: i,j,k
        max_norm = 0
        do k =1, nx
            do j = 1, ny
                do i = 1, nz
                    max_norm = max(max_norm, abs(data(i,j,k)%re))
                    max_norm = max(max_norm, abs(data(i,j,k)%im))
                end do
            end do
        end do
    end subroutine checkNormComplex

    subroutine checkNormDiff(nz1, nz, ny, nx, data, ref, max_norm, max_diff)
        implicit none
        integer, intent(in)  :: nx, ny, nz, nz1
        real, dimension(nz, ny, nx), intent(in) :: data, ref
        real :: max_norm, max_diff
        max_norm = 0
        max_diff = 0
        do k =1, nx
          do j = 1, ny
            do i = 1, nz1
              max_norm = max(max_norm, abs(data(i,j,k)))
              max_diff = max(max_diff, abs(ref(i,j,k)-data(i,j,k)))
              if (abs(ref(i,j,k)-data(i,j,k)) > 0.0001) then
                write(*,'(A9,I3,I3,I3,A2,F18.8,A7,F18.8,A9,I2)') "diff ref[", &
                  i,j,k,"]",ref(i,j,k),"data ",data(i,j,k)," at rank",rank
              end if
            end do
          end do
        end do
    end subroutine checkNormDiff

#ifdef _OPENACC
    subroutine scalingData(nz, ny, nx, data, factor)
        implicit none
        integer, intent(in)  :: nx, ny, nz
        complex, dimension(nz, ny, nz) :: data
        !$acc declare deviceptr(data)
        real, intent(in)     :: factor

    !$acc parallel loop collapse(3)
        do k =1, nx
            do j = 1, ny
                do i = 1, nz
                    data(i, j, k) = data(i, j, k) / factor
                end do
            end do
        end do

    end subroutine scalingData
#endif

subroutine cufft_memcpyH2D(ulibxt, u_h, data_format, ismemcpy)
    implicit none
    type(cudaLibXtDesc), pointer, intent(out) :: ulibxt
    real, dimension(*), intent(in)          :: u_h
    integer, intent(in)                         :: data_format
    logical, intent(in)                         :: ismemcpy
    type(cudaXtDesc), pointer  :: uxt
!@cuf real, dimension(:,:,:), device, pointer :: u_d

    if (ismemcpy == .false.) then
        call checkCufft(cufftXtMemcpy(planc2r, ulibxt, u_h, &
                 CUFFT_COPY_HOST_TO_DEVICE), "cufft_memcpyHToD Error")
    else
        call c_f_pointer(ulibxt%descriptor, uxt)
        if(data_format == CUFFT_XT_FORMAT_INPLACE_SHUFFLED) then
#ifdef _OPENACC
            call acc_memcpy_to_device(uxt%data(1), u_h, &
                     product(int(local_rshape_permuted,kind=8))*4_8) ! bytes
#else
            call c_f_pointer(uxt%data(1), u_d, local_rshape_permuted)
            call checkCuda(cudaMemcpy(u_d, u_h, &
                     product(int(local_rshape_permuted,kind=8))), &
                     "cudamemcpy H2D Error")
#endif
        else if (data_format == CUFFT_XT_FORMAT_INPLACE) then
#ifdef _OPENACC
            call acc_memcpy_to_device(uxt%data(1), u_h, &
                     product(int(local_rshape,kind=8))*4_8) ! bytes
#else
            call c_f_pointer(uxt%data(1), u_d, local_rshape)
            call checkCuda(cudaMemcpy(u_d, u_h, &
                     product(int(local_rshape,kind=8))), &
                     "cudamemcpy H2D Error")
#endif
        endif
    endif
end subroutine cufft_memcpyH2D


subroutine cufft_memcpyD2H(u_h, ulibxt, data_format,ismemcpy)
    implicit none
    type(cudaLibXtDesc), pointer, intent(in) :: ulibxt
    real, dimension(*), intent(out)      :: u_h
    integer, intent(in)                      :: data_format
    logical, intent(in)                      :: ismemcpy
    type(cudaXtDesc), pointer  :: uxt
!@cuf real, dimension(:,:,:), device, pointer :: u_d

    if (ismemcpy == .false.) then
        call checkCufft(cufftXtMemcpy(planr2c, u_h, ulibxt, &
                 CUFFT_COPY_DEVICE_TO_HOST), "cufft_memcpyDToH Error")
    else
        call c_f_pointer(ulibxt%descriptor, uxt)
        if(data_format == CUFFT_XT_FORMAT_INPLACE_SHUFFLED) then
#ifdef _OPENACC
            call acc_memcpy_from_device(u_h, uxt%data(1), &
                     product(int(local_rshape_permuted,kind=8))*4_8) ! bytes
#else
            call c_f_pointer(uxt%data(1), u_d, local_rshape_permuted)
            call checkCuda(cudaMemcpy(u_h, u_d, &
                     product(int(local_rshape_permuted,kind=8))), &
                     "cudamemcpy D2H Error")
#endif
        else if (data_format == CUFFT_XT_FORMAT_INPLACE) then
#ifdef _OPENACC
            call acc_memcpy_from_device(u_h, uxt%data(1), &
                     product(int(local_rshape,kind=8))*4_8) ! bytes
#else
            call c_f_pointer(uxt%data(1), u_d, local_rshape)
            call checkCufft(cudamemcpy(u_h, u_d, &
                     product(int(local_rshape,kind=8))), &
                     "cufft_memcpyD2H error")
#endif
        endif
    endif
end subroutine cufft_memcpyD2H


end program cufftmp_r2c

12.7. 从 OpenACC 主机代码使用 cuRAND

此示例演示了 curand 模块、curandHandle 类型和多种形式的 rand 调用的使用。

简单的 cuRAND 测试

program testcurand
! compile with the flags -ta=tesla -cuda -cudalib=curand
call cur1(1000, .true.); call cur1(1000, .false.)
call cur2(1000, .true.); call cur2(1000, .false.)
call cur3(1000, .true.); call cur3(1000, .false.)
end
!
subroutine cur1(n, onhost)
use curand
integer :: a(n)
type(curandGenerator) :: g
integer(8) nbits
logical onhost, passing
a = 0
passing = .true.
if (onhost) then
  istat = curandCreateGeneratorHost(g,CURAND_RNG_PSEUDO_XORWOW)
  istat = curandGenerate(g, a, n)
  istat = curandDestroyGenerator(g)
else
  !$acc data copy(a)
  istat = curandCreateGenerator(g,CURAND_RNG_PSEUDO_XORWOW)
  !$acc host_data use_device(a)
  istat = curandGenerate(g, a, n)
  !$acc end host_data
  istat = curandDestroyGenerator(g)
  !$acc end data
endif
nbits = 0
do i = 1, n
  if (i.lt.10) print *,i,a(i)
  nbits = nbits + popcnt(a(i))
end do
print *,"Should be roughly half the bits set"
nbits = nbits / n
if ((nbits .lt. 12) .or. (nbits .gt. 20)) then
  passing = .false.
else
  print *,"nbits is ",nbits," which passes"
endif
if (passing) then
  print *,"Test PASSED"
else
  print *,"Test FAILED"
endif
end
!
subroutine cur2(n, onhost)
use curand
real :: a(n)
type(curandGenerator) :: g
logical onhost, passing
a = 0.0
passing = .true.
if (onhost) then
  istat = curandCreateGeneratorHost(g,CURAND_RNG_PSEUDO_XORWOW)
  istat = curandGenerate(g, a, n)
  istat = curandDestroyGenerator(g)
else
  !$acc data copy(a)
  istat = curandCreateGenerator(g,CURAND_RNG_PSEUDO_XORWOW)
  !$acc host_data use_device(a)
  istat = curandGenerate(g, a, n)
  !$acc end host_data
  istat = curandDestroyGenerator(g)
  !$acc end data
endif
print *,"Should be uniform around 0.5"
do i = 1, n
  if (i.lt.10) print *,i,a(i)
  if ((a(i).lt.0.0) .or. (a(i).gt.1.0)) passing = .false.
end do
rmean = sum(a)/n
if ((rmean .lt. 0.4) .or. (rmean .gt. 0.6)) then
  passing = .false.
else
  print *,"Mean is ",rmean," which passes"
endif
if (passing) then
  print *,"Test PASSED"
else
  print *,"Test FAILED"
endif
end
!
subroutine cur3(n, onhost)
use curand
real(8) :: a(n)
type(curandGenerator) :: g
logical onhost, passing
a = 0.0d0
passing = .true.
if (onhost) then
  istat = curandCreateGeneratorHost(g,CURAND_RNG_PSEUDO_XORWOW)
  istat = curandGenerate(g, a, n)
  istat = curandDestroyGenerator(g)
else
  !$acc data copy(a)
  istat = curandCreateGenerator(g,CURAND_RNG_PSEUDO_XORWOW)
  !$acc host_data use_device(a)
  istat = curandGenerate(g, a, n)
  !$acc end host_data
  istat = curandDestroyGenerator(g)
  !$acc end data
endif
do i = 1, n
  if (i.lt.10) print *,i,a(i)
  if ((a(i).lt.0.0d0) .or. (a(i).gt.1.0d0)) passing = .false.
end do
rmean = sum(a)/n
if ((rmean .lt. 0.4d0) .or. (rmean .gt. 0.6d0)) then
  passing = .false.
else
  print *,"Mean is ",rmean," which passes"
endif
if (passing) then
  print *,"Test PASSED"
else
  print *,"Test FAILED"
endif
end

12.8. 从 OpenACC 设备代码使用 cuRAND

此示例演示了如何从 CUDA Fortran 全局子例程中使用 curand_device 模块。

从 OpenACC 设备代码进行的简单 cuRAND 测试

module mtests
  integer, parameter :: n = 1000
  contains
    subroutine testrand( a, b )
    use openacc_curand
    real :: a(n), b(n)
    type(curandStateXORWOW) :: h
    integer(8) :: seed, seq, offset

    !$acc parallel num_gangs(1) vector_length(1) copy(a,b) private(h)
    seed = 12345
    seq = 0
    offset = 0
    call curand_init(seed, seq, offset, h)
    !$acc loop seq
    do i = 1, n
      a(i) = curand_uniform(h)
      b(i) = curand_normal(h)
    end do
    !$acc end parallel
    return
    end subroutine
end module mtests

program t
use mtests
real :: a(n), b(n), c(n)
logical passing
a = 1.0
b = 2.0
passing = .true.
call testrand(a,b)
c = a
print *,"Should be uniform around 0.5"
do i = 1, n
  if (i.lt.10) print *,i,c(i)
  if ((c(i).lt.0.0) .or. (c(i).gt.1.0)) passing = .false.
end do
rmean = sum(c)/n
if ((rmean .lt. 0.4) .or. (rmean .gt. 0.6)) then
  passing = .false.
else
  print *,"Mean is ",rmean," which passes"
endif
c = b
print *,"Should be normal around 0.0"
nc1 = 0;
nc2 = 0;
do i = 1, n
  if (i.lt.10) print *,i,c(i)
  if ((c(i) .gt. -4.0) .and. (c(i) .lt. 0.0)) nc1 = nc1 + 1
  if ((c(i) .gt.  0.0) .and. (c(i) .lt. 4.0)) nc2 = nc2 + 1
end do
print *,"Found on each side of zero ",nc1,nc2
if (abs(nc1-nc2) .gt. (n/10)) npassing = .false.
rmean = sum(c,mask=abs(c).lt.4.0)/n
if ((rmean .lt. -0.1) .or. (rmean .gt. 0.1)) then
  passing = .false.
else
  print *,"Mean is ",rmean," which passes"
endif

if (passing) then
  print *,"Test PASSED"
else
  print *,"Test FAILED"
endif
end program

12.9. 从 CUDA Fortran 主机代码使用 cuRAND

此示例演示了 curand 模块、curandHandle 类型和多种形式的 rand 调用的使用。

简单的 cuRAND 测试

program testcurand1
call testr1(1000)
call testr2(1000)
call testr3(1000)
end
!
subroutine testr1(n)
use cudafor
use curand
integer, managed :: a(n)
type(curandGenerator) :: g
integer(8) nbits
logical passing
a = 0
passing = .true.
istat = curandCreateGenerator(g,CURAND_RNG_PSEUDO_XORWOW)
istat = curandGenerate(g, a, n)
istat = cudaDeviceSynchronize()
istat = curandDestroyGenerator(g)
nbits = 0
do i = 1, n
  if (i.lt.10) print *,i,a(i)
  nbits = nbits + popcnt(a(i))
end do
print *,"Should be roughly half the bits set"
nbits = nbits / n
if ((nbits .lt. 12) .or. (nbits .gt. 20)) then
  passing = .false.
else
  print *,"nbits is ",nbits," which passes"
endif
if (passing) then
  print *,"Test PASSED"
else
  print *,"Test FAILED"
endif
end
!
subroutine testr2(n)
use cudafor
use curand
real, managed :: a(n)
type(curandGenerator) :: g
logical passing
a = 0.0
passing = .true.
istat = curandCreateGenerator(g,CURAND_RNG_PSEUDO_XORWOW)
istat = curandGenerate(g, a, n)
istat = cudaDeviceSynchronize()
istat = curandDestroyGenerator(g)
print *,"Should be uniform around 0.5"
do i = 1, n
  if (i.lt.10) print *,i,a(i)
  if ((a(i).lt.0.0) .or. (a(i).gt.1.0)) passing = .false.
end do
rmean = sum(a)/n
if ((rmean .lt. 0.4) .or. (rmean .gt. 0.6)) then
  passing = .false.
else
  print *,"Mean is ",rmean," which passes"
endif
if (passing) then
  print *,"Test PASSED"
else
  print *,"Test FAILED"
endif
end
!
subroutine testr3(n)
use cudafor
use curand
real(8), managed :: a(n)
type(curandGenerator) :: g
logical passing
a = 0.0d0
passing = .true.
istat = curandCreateGenerator(g,CURAND_RNG_PSEUDO_XORWOW)
istat = curandGenerate(g, a, n)
istat = cudaDeviceSynchronize()
istat = curandDestroyGenerator(g)
do i = 1, n
  if (i.lt.10) print *,i,a(i)
  if ((a(i).lt.0.0d0) .or. (a(i).gt.1.0d0)) passing = .false.
end do
rmean = sum(a)/n
if ((rmean .lt. 0.4d0) .or. (rmean .gt. 0.6d0)) then
  passing = .false.
else
  print *,"Mean is ",rmean," which passes"
endif
if (passing) then
  print *,"Test PASSED"
else
  print *,"Test FAILED"
endif
end
end program

12.10. 从 CUDA Fortran 设备代码使用 cuRAND

此示例演示了如何从 CUDA Fortran 全局子例程中使用 curand_device 模块。

从设备代码进行的简单 cuRAND 测试

module mtests
  use curand_device
  integer, parameter :: n = 10000
  contains
    attributes(global) subroutine testr( a, b )
    real, device :: a(n), b(n)
    type(curandStateXORWOW) :: h
    integer(8) :: seed, seq, offset
    integer :: iam
    iam = threadIdx%x
    seed = iam*64 + 12345
    seq = 0
    offset = 0
    call curand_init(seed, seq, offset, h)
    do i = iam, n, blockdim%x
      a(i) = curand_uniform(h)
      b(i) = curand_normal(h)
    end do
    return
    end subroutine
end module mtests

program t
use mtests
real, allocatable, device :: a(:), b(:)
real c(n), rmean
logical passing
allocate(a(n))
allocate(b(n))
a = 0.0
b = 0.0
passing = .true.
call testr<<<1,32>>> (a,b)
c = a
print *,"Should be uniform around 0.5"
do i = 1, n
  if (i.lt.10) print *,i,c(i)
  if ((c(i).lt.0.0) .or. (c(i).gt.1.0)) passing = .false.
end do
rmean = sum(c)/n
if ((rmean .lt. 0.4) .or. (rmean .gt. 0.6)) then
  passing = .false.
else
  print *,"Mean is ",rmean," which passes"
endif

c = b
print *,"Should be normal around 0.0"
nc1 = 0;
nc2 = 0;
do i = 1, n
  if (i.lt.10) print *,i,c(i)
  if ((c(i) .gt. -4.0) .and. (c(i) .lt. 0.0)) nc1 = nc1 + 1
  if ((c(i) .gt.  0.0) .and. (c(i) .lt. 4.0)) nc2 = nc2 + 1
end do
print *,"Found on each side of zero ",nc1,nc2
if (abs(nc1-nc2) .gt. (n/10)) npassing = .false.
rmean = sum(c,mask=abs(c).lt.4.0)/n
if ((rmean .lt. -0.1) .or. (rmean .gt. 0.1)) then
  passing = .false.
else
  print *,"Mean is ",rmean," which passes"
endif

if (passing) then
  print *,"Test PASSED"
else
  print *,"Test FAILED"
endif
end
end program

12.11. 从 OpenACC 主机代码使用 cuSPARSE

此示例演示了 cuSPARSE 模块、cusparseHandle 类型和对 cuSPARSE 库的多个调用的使用。

简单的 BLAS 测试

program sparseMatVec
    integer n
    n = 25 ! # rows/cols in dense matrix
    call sparseMatVecSub1(n)
    n = 45 ! # rows/cols in dense matrix
    call sparseMatVecSub1(n)
end program

subroutine sparseMatVecSub1(n)
  use openacc
  use cusparse

  implicit none

  integer n

  ! dense data
  real(4), allocatable :: Ade(:,:), x(:), y(:)

  ! sparse CSR arrays
  real(4), allocatable :: csrValA(:)
  integer, allocatable :: nnzPerRowA(:), csrRowPtrA(:), csrColIndA(:)

  allocate(Ade(n,n), x(n), y(n))
  allocate(csrValA(n))
  allocate(nnzPerRowA(n), csrRowPtrA(n+1), csrColIndA(n))

  call sparseMatVecSub2(Ade, x, y, csrValA, nnzPerRowA, csrRowPtrA, &
                                                         csrColIndA, n)
  deallocate(Ade)
  deallocate(x)
  deallocate(y)
  deallocate(csrValA)
  deallocate(nnzPerRowA)
  deallocate(csrRowPtrA)
  deallocate(csrColIndA)
end subroutine

subroutine sparseMatVecSub2(Ade, x, y, csrValA, nnzPerRowA, csrRowPtrA, &
                                                             csrColIndA, n)
  use openacc
  use cusparse

  implicit none

  ! dense data
  real(4) :: Ade(n,n), x(n), y(n)

  ! sparse CSR arrays
  real(4) :: csrValA(n)
  integer :: nnzPerRowA(n), csrRowPtrA(n+1), csrColIndA(n)

  integer :: n, nnz, status, i
  type(cusparseHandle) :: h
  type(cusparseMatDescr) :: descrA

  ! parameters
  real(4) :: alpha, beta

  ! result
  real(4) :: xerr

  ! initalize CUSPARSE and matrix descriptor
  status = cusparseCreate(h)
  if (status /= CUSPARSE_STATUS_SUCCESS) &
       write(*,*) 'cusparseCreate error: ', status
  status = cusparseCreateMatDescr(descrA)
  status = cusparseSetMatType(descrA, &
       CUSPARSE_MATRIX_TYPE_GENERAL)
  status = cusparseSetMatIndexBase(descrA, &
       CUSPARSE_INDEX_BASE_ONE)
  status = cusparseSetStream(h, acc_get_cuda_stream(acc_async_sync))

  !$acc data create(Ade, x, y, csrValA, nnzPerRowA, csrRowPtrA, csrColIndA)

  ! Initialize matrix (upper circular shift matrix)
  !$acc kernels
  Ade = 0.0
  do i = 1, n-1
     Ade(i,i+1) = 1.0
  end do
  Ade(n,1) = 1.0

  ! Initialize vectors and constants
  do i = 1, n
     x(i) = i
  enddo
  y = 0.0
  !$acc end kernels

  !$acc update host(x)
  write(*,*) 'Original vector:'
  write(*,'(5(1x,f7.2))') x

  ! convert matrix from dense to csr format
  !$acc host_data use_device(Ade, nnzPerRowA, csrValA, csrRowPtrA, csrColIndA)
  status = cusparseSnnz_v2(h, CUSPARSE_DIRECTION_ROW, &
       n, n, descrA, Ade, n, nnzPerRowA, nnz)
  status = cusparseSdense2csr(h, n, n, descrA, Ade, n, &
       nnzPerRowA, csrValA, csrRowPtrA, csrColIndA)
  !$acc end host_data

  ! A is upper circular shift matrix
  ! y = alpha*A*x + beta*y
  alpha = 1.0
  beta = 0.0
  !$acc host_data use_device(csrValA, csrRowPtrA, csrColIndA, x, y)
  status = cusparseScsrmv(h, CUSPARSE_OPERATION_NON_TRANSPOSE, &
       n, n, n, alpha, descrA, csrValA, csrRowPtrA, &
       csrColIndA, x, beta, y)
  !$acc end host_data

  !$acc wait
  write(*,*) 'Shifted vector:'
  write(*,'(5(1x,f7.2))') y

  ! shift-down y and add original x
  ! A' is lower circular shift matrix
  ! x = alpha*A'*y + beta*x
  beta = -1.0
  !$acc host_data use_device(csrValA, csrRowPtrA, csrColIndA, x, y)
  status = cusparseScsrmv(h, CUSPARSE_OPERATION_TRANSPOSE, &
       n, n, n, alpha, descrA, csrValA, csrRowPtrA, &
       csrColIndA, y, beta, x)
  !$acc end host_data

  !$acc kernels
  xerr = maxval(abs(x))
  !$acc end kernels
  !$acc end data

  write(*,*) 'Max error = ', xerr
  if (xerr.le.1.e-5) then
    write(*,*) 'Test PASSED'
  else
    write(*,*) 'Test FAILED'
  endif

end subroutine

12.12. 从 CUDA Fortran 主机代码使用 cuSPARSE

此示例演示了 cuSPARSE 模块、cusparseHandle 类型和多种形式的 cusparse 调用的使用。

简单的 BLAS 测试

program sparseMatVec
  use cudafor
  use cusparse

  implicit none

  integer, parameter :: n = 25 ! # rows/cols in dense matrix

  type(cusparseHandle) :: h
  type(cusparseMatDescr) :: descrA

  ! dense data
  real(4), managed :: Ade(n,n), x(n), y(n)

  ! sparse CSR arrays
  real(4), managed :: csrValA(n)
  integer, managed :: nnzPerRowA(n), &
       csrRowPtrA(n+1), csrColIndA(n)
  integer :: nnz, status, i

  ! parameters
  real(4) :: alpha, beta

  ! initalize CUSPARSE and matrix descriptor
  status = cusparseCreate(h)
  if (status /= CUSPARSE_STATUS_SUCCESS) &
       write(*,*) 'cusparseCreate error: ', status
  status = cusparseCreateMatDescr(descrA)
  status = cusparseSetMatType(descrA, &
       CUSPARSE_MATRIX_TYPE_GENERAL)
  status = cusparseSetMatIndexBase(descrA, &
       CUSPARSE_INDEX_BASE_ONE)

  ! Initialize matrix (upper circular shift matrix)
  Ade = 0.0
  do i = 1, n-1
     Ade(i,i+1) = 1.0
  end do
  Ade(n,1) = 1.0

  ! Initialize vectors and constants
  x = [(i,i=1,n)]
  y = 0.0

  write(*,*) 'Original vector:'
  write(*,'(5(1x,f7.2))') x

  ! convert matrix from dense to csr format
  status = cusparseSnnz_v2(h, CUSPARSE_DIRECTION_ROW, &
       n, n, descrA, Ade, n, nnzPerRowA, nnz)
  status = cusparseSdense2csr(h, n, n, descrA, Ade, n, &
       nnzPerRowA, csrValA, csrRowPtrA, csrColIndA)

  ! A is upper circular shift matrix
  ! y = alpha*A*x + beta*y
  alpha = 1.0
  beta = 0.0
  status = cusparseScsrmv(h, CUSPARSE_OPERATION_NON_TRANSPOSE, &
       n, n, n, alpha, descrA, csrValA, csrRowPtrA, &
       csrColIndA, x, beta, y)

  ! shift-down y and add original x
  ! A' is lower circular shift matrix
  ! x = alpha*A'*y + beta*x
  beta = -1.0
  status = cusparseScsrmv(h, CUSPARSE_OPERATION_TRANSPOSE, &
       n, n, n, alpha, descrA, csrValA, csrRowPtrA, &
       csrColIndA, y, beta, x)

  status = cudaDeviceSynchronize()

  write(*,*) 'Shifted vector:'
  write(*,'(5(1x,f7.2))') y

  write(*,*) 'Max error = ', maxval(abs(x))

  if (maxval(abs(x)).le.1.e-5) then
    write(*,*) 'Test PASSED'
  else
    write(*,*) 'Test FAILED'
  endif

end program sparseMatVec

12.13. 从 CUDA Fortran 主机代码使用 cuTENSOR

此示例演示了如何从 CUDA Fortran 使用低级 cuTENSOR 模块(版本 2)来执行重塑置换和跨一个维度的求和归约。

通过将 “-cudalib=cutensor” 选项添加到链接行,可以将此示例编译并链接为普通的 CUDA Fortran 子程序。

来自 CUDA Fortran 的简单 cuTENSOR 测试

program testcutensorcuf1
use cudafor
use cutensor

integer, parameter :: ndim = 3
real, managed, allocatable :: dA(:,:,:), dC(:,:)
real, allocatable :: hA(:,:,:), hC(:,:)
real, device, allocatable :: workbuf(:)
real :: alpha, beta
integer(4) :: numModesA, numModesC
integer(8), dimension(ndim) :: extA, strA, extC, strC
integer(4), dimension(ndim) :: modeA, modeC
integer(8) :: workbufsize

type(cutensorStatus) :: cstat
type(cutensorHandle) :: handle
type(cutensorTensorDescriptor) :: descA, descC
type(cutensorOperationDescriptor) :: rdesc
type(cutensorComputeDescriptor) :: descCompute
type(cutensorPlan) :: plan
type(cutensorAlgo) :: algo
type(cutensorPlanPreference) :: pref

! Init
cstat = cutensorCreate(handle)
if (cstat.ne.CUTENSOR_STATUS_SUCCESS) print *,cutensorGetErrorString(cstat)

descCompute = CUTENSOR_COMPUTE_DESC_32F

allocate(dA(100,60,80))
! This is the operation we are going to perform
! dC = sum(reshape(dA,shape=[80,60,100],order=[3,2,1]),dim=2)
!
call random_number(dA); dA = real(int(dA * 10.0))
extA = shape(dA)
strA(1) =  1; strA(2) = 100; strA(3) = 6000
modeA(1) = 3; modeA(2) = 2; modeA(3) = 1
numModesA = ndim
ialign = 256

print *,"Desc A"
cstat = cutensorCreateTensorDescriptor(handle, descA, numModesA, extA, strA, &
              CUTENSOR_R_32F, ialign)
if (cstat.ne.CUTENSOR_STATUS_SUCCESS) print *,cutensorGetErrorString(cstat)

allocate(dC(80,100))
extC(1:ndim-1) = shape(dC)
strC(1) = 1; strC(2) = 80
numModesC = ndim-1
dC = 0.0
modeC(1) = 1; modeC(2) = 3  ! Skip mode 2 for reduction across that dim

print *,"Desc C"
cstat = cutensorCreateTensorDescriptor(handle, descC, numModesC, extC, strC, &
              CUTENSOR_R_32F, ialign)
if (cstat.ne.CUTENSOR_STATUS_SUCCESS) print *,cutensorGetErrorString(cstat)

print *,"CreateRed "
cstat = cutensorCreateReduction(handle, rdesc, &
              descA, modeA, CUTENSOR_OP_IDENTITY, &
              descC, modeC, CUTENSOR_OP_IDENTITY, &
              descC, modeC, CUTENSOR_OP_ADD, descCompute)
if (cstat.ne.CUTENSOR_STATUS_SUCCESS) print *,cutensorGetErrorString(cstat)

print *,"CreatePlanPref "
cstat = cutensorCreatePlanPreference(handle, pref, CUTENSOR_ALGO_DEFAULT, &
              CUTENSOR_JIT_MODE_NONE)
if (cstat.ne.CUTENSOR_STATUS_SUCCESS) print *,cutensorGetErrorString(cstat)

print *,"EstimateWork "
cstat = cutensorEstimateWorkspaceSize(handle, rdesc, pref, &
              CUTENSOR_WORKSPACE_DEFAULT, workbufsize)
if (cstat.ne.CUTENSOR_STATUS_SUCCESS) print *,cutensorGetErrorString(cstat)

print *,"Estimated workspace size: ",workbufsize

print *,"CreatePlan "
cstat = cutensorCreatePlan(handle, plan, rdesc, pref, workbufsize)
if (cstat.ne.CUTENSOR_STATUS_SUCCESS) print *,cutensorGetErrorString(cstat)

allocate(workbuf((workbufsize+3)/4))

alpha = 1.0; beta = 0.0
print *,"Reduce "
cstat = cutensorReduce(handle, plan, alpha, dA, beta, dC, &
              dC, workbuf, workbufsize, 0)
if (cstat.ne.CUTENSOR_STATUS_SUCCESS) print *,cutensorGetErrorString(cstat)

hA = dA
hC = sum(reshape(hA,[80,60,100],order=[3,2,1]), dim=2)
istat = cudaDeviceSynchronize()  ! Managed memory, to be sure

if (all(hC.eq.dC)) then
  print *,"test PASSED"
else
  print *,"test FAILED"
end if

cstat = cutensorDestroy(handle)
if (cstat.ne.CUTENSOR_STATUS_SUCCESS) print *,cutensorGetErrorString(cstat)
cstat = cutensorDestroyPlan(plan)
if (cstat.ne.CUTENSOR_STATUS_SUCCESS) print *,cutensorGetErrorString(cstat)
cstat = cutensorDestroyPlanPreference(pref)
if (cstat.ne.CUTENSOR_STATUS_SUCCESS) print *,cutensorGetErrorString(cstat)
cstat = cutensorDestroyOperationDescriptor(rdesc)
if (cstat.ne.CUTENSOR_STATUS_SUCCESS) print *,cutensorGetErrorString(cstat)
cstat = cutensorDestroyTensorDescriptor(descA)
if (cstat.ne.CUTENSOR_STATUS_SUCCESS) print *,cutensorGetErrorString(cstat)
cstat = cutensorDestroyTensorDescriptor(descC)
if (cstat.ne.CUTENSOR_STATUS_SUCCESS) print *,cutensorGetErrorString(cstat)

deallocate(workbuf)
deallocate(dA, dC)
deallocate(hA, hC)

end program

12.14. 从 CUDA Fortran 主机代码使用 cuTENSOREX

此示例演示了如何从 CUDA Fortran 使用更高级别的 cuTENSOREX 模块,以使用多个 OpenMP 线程执行大型矩阵乘法。

通过将 “-mp -cudalib=cutensor” 选项添加到编译和链接行,可以将此示例编译并链接为普通的 CUDA Fortran 子程序。

来自 CUDA Fortran 的多线程 cuTENSOREX 示例

! Test cuTensor + cuda Fortran + OMP multi-stream matmul
program testCuCufMsMatmul
use cudafor
use cutensorex

integer, parameter :: m=8192, k=1280, n=1024
integer, parameter :: mblksize = 128
integer, parameter :: mslices = m / mblksize
integer, parameter :: nstreams = 4
integer, parameter :: numtimes = mslices / nstreams

real(8), allocatable, dimension(:,:), device :: a_d, d_d
real(8), allocatable, dimension(:,:,:), pinned :: ha
real(8), dimension(k,n), device :: b_d
real(8), allocatable, dimension(:,:), pinned :: d
real(8) :: alpha
integer(kind=cuda_stream_kind) :: mystream
!$OMP THREADPRIVATE(a_d, d_d, mystream)

allocate( ha(k,mblksize,nstreams))
allocate(  d(1:m,1:n))

b_d   = 1.0d0
alpha = 1.0d0

!$OMP PARALLEL NUM_THREADS(nstreams) PRIVATE(istat)
istat = cudaStreamCreate(mystream)
istat = cudaforSetDefaultStream(mystream)
istat = cutensorExSetStream(mystream)
! At this point, all new allocations will pick up default stream
allocate(a_d(k,mblksize))
allocate(d_d(mblksize,n))
!$OMP END PARALLEL

! Test matmul
!$OMP PARALLEL DO NUM_THREADS(nstreams) PRIVATE(jlcl,jgbl,jend)
do ns = 1, nstreams
    do nt = 1, numtimes
        jgbl = 1 + ((ns-1) + (nt-1)*nstreams)*mblksize
        jend = jgbl + mblksize - 1
        ! Do some host work
        do jlcl = 1, mblksize
            ha(:,jlcl,ns) = dble(jlcl+jgbl-1)
        end do
        ! Move data to the device on default stream
        a_d = ha(:,:,ns)
        ! Matrix multiply on my thread cutensorEx stream
        d_d = alpha * matmul(transpose(a_d),b_d)
        ! Move result back to host on default stream
        d(jgbl:jend,:) = d_d
    end do
end do
! Wait for all threads to finish GPU work
istat = cudaDeviceSynchronize()
nfailed = 0
do j = 1, n
    do i = 1, m
        if (d(i,j) .ne. i*k) then
            if (nfailed .lt. 100) print *,i,j,d(i,j)
            nfailed = nfailed + 1
        end if
    end do
end do
if (nfailed .eq. 0) then
    print *,"test PASSED"
else
    print *,"test FAILED"
endif
end program

12.15. 从 OpenACC 主机代码使用 cuTENSOR

此示例演示了 cuTENSOREX 模块的使用,使用 OpenACC 设备数据调用 Matmul(),以及将 cuTENSOR 库流设置为与 OpenACC 默认流一致。

此示例可以使用或不使用 OpenACC 进行编译和运行。要使用 OpenACC 进行编译,选项为 “-ta=tesla -cuda -cudalib=cutensor”。要在 CPU 上运行,请省略这些选项。

来自 OpenACC 的简单 cuTENSOREX 测试

program testcutensorOpenACC
!@acc use openacc
!@acc use cutensorex
integer, parameter :: ni=1280, nj=1024, nk=960, ntimes=1
real(8) :: a(ni,nk), b(nk,nj), c(ni,nj), d(ni,nj)

call random_number(a)
call random_number(b)
a = dble(int(4.0d0*a - 2.0d0))
b = dble(int(8.0d0*b - 4.0d0))
c = 2.0; d = 0.0

!$acc enter data copyin(a,b,c) create(d)
!@acc istat = cutensorExSetStream(acc_get_cuda_stream(acc_async_sync))
!$acc host_data use_device(a,b,c,d)
do nt = 1, ntimes
  d = c + matmul(a,b)
end do
!$acc end host_data

!$acc update host(d)
print *,sum(d)

do nt = 1, ntimes
!$acc kernels
  do j = 1, nj
    do i = 1, ni
      d(i,j) = c(i,j)
      do k = 1, nk
        d(i,j) = d(i,j) + a(i,k) * b(k,j)
      end do
    end do
  end do
!$acc end kernels
end do
!$acc exit data copyout(d)

print *,sum(d)
end program

通知

注意事项

所有 NVIDIA 设计规范、参考板、文件、图纸、诊断程序、列表和其他文档(统称为“材料”)均按“原样”提供。NVIDIA 不对这些材料做出任何明示、暗示、法定或其他方面的保证,并明确声明不承担所有关于不侵权、适销性和针对特定用途适用性的暗示保证。

提供的信息被认为是准确且可靠的。但是,NVIDIA 公司对使用此类信息造成的后果或因使用此类信息而可能导致的侵犯第三方专利或其他权利的行为不承担任何责任。NVIDIA 公司未通过暗示或其他方式授予任何专利权许可。本出版物中提及的规格如有更改,恕不另行通知。本出版物取代并替换之前提供的所有其他信息。未经 NVIDIA 公司明确书面批准,NVIDIA 公司产品不得用作生命支持设备或系统中的关键组件。

商标

NVIDIA、NVIDIA 徽标、CUDA、CUDA-X、GPUDirect、HPC SDK、NGC、NVIDIA Volta、NVIDIA DGX、NVIDIA Nsight、NVLink、NVSwitch 和 Tesla 是 NVIDIA 公司在美国和其他国家/地区的商标和/或注册商标。其他公司和产品名称可能是与其相关的各自公司的商标。