v3.9 update (#2203)
* v3.9 update * voidD --------- Co-authored-by: yuzhai <yuzhai@nvidia.com>
This commit is contained in:
151
media/docs/cpp/ide_setup.md
Normal file
151
media/docs/cpp/ide_setup.md
Normal file
@ -0,0 +1,151 @@
|
||||
# IDE Setup for CUTLASS Development
|
||||
|
||||
This document outlines instructions and tips for setting up a local editor for CUTLASS development, including support
|
||||
for intellisense, go-to-definition, code formatting, and so on.
|
||||
|
||||
## Overview
|
||||
In order for any intellisense tool to work with CUTLASS, the following things need to be configured with it:
|
||||
* Include paths, i.e. where the compiler (or in this case, the intellisense tool) should look for header files
|
||||
* Compiler flags; especially the C++ standard (`--std`)
|
||||
* Preprocessor variables; especially CUDA-related ones
|
||||
|
||||
One usually needs to configure the above variables in a settings file. Below, two config approaches are described:
|
||||
for VSCode, and for any editor that uses the clangd language server, which includes
|
||||
Vim, Emacs, NeoVim, Sublime Text, and so on. Note that VSCode can also be configured to use clangd.
|
||||
It might be worth setting up clangd for VSCode rather than the default intellisense,
|
||||
and you might see faster responses and more stable performance with clangd.
|
||||
|
||||
## VSCode Setup
|
||||
|
||||
1. Install the [Official C/C++ extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools)
|
||||
1. Open settings...
|
||||
1. `Ctrl+Shift+P` to open the command palette
|
||||
1. Enter "C/C++" to filter results
|
||||
1. Select "C/C++ Edit Configurations (UI)" (or "... (JSON)" if you feel like editing the raw JSON)
|
||||
1. View the documentation for these settings
|
||||
[here](https://code.visualstudio.com/docs/cpp/c-cpp-properties-schema-reference)
|
||||
1. Edit "Include Path" to set up **include paths**. For CUTLASS, this includes the following:
|
||||
* `${workspaceFolder}/include`
|
||||
* `${workspaceFolder}/tools/util/include`
|
||||
* `${workspaceFolder}/examples/common`
|
||||
* ...others, depending on which files you edit
|
||||
1. Edit C++ standard to be `c++17`, `gnu++17`, or equivalent.
|
||||
1. Edit `defines` to define preprocessor variables. See
|
||||
[Global Config below](#global-config) for examples. The important
|
||||
ones include `__CUDACC_VER_MAJOR__`, `__CUDA_ARCH__`, `__CUDA_ARCH_FEAT_SM90_ALL__`. But configure
|
||||
them according to your target architecture.
|
||||
1. ...and possible edit any other fields for your specific setup.
|
||||
|
||||
## clangd Setup
|
||||
|
||||
`clangd` is a C++ language server that is part of the LLVM project. You must first set it up your specific IDE:
|
||||
* `clangd` official [documentation](https://clangd.llvm.org/installation#editor-plugins) for editor setup.
|
||||
* NeoVim setup is possible through [lsp](https://neovim.io/doc/user/lsp.html) and either manually installing clangd or
|
||||
using an installation manager like Mason.
|
||||
|
||||
Then, one needs to edit the config ([documentation](https://clangd.llvm.org/config)). One typically has a
|
||||
**global** and a **per-project** config.
|
||||
|
||||
### Global Config
|
||||
|
||||
Here is one example for a global config.
|
||||
On linux this is usually located at `~/.config/clangd/config.yaml` . Here is one example config for CUDA projects on SM90.
|
||||
The key settings here are the preprocessor vars (`-D__CUDACC_VER_MAJOR__` , `-D__CUDA_ARCH__`)
|
||||
|
||||
```
|
||||
CompileFlags:
|
||||
Compiler: /usr/local/cuda/bin/nvcc
|
||||
Add:
|
||||
- --cuda-path=/usr/local/cuda
|
||||
- --cuda-gpu-arch=sm_90a
|
||||
- -I/usr/local/cuda/include
|
||||
- "-xcuda"
|
||||
# report all errors
|
||||
- "-ferror-limit=0"
|
||||
- --cuda-gpu-arch=sm_90a
|
||||
- --std=c++17
|
||||
- "-D__INTELLISENSE__"
|
||||
- "-D__CLANGD__"
|
||||
- "-DCUDA_12_0_SM90_FEATURES_SUPPORTED"
|
||||
- "-DCUTLASS_ARCH_MMA_SM90_SUPPORTED=1"
|
||||
- "-D_LIBCUDACXX_STD_VER=12"
|
||||
- "-D__CUDACC_VER_MAJOR__=12"
|
||||
- "-D__CUDACC_VER_MINOR__=3"
|
||||
- "-D__CUDA_ARCH__=900"
|
||||
- "-D__CUDA_ARCH_FEAT_SM90_ALL"
|
||||
- "-Wno-invalid-constexpr"
|
||||
Remove:
|
||||
# strip CUDA fatbin args
|
||||
- "-Xfatbin*"
|
||||
# strip CUDA arch flags
|
||||
- "-gencode*"
|
||||
- "--generate-code*"
|
||||
# strip CUDA flags unknown to clang
|
||||
- "-ccbin*"
|
||||
- "--compiler-options*"
|
||||
- "--expt-extended-lambda"
|
||||
- "--expt-relaxed-constexpr"
|
||||
- "-forward-unknown-to-host-compiler"
|
||||
- "-Werror=cross-execution-space-call"
|
||||
Hover:
|
||||
ShowAKA: No
|
||||
InlayHints:
|
||||
Enabled: No
|
||||
Diagnostics:
|
||||
Suppress:
|
||||
- "variadic_device_fn"
|
||||
- "attributes_not_allowed"
|
||||
```
|
||||
|
||||
### Local Config
|
||||
Local config is needed to specify per-project settings, especially include paths. An example is:
|
||||
```
|
||||
CompileFlags:
|
||||
Add:
|
||||
- -I</absolute/path/to/cutlass>/include/
|
||||
- -I</absolute/path/to/cutlass>/tools/util/include/
|
||||
- -I</absolute/path/to/cutlass>/cutlass/examples/common/
|
||||
```
|
||||
|
||||
Note that absolute paths are needed since clangd doesn't support relative paths.
|
||||
|
||||
### Note on compile_commands.json
|
||||
For typical C++ projects, clangd can *automatically* configure itself by parsing the `compile_commands.json`
|
||||
generated by your CMake build. The path to such a file is by default `build/compile_commands.json` and is
|
||||
configured by the `CompilationDatabase` config.
|
||||
|
||||
This is usually a convenient way to configure projects, but it's not as simple for CUDA/nvcc projects, since
|
||||
clang doesn't understand many of the compiler flags used by nvcc. Hence, for now, we don't recommend using
|
||||
`compile_commands.json` to configure your CUDA project.
|
||||
|
||||
## Copyright
|
||||
|
||||
Copyright (c) 2017 - 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
```
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
```
|
||||
Reference in New Issue
Block a user