Class CuBlasNative
- Namespace
- NVMathNet.Interop
- Assembly
- NVMath.Net.dll
Raw P/Invoke bindings for cuBLAS and cuBLASLt.
public static class CuBlasNativeInheritance
Inherited Members
Fields
HeuristicResultSize
Size in bytes of the opaque cublasLtMatmulHeuristicResult_t struct.
Callers must pass a buffer of at least this size to NVMathNet.Interop.CuBlasNative.MatmulAlgoGetHeuristic(System.IntPtr,System.IntPtr,System.IntPtr,System.IntPtr,System.IntPtr,System.IntPtr,System.IntPtr,System.Int32,System.Byte[]).
public const int HeuristicResultSize = 96Field Value
Methods
Check(CuBlasStatus, string?)
Throws NVMathNet.Interop.CuBlasException if status is not
NVMathNet.Interop.CuBlasStatus.Success. Optionally prefixes the message with
context.
public static void Check(CuBlasStatus status, string? context = null)Parameters
statusCuBlasStatuscontextstring?
Create()
Creates a classic cuBLAS handle. Caller must call NVMathNet.Interop.CuBlasNative.Destroy(System.IntPtr) when done.
public static nint Create()Returns
Ddgmm(nint, CuBlasSideMode, int, int, double*, int, double*, int, double*, int)
Double-precision diagonal matrix multiply: C = diag(X) * A (side=Left) or C = A * diag(X) (side=Right).
public static void Ddgmm(nint handle, CuBlasSideMode mode, int m, int n, double* a, int lda, double* x, int incx, double* c, int ldc)Parameters
Destroy(nint)
Destroys a classic cuBLAS handle.
public static void Destroy(nint handle)Parameters
handlenint
Dgemm(nint, CuBlasOperation, CuBlasOperation, int, int, int, double*, double*, int, double*, int, double*, double*, int)
Double-precision GEMM: C = alpha * op(A) * op(B) + beta * C. All matrices must reside in device memory (column-major layout).
public static void Dgemm(nint handle, CuBlasOperation transa, CuBlasOperation transb, int m, int n, int k, double* alpha, double* a, int lda, double* b, int ldb, double* beta, double* c, int ldc)Parameters
handlenint-
Classic cuBLAS handle.
transaCuBlasOperation-
Transpose operation for A.
transbCuBlasOperation-
Transpose operation for B.
mint-
Rows of op(A) and C.
nint-
Columns of op(B) and C.
kint-
Inner dimension.
alphadouble*-
Scalar multiplier for A*B.
adouble*-
Device pointer to A.
ldaint-
Leading dimension of A.
bdouble*-
Device pointer to B.
ldbint-
Leading dimension of B.
betadouble*-
Scalar multiplier for existing C.
cdouble*-
Device pointer to C (in/out).
ldcint-
Leading dimension of C.
DgetrfBatched(nint, int, double**, int, int*, int*, int)
Batched double-precision LU factorisation with partial pivoting.
public static void DgetrfBatched(nint handle, int n, double** aArray, int lda, int* p, int* info, int batchSize)Parameters
handlenint-
cuBLAS handle.
nint-
Order of each matrix.
aArraydouble**-
Device array of device pointers to the matrices.
ldaint-
Leading dimension.
pint*-
Device array of
n * batchSizepivot indices (output). infoint*-
Device array of
batchSizestatus values (output). batchSizeint-
Number of matrices.
DgetrsBatched(nint, CuBlasOperation, int, int, double**, int, int*, double**, int, int*, int)
Batched double-precision solve from LU factors. info is a host int.
public static void DgetrsBatched(nint handle, CuBlasOperation trans, int n, int nrhs, double** aArray, int lda, int* devIpiv, double** bArray, int ldb, int* info, int batchSize)Parameters
handlenint-
cuBLAS handle.
transCuBlasOperation-
Operation applied to A.
nint-
Order of each matrix.
nrhsint-
Right-hand sides per matrix.
aArraydouble**-
Device array of device pointers to the LU factors.
ldaint-
Leading dimension of A.
devIpivint*-
Device pivot array from the factorisation.
bArraydouble**-
Device array of device pointers to the right-hand sides.
ldbint-
Leading dimension of B.
infoint*-
Host status value.
batchSizeint-
Number of matrices.
Dscal(nint, long, double, double*)
Scales a double-precision vector in place: x = alpha * x (64-bit element count).
public static void Dscal(nint handle, long n, double alpha, double* x)Parameters
Dsymm(nint, CuBlasSideMode, CuBlasFillMode, int, int, double*, double*, int, double*, int, double*, double*, int)
Double-precision symmetric matrix-matrix multiply: C = alpha * A * B + beta * C (side=Left) or C = alpha * B * A + beta * C (side=Right) where A is symmetric.
public static void Dsymm(nint handle, CuBlasSideMode side, CuBlasFillMode uplo, int m, int n, double* alpha, double* a, int lda, double* b, int ldb, double* beta, double* c, int ldc)Parameters
handlenintsideCuBlasSideModeuploCuBlasFillModemintnintalphadouble*adouble*ldaintbdouble*ldbintbetadouble*cdouble*ldcint
Dtrsm(nint, CuBlasSideMode, CuBlasFillMode, CuBlasOperation, CuBlasDiagType, int, int, double*, double*, int, double*, int)
Double-precision triangular solve: B = alpha * inv(op(A)) * B (side=Left) or B = alpha * B * inv(op(A)) (side=Right) where A is triangular.
public static void Dtrsm(nint handle, CuBlasSideMode side, CuBlasFillMode uplo, CuBlasOperation trans, CuBlasDiagType diag, int m, int n, double* alpha, double* a, int lda, double* b, int ldb)Parameters
handlenintsideCuBlasSideModeuploCuBlasFillModetransCuBlasOperationdiagCuBlasDiagTypemintnintalphadouble*adouble*ldaintbdouble*ldbint
Hgemm(nint, CuBlasOperation, CuBlasOperation, int, int, int, Half*, Half*, int, Half*, int, Half*, Half*, int)
Half-precision GEMM: C = alpha * op(A) * op(B) + beta * C. All matrices must reside in device memory (column-major layout).
public static void Hgemm(nint handle, CuBlasOperation transa, CuBlasOperation transb, int m, int n, int k, Half* alpha, Half* a, int lda, Half* b, int ldb, Half* beta, Half* c, int ldc)Parameters
handlenint-
Classic cuBLAS handle.
transaCuBlasOperation-
Transpose operation for A.
transbCuBlasOperation-
Transpose operation for B.
mint-
Rows of op(A) and C.
nint-
Columns of op(B) and C.
kint-
Inner dimension.
alphaHalf*-
Scalar multiplier for A*B.
aHalf*-
Device pointer to A.
ldaint-
Leading dimension of A.
bHalf*-
Device pointer to B.
ldbint-
Leading dimension of B.
betaHalf*-
Scalar multiplier for existing C.
cHalf*-
Device pointer to C (in/out).
ldcint-
Leading dimension of C.
LtCreate()
Creates a cuBLASLt handle. Caller must call NVMathNet.Interop.CuBlasNative.LtDestroy(System.IntPtr) when done.
public static nint LtCreate()Returns
LtDestroy(nint)
Destroys a cuBLASLt handle created with NVMathNet.Interop.CuBlasNative.LtCreate.
public static void LtDestroy(nint handle)Parameters
handlenint
Matmul(nint, nint, void*, void*, nint, void*, nint, void*, void*, nint, void*, nint, void*, void*, nuint, nint)
Executes D = alpha * op(A) * op(B) + beta * C on the GPU.
All pointers must point to device memory except algo
which is the opaque algorithm buffer returned by NVMathNet.Interop.CuBlasNative.MatmulAlgoGetHeuristic(System.IntPtr,System.IntPtr,System.IntPtr,System.IntPtr,System.IntPtr,System.IntPtr,System.IntPtr,System.Int32,System.Byte[]).
public static void Matmul(nint ltHandle, nint opDesc, void* alpha, void* a, nint aDesc, void* b, nint bDesc, void* beta, void* c, nint cDesc, void* d, nint dDesc, void* algo, void* workspace, nuint workspaceSize, nint stream)Parameters
ltHandlenintopDescnintalphavoid*avoid*aDescnintbvoid*bDescnintbetavoid*cvoid*cDescnintdvoid*dDescnintalgovoid*workspacevoid*workspaceSizenuintstreamnint
MatmulAlgoGetHeuristic(nint, nint, nint, nint, nint, nint, nint, int, byte[])
Queries cuBLASLt for algorithm suggestions and writes them into
resultsBuffer.
public static int MatmulAlgoGetHeuristic(nint ltHandle, nint opDesc, nint aDesc, nint bDesc, nint cDesc, nint dDesc, nint preference, int maxAlgos, byte[] resultsBuffer)Parameters
ltHandlenintopDescnintaDescnintbDescnintcDescnintdDescnintpreferencenintmaxAlgosintresultsBufferbyte[]
Returns
- int
-
Number of algorithms written (0 if none found).
MatmulDescCreate(CuBlasComputeType, CudaDataType)
Creates a matmul operation descriptor.
public static nint MatmulDescCreate(CuBlasComputeType computeType, CudaDataType scaleType)Parameters
computeTypeCuBlasComputeType-
Compute precision.
scaleTypeCudaDataType-
Data type for alpha/beta scalars.
Returns
MatmulDescDestroy(nint)
Destroys a matmul descriptor.
public static void MatmulDescDestroy(nint desc)Parameters
descnint
MatmulDescSetAttribute(nint, int, void*, nuint)
Sets an attribute on a matmul descriptor (e.g. transpose, epilog).
public static void MatmulDescSetAttribute(nint desc, int attr, void* buf, nuint size)Parameters
MatmulPreferenceCreate()
Creates a matmul algorithm preference descriptor.
public static nint MatmulPreferenceCreate()Returns
MatmulPreferenceDestroy(nint)
Destroys a matmul preference descriptor.
public static void MatmulPreferenceDestroy(nint pref)Parameters
prefnint
MatmulPreferenceSetAttribute(nint, int, void*, nuint)
Sets an attribute on a matmul preference descriptor (e.g. max workspace bytes).
public static void MatmulPreferenceSetAttribute(nint pref, int attr, void* buf, nuint size)Parameters
MatrixLayoutCreate(CudaDataType, ulong, ulong, long)
Creates a matrix layout descriptor.
public static nint MatrixLayoutCreate(CudaDataType type, ulong rows, ulong cols, long ld)Parameters
typeCudaDataTyperowsulongcolsulongldlong
Returns
MatrixLayoutDestroy(nint)
Destroys a matrix layout descriptor.
public static void MatrixLayoutDestroy(nint layout)Parameters
layoutnint
MatrixLayoutSetAttribute(nint, int, void*, nuint)
Sets an attribute on a matrix layout descriptor.
public static void MatrixLayoutSetAttribute(nint layout, int attr, void* buf, nuint size)Parameters
Sdgmm(nint, CuBlasSideMode, int, int, float*, int, float*, int, float*, int)
Single-precision diagonal matrix multiply: C = diag(X) * A (side=Left) or C = A * diag(X) (side=Right).
public static void Sdgmm(nint handle, CuBlasSideMode mode, int m, int n, float* a, int lda, float* x, int incx, float* c, int ldc)Parameters
SetStream(nint, nint)
Associates a CUDA stream with the classic cuBLAS handle.
public static void SetStream(nint handle, nint stream)Parameters
Sgemm(nint, CuBlasOperation, CuBlasOperation, int, int, int, float*, float*, int, float*, int, float*, float*, int)
Single-precision GEMM: C = alpha * op(A) * op(B) + beta * C. All matrices must reside in device memory (column-major layout).
public static void Sgemm(nint handle, CuBlasOperation transa, CuBlasOperation transb, int m, int n, int k, float* alpha, float* a, int lda, float* b, int ldb, float* beta, float* c, int ldc)Parameters
handlenint-
Classic cuBLAS handle.
transaCuBlasOperation-
Transpose operation for A.
transbCuBlasOperation-
Transpose operation for B.
mint-
Rows of op(A) and C.
nint-
Columns of op(B) and C.
kint-
Inner dimension.
alphafloat*-
Scalar multiplier for A*B.
afloat*-
Device pointer to A.
ldaint-
Leading dimension of A.
bfloat*-
Device pointer to B.
ldbint-
Leading dimension of B.
betafloat*-
Scalar multiplier for existing C.
cfloat*-
Device pointer to C (in/out).
ldcint-
Leading dimension of C.
SgetrfBatched(nint, int, float**, int, int*, int*, int)
Batched single-precision LU factorisation with partial pivoting.
public static void SgetrfBatched(nint handle, int n, float** aArray, int lda, int* p, int* info, int batchSize)Parameters
handlenint-
cuBLAS handle.
nint-
Order of each matrix.
aArrayfloat**-
Device array of device pointers to the matrices.
ldaint-
Leading dimension.
pint*-
Device array of
n * batchSizepivot indices (output). infoint*-
Device array of
batchSizestatus values (output). batchSizeint-
Number of matrices.
SgetrsBatched(nint, CuBlasOperation, int, int, float**, int, int*, float**, int, int*, int)
Batched single-precision solve from LU factors. info is a host int.
public static void SgetrsBatched(nint handle, CuBlasOperation trans, int n, int nrhs, float** aArray, int lda, int* devIpiv, float** bArray, int ldb, int* info, int batchSize)Parameters
handlenint-
cuBLAS handle.
transCuBlasOperation-
Operation applied to A.
nint-
Order of each matrix.
nrhsint-
Right-hand sides per matrix.
aArrayfloat**-
Device array of device pointers to the LU factors.
ldaint-
Leading dimension of A.
devIpivint*-
Device pivot array from the factorisation.
bArrayfloat**-
Device array of device pointers to the right-hand sides.
ldbint-
Leading dimension of B.
infoint*-
Host status value.
batchSizeint-
Number of matrices.
Sscal(nint, long, float, float*)
Scales a single-precision vector in place: x = alpha * x (64-bit element count).
public static void Sscal(nint handle, long n, float alpha, float* x)Parameters
Ssymm(nint, CuBlasSideMode, CuBlasFillMode, int, int, float*, float*, int, float*, int, float*, float*, int)
Single-precision symmetric matrix-matrix multiply: C = alpha * A * B + beta * C (side=Left) or C = alpha * B * A + beta * C (side=Right) where A is symmetric.
public static void Ssymm(nint handle, CuBlasSideMode side, CuBlasFillMode uplo, int m, int n, float* alpha, float* a, int lda, float* b, int ldb, float* beta, float* c, int ldc)Parameters
handlenintsideCuBlasSideModeuploCuBlasFillModemintnintalphafloat*afloat*ldaintbfloat*ldbintbetafloat*cfloat*ldcint
Strsm(nint, CuBlasSideMode, CuBlasFillMode, CuBlasOperation, CuBlasDiagType, int, int, float*, float*, int, float*, int)
Single-precision triangular solve: B = alpha * inv(op(A)) * B (side=Left) or B = alpha * B * inv(op(A)) (side=Right) where A is triangular.
public static void Strsm(nint handle, CuBlasSideMode side, CuBlasFillMode uplo, CuBlasOperation trans, CuBlasDiagType diag, int m, int n, float* alpha, float* a, int lda, float* b, int ldb)Parameters
handlenintsideCuBlasSideModeuploCuBlasFillModetransCuBlasOperationdiagCuBlasDiagTypemintnintalphafloat*afloat*ldaintbfloat*ldbint
ZgetrfBatched(nint, int, Complex**, int, int*, int*, int)
Batched complex LU factorisation with partial pivoting.
public static void ZgetrfBatched(nint handle, int n, Complex** aArray, int lda, int* p, int* info, int batchSize)Parameters
ZgetrsBatched(nint, CuBlasOperation, int, int, Complex**, int, int*, Complex**, int, int*, int)
Batched complex solve from LU factors. info is a host int.
public static void ZgetrsBatched(nint handle, CuBlasOperation trans, int n, int nrhs, Complex** aArray, int lda, int* devIpiv, Complex** bArray, int ldb, int* info, int batchSize)Parameters
handleninttransCuBlasOperationnintnrhsintaArrayComplex**ldaintdevIpivint*bArrayComplex**ldbintinfoint*batchSizeint
Ztrsm(nint, CuBlasSideMode, CuBlasFillMode, CuBlasOperation, CuBlasDiagType, int, int, Complex*, Complex*, int, Complex*, int)
Complex double-precision triangular solve: B = alpha * inv(op(A)) * B (side = Left) or B = alpha * B * inv(op(A)) (side = Right).
public static void Ztrsm(nint handle, CuBlasSideMode side, CuBlasFillMode uplo, CuBlasOperation trans, CuBlasDiagType diag, int m, int n, Complex* alpha, Complex* a, int lda, Complex* b, int ldb)Parameters
handlenintsideCuBlasSideModeuploCuBlasFillModetransCuBlasOperationdiagCuBlasDiagTypemintnintalphaComplex*aComplex*ldaintbComplex*ldbint