CUTLASS 2.2 (#96)
Adds support for NVIDIA Ampere Architecture features. CUDA 11 Toolkit recommended.
This commit is contained in:
@@ -88,6 +88,7 @@ tools/
|
||||
cutlass/
|
||||
library/ # header files for CUTLASS Deliverables Library (in cutlass::library:: namespace)
|
||||
|
||||
handle.h # implements a host-side API for launching kernels, similar to cuBLAS
|
||||
library.h # defines enums and structs to describe the tiled structure of operator instances
|
||||
manifest.h # collection of all instances
|
||||
|
||||
@@ -175,6 +176,14 @@ examples/
|
||||
07_volta_tensorop_gemm/ # example demonstrating mixed precision GEMM using Volta Tensor Cores
|
||||
|
||||
08_turing_tensorop_gemm/ # example demonstrating integer GEMM using Turing Tensor Cores
|
||||
|
||||
10_planar_complex/ # example demonstrating planar complex GEMM kernels
|
||||
|
||||
11_planar_complex_array/ # example demonstrating planar complex kernels with batch-specific problem sizes
|
||||
|
||||
12_gemm_bias_relu/ # example demonstrating GEMM fused with bias and relu
|
||||
|
||||
13_fused_two_gemms/ # example demonstrating two GEMms fused in one kernel
|
||||
```
|
||||
|
||||
## Media
|
||||
@@ -211,7 +220,7 @@ of tests run may vary over time as more are added.
|
||||
|
||||
# Copyright
|
||||
|
||||
Copyright (c) 2017-2019, NVIDIA CORPORATION. All rights reserved.
|
||||
Copyright (c) 2017-2020, NVIDIA CORPORATION. All rights reserved.
|
||||
|
||||
```
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted
|
||||
|
||||
@@ -120,7 +120,7 @@ cudaError_t cutlass_sgemm_nn(
|
||||
|
||||
# Copyright
|
||||
|
||||
Copyright (c) 2017-2019, NVIDIA CORPORATION. All rights reserved.
|
||||
Copyright (c) 2017-2020, NVIDIA CORPORATION. All rights reserved.
|
||||
|
||||
```
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted
|
||||
|
||||
@@ -216,6 +216,7 @@ participating warps - since each warp now owns a partial sum (since they compute
|
||||
The following additional resources describe design and implementation details of GEMMs
|
||||
targeting NVIDIA GPUs.
|
||||
|
||||
- [Developing CUDA Kernels to Push Tensor Cores to the Absolute Limit on NVIDIA A100.](https://www.nvidia.com/en-us/gtc) (SR 21745)
|
||||
- [CUTLASS: Fast Linear Algebra in CUDA C++](https://devblogs.nvidia.com/cutlass-linear-algebra-cuda/)
|
||||
- [CUTLASS: SOFTWARE PRIMITIVES FOR DENSE LINEAR ALGEBRA AT ALL LEVELS AND SCALES WITHIN CUDA](https://on-demand-gtc.gputechconf.com/gtcnew/sessionview.php?sessionName=s8854-cutlass%3a+software+primitives+for+dense+linear+algebra+at+all+levels+and+scales+within+cuda)
|
||||
- [Programming Tensor Cores: NATIVE VOLTA TENSOR CORES WITH CUTLASS](https://developer.download.nvidia.com/video/gputechconf/gtc/2019/presentation/s9593-cutensor-high-performance-tensor-operations-in-cuda-v2.pdf)
|
||||
@@ -224,7 +225,7 @@ targeting NVIDIA GPUs.
|
||||
|
||||
# Copyright
|
||||
|
||||
Copyright (c) 2017-2019, NVIDIA CORPORATION. All rights reserved.
|
||||
Copyright (c) 2017-2020, NVIDIA CORPORATION. All rights reserved.
|
||||
|
||||
```
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted
|
||||
|
||||
@@ -27,7 +27,16 @@ Hyperlinks to relevant unit tests demonstrate how specific template instances ma
|
||||
| **TensorOp** | 75 | 10.2+ | `s8 * s8 + s32 => {s32, s8}` | { T } x { N } => {N,T} | [example](/test/unit/gemm/device/gemm_s8t_s8n_s32n_tensor_op_s32_sm75.cu) |
|
||||
| **TensorOp** | 75 | 10.2+ | `s4 * s4 + s32 => {s32, s4}` | { T } x { N } => {N,T} | [example](/test/unit/gemm/device/gemm_s4t_s4n_s32n_tensor_op_s32_sm75.cu) |
|
||||
| **TensorOp** | 75 | 10.2+ | `b1 ^ b1 + s32 => {s32, b1}` | { T } x { N } => {N,T} | [example](/test/unit/gemm/device/gemm_b1t_b1n_s32n_tensor_op_s32_sm75.cu) |
|
||||
|
||||
| **TensorOp** | 80 | 11.0+ | `f16 * f16 + f16 => f16` | {N,T} x {N,T} => {N,T} | [example](/test/unit/gemm/device/gemm_f16n_f16t_f16t_tensor_op_f16_sm80.cu) |
|
||||
| **TensorOp** | 80 | 11.0+ | `f16 * f16 + f32 => {f16, f32}`| {N,T} x {N,T} => {N,T} | [example](/test/unit/gemm/device/gemm_f16n_f16t_f16t_tensor_op_f32_sm80.cu) |
|
||||
| **TensorOp** | 80 | 11.0+ | `bf16 * bf16 + f32 => {bf16, f32}`| {N,T} x {N,T} => {N,T} | [example](/test/unit/gemm/device/gemm_bf16n_bf16t_bf16t_tensor_op_f32_sm80.cu) |
|
||||
| **TensorOp** | 80 | 11.0+ | `tf32 * tf32 + f32 => f32`| {N,T} x {N,T} => {N,T} | [example](/test/unit/gemm/device/gemm_f32n_f32t_f32t_tensor_op_f32_sm80.cu) |
|
||||
| **TensorOp** | 80 | 11.0+ | `s8 * s8 + s32 => {s32, s8}` | { T } x { N } => {N,T} | [example](/test/unit/gemm/device/gemm_s8t_s8n_s32n_tensor_op_s32_sm80.cu) |
|
||||
| **TensorOp** | 80 | 11.0+ | `s4 * s4 + s32 => {s32, s4}` | { T } x { N } => {N,T} | [example](/test/unit/gemm/device/gemm_s4t_s4n_s32n_tensor_op_s32_sm80.cu) |
|
||||
| **TensorOp** | 80 | 11.0+ | `b1 ^ b1 + s32 => {s32, b1}` | { T } x { N } => {N,T} | [example](/test/unit/gemm/device/gemm_b1t_b1n_s32n_tensor_op_s32_sm80.cu) |
|
||||
| **TensorOp** | 80 | 11.0+ | `f64 * f64 + f64 => f64` | {N,T} x {N,T} => {N,T} | [example](/test/unit/gemm/device/gemm_f64n_f64t_f64t_tensor_op_f64_sm80.cu) |
|
||||
| **TensorOp** | 80 | 11.0+ | `cf32 * cf32 + cf32 => cf32` | {N,T} x {N,T} => {N,T} | [example](/test/unit/gemm/device/gemm_cf32n_cf32t_cf32t_tensor_op_tf32_f32_sm80.cu) |
|
||||
| **TensorOp** | 80 | 11.0+ | `cf64 * cf64 + cf64 => cf64` | {N,T} x {N,T} => {N,T} | [example](/test/unit/gemm/device/gemm_cf64n_cf64t_cf64t_tensor_op_f64_sm80.cu), [Gaussian 3m](/test/unit/gemm/device/gemm_cf64n_cf64t_cf64t_tensor_op_f64_gaussian_sm80.cu) |
|
||||
|
||||
## Warp-level Matrix Multiply with Tensor Cores
|
||||
|
||||
@@ -37,9 +46,13 @@ The following table summarizes supported warp level shapes for each TensorOp ins
|
||||
|-----------------|-----------------------|--------------------------------------------|
|
||||
| **TensorOp** | 8-by-8-by-4 | 32x32x4, 32x64x4, 64x32x4, 64x64x4 |
|
||||
| **TensorOp** | 16-by-8-by-8 | 32x32x8, 32x64x8, 64x32x8, 64x64x8 |
|
||||
| **TensorOp** | 16-by-8-by-16 | 32x32x16, 32x64x16, 64x32x16, 64x64x16 |
|
||||
| **TensorOp** | 8-by-8-by-16 | 32x32x16, 32x64x16, 64x32x16, 64x64x16 |
|
||||
| **TensorOp** | 8-by-8-by-32 | 32x32x32, 32x64x32, 64x32x32, 64x64x32 |
|
||||
| **TensorOp** | 16-by-8-by-32 | 32x32x32, 32x64x32, 64x32x32, 64x64x32 |
|
||||
| **TensorOp** | 16-by-8-by-64 | 32x32x64, 32x64x64, 64x32x64, 64x64x64 |
|
||||
| **TensorOp** | 8-by-8-by-128 | 32x32x128, 32x64x128, 64x32x128, 64x64x128 |
|
||||
| **TensorOp** | 16-by-8-by-256 | 32x32x256, 32x64x256, 64x32x256, 64x64x256 |
|
||||
|
||||
TensorOp instructions depend on a permuted shared memory layout that can be efficiently
|
||||
loaded from. The following tables summarize the destination shared memory layout that
|
||||
@@ -68,6 +81,38 @@ from global memory with layout specified in the column "GMEM Layout."
|
||||
| **C** | `half_t` | `RowMajor` | `RowMajor` |
|
||||
| **C** | `float` | `RowMajor` | `RowMajor` |
|
||||
|
||||
**TensorOp 16-by-8-by-8.**
|
||||
|
||||
|**Operand**|**Element** | **GMEM Layout** | **SMEM Layout** |
|
||||
|-----------|--------------|-----------------|------------------------------------|
|
||||
| **A** | `tfloat32_t` | `ColumnMajor` | `ColumnMajorTensorOpCongruous<32>` |
|
||||
| **A** | `tfloat32_t` | `RowMajor` | `RowMajorTensorOpCrosswise<32>` |
|
||||
| **B** | `tfloat32_t` | `ColumnMajor` | `ColumnMajorTensorOpCrosswise<32>` |
|
||||
| **B** | `tfloat32_t` | `RowMajor` | `RowMajorTensorOpCongruous<32>` |
|
||||
| **C** | `float` | `RowMajor` | `RowMajor` |
|
||||
|
||||
|
||||
**TensorOp 16-by-8-by-16.**
|
||||
|
||||
|**Operand**|**Element** | **GMEM Layout** | **SMEM Layout** |
|
||||
|-----------|--------------|-----------------|------------------------------------|
|
||||
| **A** | `half_t`, `bfloat16_t` | `ColumnMajor` | `ColumnMajorTensorOpCongruous<16>` |
|
||||
| **A** | `half_t`, `bfloat16_t` | `RowMajor` | `RowMajorTensorOpCrosswise<16>` |
|
||||
| **B** | `half_t`, `bfloat16_t` | `ColumnMajor` | `ColumnMajorTensorOpCrosswise<16>` |
|
||||
| **B** | `half_t`, `bfloat16_t` | `RowMajor` | `RowMajorTensorOpCongruous<16>` |
|
||||
| **C** | `half_t` | `RowMajor` | `RowMajor` |
|
||||
| **C** | `float` | `RowMajor` | `RowMajor` |
|
||||
|
||||
**TensorOp 8-by-8-by-4.**
|
||||
|
||||
|**Operand**|**Element** | **GMEM Layout** | **SMEM Layout** |
|
||||
|-----------|--------------|-----------------|------------------------------------|
|
||||
| **A** | `double` | `ColumnMajor` | `ColumnMajorTensorOpCongruous<64>` |
|
||||
| **A** | `double` | `RowMajor` | `RowMajorTensorOpCrosswise<64>` |
|
||||
| **B** | `double` | `ColumnMajor` | `ColumnMajorTensorOpCrosswise<64>` |
|
||||
| **B** | `double` | `RowMajor` | `RowMajorTensorOpCongruous<64>` |
|
||||
| **C** | `double` | `RowMajor` | `RowMajor` |
|
||||
|
||||
**TensorOp 8-by-8-by-16.**
|
||||
|
||||
|**Operand**|**Element** | **GMEM Layout** | **SMEM Layout** |
|
||||
@@ -76,6 +121,14 @@ from global memory with layout specified in the column "GMEM Layout."
|
||||
| **B** | `int8_t` | `ColumnMajor` | `ColumnMajorTensorOpCongruous<8>` |
|
||||
| **C** | `int32_t` | `RowMajor` | `RowMajor` |
|
||||
|
||||
**TensorOp 16-by-8-by-32.**
|
||||
|
||||
|**Operand**|**Element** | **GMEM Layout** | **SMEM Layout** |
|
||||
|-----------|--------------|-----------------|------------------------------------|
|
||||
| **A** | `int8_t` | `RowMajor` | `RowMajorTensorOpCrosswise<8>` |
|
||||
| **B** | `int8_t` | `ColumnMajor` | `ColumnMajorTensorOpCongruous<8>` |
|
||||
| **C** | `int32_t` | `RowMajor` | `RowMajor` |
|
||||
|
||||
**TensorOp 8-by-8-by-32.**
|
||||
|
||||
|**Operand**|**Element** | **GMEM Layout** | **SMEM Layout** |
|
||||
@@ -84,6 +137,14 @@ from global memory with layout specified in the column "GMEM Layout."
|
||||
| **B** | `int4b_t` | `ColumnMajor` | `ColumnMajorTensorOpCongruous<4>` |
|
||||
| **C** | `int32_t` | `RowMajor` | `RowMajor` |
|
||||
|
||||
**TensorOp 16-by-8-by-64.**
|
||||
|
||||
|**Operand**|**Element** | **GMEM Layout** | **SMEM Layout** |
|
||||
|-----------|--------------|-----------------|------------------------------------|
|
||||
| **A** | `int4b_t` | `RowMajor` | `RowMajorTensorOpCrosswise<4>` |
|
||||
| **B** | `int4b_t` | `ColumnMajor` | `ColumnMajorTensorOpCongruous<4>` |
|
||||
| **C** | `int32_t` | `RowMajor` | `RowMajor` |
|
||||
|
||||
**TensorOp 8-by-8-by-128.**
|
||||
|
||||
|**Operand**|**Element** | **GMEM Layout** | **SMEM Layout** |
|
||||
@@ -119,7 +180,7 @@ CUDA exposes warp-level matrix operations in the CUDA C++ WMMA API. The CUDA C++
|
||||
|
||||
# Copyright
|
||||
|
||||
Copyright (c) 2017-2019, NVIDIA CORPORATION. All rights reserved.
|
||||
Copyright (c) 2017-2020, NVIDIA CORPORATION. All rights reserved.
|
||||
|
||||
```
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted
|
||||
|
||||
@@ -16,6 +16,8 @@ Most types in CUTLASS are usable in both host code and device code. Moreover, th
|
||||
CUTLASS defines classes for the following numeric data types.
|
||||
|
||||
* `half_t`: IEEE half-precision floating point (exponent: 5b, mantissa: 10b; literal suffix `_hf`)
|
||||
* `bfloat16_t`: BFloat16 data type (exponent: 8b, mantissa: 7b; literal suffix `_bf16`)
|
||||
* `tfloat32_t`: Tensor Float 32 data type (exponent: 8b, mantissa: 10b; literal suffix `_tf32`)
|
||||
* `int4_t`, `uint4_t`: 4b signed and unsigned integer (literal suffx `_s4`, `_u4`)
|
||||
* `bin1_t`: 1b binary numeric type (literal suffix `_b1`)
|
||||
* `complex<T>`: defines complex-valued data type based on the supplied real-valued numeric type
|
||||
@@ -182,6 +184,39 @@ AlignedArray<half_t, 8> *ptr = reinterpret_cast<AlignedArray<half_t, 8> *>(smem_
|
||||
AlignedArray<half_t, 8> x = ptr[threadIdx.x]; // 128b shared memory load
|
||||
```
|
||||
|
||||
### Numeric Conversion
|
||||
|
||||
CUTLASS defines procedures for performing numeric conversion between data types in `cutlass/numeric_conversion.h`.
|
||||
Where possible, these target hardware acceleration on the target architecture and support multiple rounding modes.
|
||||
|
||||
```c++
|
||||
#include "cutlass/numeric_conversion.h"
|
||||
#include "cutlass/numeric_types.h"
|
||||
|
||||
NumericConverter<half_t, float> convert_f32_to_f16;
|
||||
NumericConverter<tfloat32_t, float> convert_f32_to_tf32;
|
||||
|
||||
half_t x = convert_f32_to_f16(3.14159f);
|
||||
tfloat32_t y = convert_f32_to_tf32(3.14159f);
|
||||
```
|
||||
|
||||
Recent GPU architectures such as NVIDIA Turing and Ampere combine numeric conversion with efficient packing
|
||||
into bit vectors. Consequently, CUTLASS defines conversion on both scalars and `Array<>` objects to implement
|
||||
the optimal code sequence on all architectures.
|
||||
|
||||
```c++
|
||||
//
|
||||
// Example: convert and pack 32b signed integers to a vector of packed signed 8-bit integers.
|
||||
//
|
||||
int const kN = 16;
|
||||
Array<int8_t, kN> destination;
|
||||
Array<int, kN> source;
|
||||
|
||||
NumericConverter<descltype(destination), decltype(source)> convert;
|
||||
|
||||
destination = convert(source);
|
||||
```
|
||||
|
||||
### Coord
|
||||
|
||||
```c++
|
||||
@@ -311,7 +346,7 @@ support on current and future NVIDIA GPUs.
|
||||
|
||||
# Copyright
|
||||
|
||||
Copyright (c) 2017-2019, NVIDIA CORPORATION. All rights reserved.
|
||||
Copyright (c) 2017-2020, NVIDIA CORPORATION. All rights reserved.
|
||||
|
||||
```
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted
|
||||
|
||||
@@ -514,7 +514,7 @@ to inline PTX.
|
||||
|
||||
# Copyright
|
||||
|
||||
Copyright (c) 2017-2019, NVIDIA CORPORATION. All rights reserved.
|
||||
Copyright (c) 2017-2020, NVIDIA CORPORATION. All rights reserved.
|
||||
|
||||
```
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted
|
||||
|
||||
@@ -267,7 +267,7 @@ Permuted Shared Memory Layouts:
|
||||
|
||||
# Copyright
|
||||
|
||||
Copyright (c) 2017-2019, NVIDIA CORPORATION. All rights reserved.
|
||||
Copyright (c) 2017-2020, NVIDIA CORPORATION. All rights reserved.
|
||||
|
||||
```
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted
|
||||
|
||||
+43
-35
@@ -15,7 +15,7 @@ $ make cutlass_profiler -j
|
||||
To limit compilation time, only one tile size (128x128) is instantiated for each data type, math instruction, and layout.
|
||||
To instantiate all sizes, set the following environment variable when running CMake from an empty `build/` directory.
|
||||
```bash
|
||||
$ cmake .. -DCUTLASS_NVCC_ARCHS=75 -DCUTLASS_LIBRARY_KERNELS=all
|
||||
$ cmake .. -DCUTLASS_NVCC_ARCHS="70;75;80" -DCUTLASS_LIBRARY_KERNELS=all
|
||||
...
|
||||
$ make cutlass_profiler -j
|
||||
```
|
||||
@@ -102,7 +102,7 @@ Report:
|
||||
--verbose=<bool> If true (default), prints human-readable text to stdout.
|
||||
|
||||
About:
|
||||
--version CUTLASS 2.0.0 built on Nov 19 2019 at 13:01:00
|
||||
--version CUTLASS 2.2.0 built on Jun 8 2020 at 07:59:33
|
||||
|
||||
Operations:
|
||||
--operation=<operation_name> Specifies a particular operation to run or print the usage statement.
|
||||
@@ -191,29 +191,34 @@ Test your changes to gemm kernels with a quick functional test and save results
|
||||
|
||||
Example command line for profiling SGEMM kernels is as follows:
|
||||
```bash
|
||||
$ ./tools/profiler/cutlass_profiler --kernels=sgemm --m=4352 --n=4096 --k=4096
|
||||
$ ./tools/profiler/cutlass_profiler --kernels=sgemm --m=3456 --n=4096 --k=4096
|
||||
|
||||
|
||||
|
||||
=============================
|
||||
Problem ID: 1
|
||||
|
||||
Provider: CUTLASS
|
||||
Operation: cutlass_simt_sgemm_128x128_nn
|
||||
Provider: CUTLASS
|
||||
OperationKind: gemm
|
||||
Operation: cutlass_simt_sgemm_128x128_8x2_nn_align1
|
||||
|
||||
Disposition: Passed
|
||||
Status: Success
|
||||
Status: Success
|
||||
Verification: ON
|
||||
Disposition: Passed
|
||||
|
||||
Arguments: --m=4352 --n=4096 --k=4096 --A=f32:column --B=f32:column --C=f32:column --alpha=1 --beta=0 \
|
||||
--split_k_slices=1 --batch_count=1 --op_class=simt --accum=f32 --cta_m=128 --cta_n=128 --cta_k=8 \
|
||||
--stages=2 --warps_m=2 --warps_n=2 --warps_k=1 --inst_m=1 --inst_n=1 --inst_k=1 --min_cc=50 \
|
||||
--max_cc=1024
|
||||
cuBLAS: Passed
|
||||
|
||||
Bytes: 52428800 bytes
|
||||
FLOPs: 146064539648 flops
|
||||
Arguments: --m=3456 --n=4096 --k=4096 --A=f32:column --B=f32:column --C=f32:column --alpha=1 --beta=0 --split_k_slices=1 \
|
||||
--batch_count=1 --op_class=simt --accum=f32 --cta_m=128 --cta_n=128 --cta_k=8 --stages=2 --warps_m=4 \
|
||||
--warps_n=2 --warps_k=1 --inst_m=1 --inst_n=1 --inst_k=1 --min_cc=50 --max_cc=1024
|
||||
|
||||
Runtime: 10.5424 ms
|
||||
Memory: 4.63158 GiB/s
|
||||
Bytes: 180355072 bytes
|
||||
FLOPs: 115992428544 flops
|
||||
|
||||
Math: 13854.9 GFLOP/s
|
||||
Runtime: 6.73655 ms
|
||||
Memory: 24.934 GiB/s
|
||||
|
||||
Math: 17218.4 GFLOP/s
|
||||
```
|
||||
|
||||
Note, the arguments which appear in the output may be used as command line parameters for subsequent invocations.
|
||||
@@ -224,31 +229,34 @@ Note, the arguments which appear in the output may be used as command line param
|
||||
To execute kernels targeting Tensor Core operations, supply the flag `--op_class=tensorop` in the command line.
|
||||
|
||||
```bash
|
||||
$ ./tools/profiler/cutlass_profiler --op_class=tensorop
|
||||
$ ./tools/profiler/cutlass_profiler --op_class=tensorop --m=3456 --n=4096 --k=8192
|
||||
|
||||
|
||||
|
||||
=============================
|
||||
Problem ID: 1
|
||||
|
||||
Provider: CUTLASS
|
||||
Operation: cutlass_turing_h1688gemm_128x128_nt
|
||||
Provider: CUTLASS
|
||||
OperationKind: gemm
|
||||
Operation: cutlass_tensorop_s16816gemm_f16_256x128_32x3_nn_align8
|
||||
|
||||
Disposition: Passed
|
||||
Status: Success
|
||||
Status: Success
|
||||
Verification: ON
|
||||
Disposition: Passed
|
||||
|
||||
Arguments: --m=4352 --n=4096 --k=4096 --A=f16:column --B=f16:row --C=f16:column --alpha=1 --beta=0 \
|
||||
--op_class=tensorop --accum=f16 --cta_m=128 --cta_n=128 --cta_k=32 --stages=2 \
|
||||
--warps_m=2 --warps_n=2 --warps_k=1 --inst_m=16 --inst_n=8 --inst_k=8 \
|
||||
--min_cc=75 --max_cc=1024
|
||||
cuBLAS: Passed
|
||||
|
||||
Arguments: --m=3456 --n=4096 --k=8192 --A=f16:column --B=f16:column --C=f32:column --alpha=1 --beta=0 --split_k_slices=1 \
|
||||
--batch_count=1 --op_class=tensorop --accum=f32 --cta_m=256 --cta_n=128 --cta_k=32 --stages=3 --warps_m=4 \
|
||||
--warps_n=2 --warps_k=1 --inst_m=16 --inst_n=8 --inst_k=16 --min_cc=80 --max_cc=1024
|
||||
|
||||
Bytes: 52428800 bytes
|
||||
FLOPs: 146064539648 flops
|
||||
Bytes: 180355072 bytes
|
||||
FLOPs: 231956545536 flops
|
||||
|
||||
Runtime: 1.51255 ms
|
||||
Memory: 32.2821 GiB/s
|
||||
|
||||
Math: 96568.7 GFLOP/s
|
||||
Runtime: 0.98647 ms
|
||||
Memory: 170.272 GiB/s
|
||||
|
||||
Math: 235138 GFLOP/s
|
||||
```
|
||||
|
||||
## Covering the problem space
|
||||
@@ -271,7 +279,7 @@ with the `--output=<filename.csv>` command line option as shown:
|
||||
|
||||
```bash
|
||||
$ ./tools/profiler/cutlass_profiler --kernels=cutlass_simt_sgemm_128x128_nn \
|
||||
--m=4352 --n=4096 --k=8:4096:8 --output=report.csv
|
||||
--m=3456 --n=4096 --k=8:4096:8 --output=report.csv
|
||||
```
|
||||
|
||||
To faclitate generation of pivot tables and charts, additional columns may be prepended with the
|
||||
@@ -279,13 +287,13 @@ To faclitate generation of pivot tables and charts, additional columns may be pr
|
||||
|
||||
```bash
|
||||
$ ./tools/profiler/cutlass_profiler --kernels=cutlass_simt_sgemm_128x128_nn \
|
||||
--m=4352 --n=4096 --k=8:4096:8 --output=report.csv \
|
||||
--tags=cutlass:2.0,date:2019-11-19
|
||||
--m=3456 --n=4096 --k=8:4096:8 --output=report.csv \
|
||||
--tags=cutlass:2.2,date:2020-06-08
|
||||
```
|
||||
|
||||
# Copyright
|
||||
|
||||
Copyright (c) 2017-2019, NVIDIA CORPORATION. All rights reserved.
|
||||
Copyright (c) 2017-2020, NVIDIA CORPORATION. All rights reserved.
|
||||
|
||||
```
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted
|
||||
|
||||
@@ -104,6 +104,14 @@ for (int idx = 0; idx < kN; ++idx) { // Loop has constant number of iterati
|
||||
|
||||
## Style
|
||||
|
||||
### C++ Style
|
||||
|
||||
CUTLASS source code follows the
|
||||
[Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) with exceptions and extensions.
|
||||
|
||||
Design choices should be consistent with the
|
||||
[CppCoreGuidelines](https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md) recommendations by Stroustrup and Sutter.
|
||||
|
||||
### CUDA Built-in Variables
|
||||
|
||||
Avoid direct access to CUDA built-in variables `threadIdx`, `blockIdx`, `blockDim`, and `gridDim` within
|
||||
@@ -132,14 +140,6 @@ In particular, be sure to use:
|
||||
Avoid defining alternative implementations of the same functionality. Instead, prefer to enhance
|
||||
or extend additional components where it makes sense.
|
||||
|
||||
### C++ Style
|
||||
|
||||
CUTLASS source code follows the
|
||||
[Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) with exceptions and extensions.
|
||||
|
||||
Design choices should be consistent with the
|
||||
[CppCoreGuidelines](https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md) recommendations by Stroustrup and Sutter.
|
||||
|
||||
### Classes and Structs
|
||||
|
||||
Type names use `CapitalLetters` except when implementations are a _perfect_ drop-in replacement for
|
||||
@@ -178,9 +178,10 @@ Members within classes and structures should be organized as follows:
|
||||
3. Constructors
|
||||
4. Other methods
|
||||
|
||||
This convention follows the [CUB library](https://nvlabs.github.io/cub/),
|
||||
and it also approximates the usual order of Systems and Controls textbooks. That is, they start by
|
||||
(1.) identifying relevant constants, (2.) define a state-space representation of the dynamical system
|
||||
This convention follows the [CUB library](https://nvlabs.github.io/cub/) and is also described by
|
||||
[Howard Hinnant](https://howardhinnant.github.io/classdecl.html). Unsurprisingly, it approximates
|
||||
the usual ordering of chapters in a typical Systems and Controls textbook. That is,
|
||||
(1.) identify relevant constants, (2.) define a state-space representation of the dynamical system
|
||||
under study (i.e. the data members), and (3.) devote subsequent chapters to definining dynamical behavior
|
||||
of the system (i.e. the methods).
|
||||
|
||||
@@ -291,7 +292,7 @@ Github's pretty printer.
|
||||
|
||||
# Copyright
|
||||
|
||||
Copyright (c) 2017-2019, NVIDIA CORPORATION. All rights reserved.
|
||||
Copyright (c) 2017-2020, NVIDIA CORPORATION. All rights reserved.
|
||||
|
||||
```
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted
|
||||
|
||||
+63
-27
@@ -7,7 +7,7 @@
|
||||
## Prerequisites
|
||||
|
||||
CUTLASS requires:
|
||||
- NVIDIA CUDA Toolkit (9.2 or later required, 10.2 recommended)
|
||||
- NVIDIA CUDA Toolkit (9.2 or later required, [11.0](https://developer.nvidia.com/cuda-toolkit) recommended)
|
||||
- CMake 3.12+
|
||||
- host compiler supporting C++11 or greater (g++ 7.3.0 or Microsoft Visual Studio 2015 recommended)
|
||||
- Python 3.6+
|
||||
@@ -20,23 +20,7 @@ $ export CUDACXX=${CUDA_INSTALL_PATH}/bin/nvcc
|
||||
|
||||
$ mkdir build && cd build
|
||||
|
||||
$ cmake .. -DCUTLASS_NVCC_ARCHS=75 # compiles for NVIDIA's Turing GPU architecture
|
||||
```
|
||||
|
||||
## Clang
|
||||
|
||||
For experimental purposes, CUTLASS may be compiled with
|
||||
[clang 8.0](https://github.com/llvm/llvm-project/releases/download/llvmorg-8.0.1/clang+llvm-8.0.1-amd64-unknown-freebsd11.tar.xz) using the
|
||||
[CUDA 10.0 Toolkit](https://developer.nvidia.com/cuda-10.0-download-archive).
|
||||
At this time, compiling with clang enables the CUTLASS SIMT GEMM kernels (sgemm, dgemm, hgemm, igemm)
|
||||
but does not enable TensorCores.
|
||||
|
||||
```bash
|
||||
$ mkdir build && cd build
|
||||
|
||||
$ cmake -DCUDA_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ..
|
||||
|
||||
$ make test_unit -j
|
||||
$ cmake .. -DCUTLASS_NVCC_ARCHS=80 # compiles for NVIDIA Ampere GPU architecture
|
||||
```
|
||||
|
||||
## Build and run the CUTLASS Profiler
|
||||
@@ -120,6 +104,53 @@ $ make test_unit_gemm_warp -j
|
||||
[100%] Built target test_unit_gemm_warp
|
||||
```
|
||||
|
||||
## Building for Multiple Architectures
|
||||
|
||||
To minimize compilation time, specific GPU architectures can be enabled via the CMake command,
|
||||
selected by [CUDA Compute Capability.](https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#compute-capabilities)
|
||||
|
||||
**NVIDIA Ampere Architecture.**
|
||||
```bash
|
||||
$ cmake .. -DCUTLASS_NVCC_ARCHS=80 # compiles for NVIDIA Ampere GPU architecture
|
||||
```
|
||||
|
||||
**NVIDIA Turing Architecture.**
|
||||
```bash
|
||||
$ cmake .. -DCUTLASS_NVCC_ARCHS=75 # compiles for NVIDIA Turing GPU architecture
|
||||
```
|
||||
|
||||
**NVIDIA Volta Architecture.**
|
||||
```bash
|
||||
$ cmake .. -DCUTLASS_NVCC_ARCHS=70 # compiles for NVIDIA Volta GPU architecture
|
||||
```
|
||||
|
||||
**NVIDIA Pascal Architecture.**
|
||||
```bash
|
||||
$ cmake .. -DCUTLASS_NVCC_ARCHS="60;61" # compiles for NVIDIA Pascal GPU architecture
|
||||
```
|
||||
|
||||
**NVIDIA Maxwell Architecture.**
|
||||
```bash
|
||||
$ cmake .. -DCUTLASS_NVCC_ARCHS="50;53" # compiles for NVIDIA Maxwell GPU architecture
|
||||
```
|
||||
|
||||
## Clang
|
||||
|
||||
For experimental purposes, CUTLASS may be compiled with
|
||||
[clang 8.0](https://github.com/llvm/llvm-project/releases/download/llvmorg-8.0.1/clang+llvm-8.0.1-amd64-unknown-freebsd11.tar.xz) using the
|
||||
[CUDA 10.0 Toolkit](https://developer.nvidia.com/cuda-10.0-download-archive).
|
||||
At this time, compiling with clang enables the CUTLASS SIMT GEMM kernels (sgemm, dgemm, hgemm, igemm)
|
||||
but does not enable TensorCores.
|
||||
|
||||
```bash
|
||||
$ mkdir build && cd build
|
||||
|
||||
$ cmake -DCUDA_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ..
|
||||
|
||||
$ make test_unit -j
|
||||
```
|
||||
|
||||
|
||||
## Using CUTLASS within other applications
|
||||
|
||||
Applications should list [`/include`](/include) within their include paths. They must be
|
||||
@@ -143,10 +174,10 @@ int main() {
|
||||
|
||||
## Launching a GEMM kernel in CUDA
|
||||
|
||||
**Example:** launch a mixed-precision GEMM targeting Volta Tensor Cores.
|
||||
**Example:** launch a mixed-precision GEMM targeting Turing Tensor Cores.
|
||||
```c++
|
||||
#include <cutlass/numeric_types.h>
|
||||
#include <cutlas/gemm/device/gemm.h>
|
||||
#include <cutlass/gemm/device/gemm.h>
|
||||
#include <cutlass/util/host_tensor.h>
|
||||
|
||||
int main() {
|
||||
@@ -161,7 +192,7 @@ int main() {
|
||||
cutlass::layout::ColumnMajor, // LayoutOutput
|
||||
float, // ElementAccumulator
|
||||
cutlass::arch::OpClassTensorOp, // tag indicating Tensor Cores
|
||||
cutlass::arch::Sm70 // tag indicating target GPU compute architecture
|
||||
cutlass::arch::Sm75 // tag indicating target GPU compute architecture
|
||||
>;
|
||||
|
||||
Gemm gemm_op;
|
||||
@@ -193,7 +224,7 @@ int main() {
|
||||
int lda = A.device_ref().stride(0);
|
||||
int ldb = B.device_ref().stride(0);
|
||||
int ldc = C.device_ref().stride(0);
|
||||
int ldd = D.device_ref().stride(0);
|
||||
int ldd = C.device_ref().stride(0);
|
||||
//
|
||||
// Launch GEMM on the device
|
||||
//
|
||||
@@ -372,9 +403,14 @@ To instantiate kernels of all tile sizes, data types, and alignment constraints,
|
||||
|
||||
Several recipes are defined below for convenience. They may be combined as a comma-delimited list.
|
||||
|
||||
**Example.** All kernels for Volta and Turing architectures.
|
||||
**Example.** All GEMM kernels targeting NVIDIA Ampere Tensor Cores.
|
||||
```bash
|
||||
$ cmake .. -DCUTLASS_NVCC_ARCHS="70;75" -DCUTLASS_LIBRARY_KERNELS=all
|
||||
$ cmake .. -DCUTLASS_NVCC_ARCHS=80 -DCUTLASS_LIBRARY_KERNELS=tensorop*gemm
|
||||
```
|
||||
|
||||
**Example.** All kernels for NVIDIA Volta, Turing, and Ampere architectures.
|
||||
```bash
|
||||
$ cmake .. -DCUTLASS_NVCC_ARCHS="70;75;80" -DCUTLASS_LIBRARY_KERNELS=all
|
||||
```
|
||||
|
||||
**Example.** All GEMM kernels targeting Turing Tensor Cores.
|
||||
@@ -384,17 +420,17 @@ $ cmake .. -DCUTLASS_NVCC_ARCHS=75 -DCUTLASS_LIBRARY_KERNELS=tensorop*gemm
|
||||
|
||||
**Example.** All GEMM kernels with single-precision accumulation.
|
||||
```bash
|
||||
$ cmake .. -DCUTLASS_NVCC_ARCHS="70;75" -DCUTLASS_LIBRARY_KERNELS=s*gemm
|
||||
$ cmake .. -DCUTLASS_NVCC_ARCHS="70;75;80" -DCUTLASS_LIBRARY_KERNELS=s*gemm
|
||||
```
|
||||
|
||||
**Example.** All kernels which expect A and B to be column-major.
|
||||
```bash
|
||||
$ cmake .. -DCUTLASS_NVCC_ARCHS="70;75" -DCUTLASS_LIBRARY_KERNELS=gemm*nn
|
||||
$ cmake .. -DCUTLASS_NVCC_ARCHS="70;75;80" -DCUTLASS_LIBRARY_KERNELS=gemm*nn
|
||||
```
|
||||
|
||||
**Example.** All planar complex GEMM variants.
|
||||
```bash
|
||||
$ cmake .. -DCUTLASS_NVCC_ARCHS="70;75" -DCUTLASS_LIBRARY_KERNELS=planar_complex
|
||||
$ cmake .. -DCUTLASS_NVCC_ARCHS="70;75;80" -DCUTLASS_LIBRARY_KERNELS=planar_complex
|
||||
```
|
||||
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ contiguous and strided dimensions of a tile.
|
||||
|
||||
# Copyright
|
||||
|
||||
Copyright (c) 2017-2019, NVIDIA CORPORATION. All rights reserved.
|
||||
Copyright (c) 2017-2020, NVIDIA CORPORATION. All rights reserved.
|
||||
|
||||
```
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted
|
||||
|
||||
@@ -466,7 +466,7 @@ struct WriteableReadableRandomAccessContiguousTileIteratorConcept {
|
||||
|
||||
# Copyright
|
||||
|
||||
Copyright (c) 2017-2019, NVIDIA CORPORATION. All rights reserved.
|
||||
Copyright (c) 2017-2020, NVIDIA CORPORATION. All rights reserved.
|
||||
|
||||
```
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted
|
||||
|
||||
@@ -111,8 +111,8 @@ std::cout << tensor.host_view() << std::endl;
|
||||
|
||||
## Device Allocations
|
||||
|
||||
To strictly allocate memory on the device using the smart pointers to manage allocation and deallocation,
|
||||
use `cutlass::device_memory::allocation<>`.
|
||||
To strictly allocate memory on the device using the smart pointer pattern to manage allocation and deallocation,
|
||||
use `cutlass::DeviceAllocation<>`.
|
||||
|
||||
**Example:** allocating an array in device memory.
|
||||
```c++
|
||||
@@ -128,7 +128,7 @@ int main() {
|
||||
|
||||
size_t N = 1024;
|
||||
|
||||
cutlass::device_memory::allocation<float> device_alloc(N);
|
||||
cutlass::DeviceAllocation<float> device_alloc(N);
|
||||
|
||||
// Call a CUDA kernel passing device memory as a pointer argument
|
||||
kernel<<< grid, block >>>(alloc.get());
|
||||
@@ -340,8 +340,9 @@ used throughout the unit tests.
|
||||
```c++
|
||||
#include <cutlass/numeric_types.h>
|
||||
#include <cutlass/layout/matrix.h>
|
||||
#include <cutlass/util/reference/host/gemm.h>
|
||||
|
||||
#include <cutlass/util/host_tensor.h>
|
||||
#include <cutlass/util/reference/host/gemm.h>
|
||||
|
||||
int main() {
|
||||
|
||||
@@ -378,7 +379,7 @@ int main() {
|
||||
|
||||
# Copyright
|
||||
|
||||
Copyright (c) 2017-2019, NVIDIA CORPORATION. All rights reserved.
|
||||
Copyright (c) 2017-2020, NVIDIA CORPORATION. All rights reserved.
|
||||
|
||||
```
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted
|
||||
|
||||
Reference in New Issue
Block a user