1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
|
---
parent: Contributing
nav_order: 0
---
# Submitting a PR
Thrust uses Github to manage all open-source development, including bug
tracking, pull requests, and design discussions. This document details how to get
started as a Thrust contributor.
An overview of this process is:
1. [Clone the Thrust repository](#clone-the-thrust-repository)
1. [Setup a fork of Thrust](#setup-a-fork-of-thrust)
1. [Setup your environment](#setup-your-environment)
1. [Create a development branch](#create-a-development-branch)
1. [Local development loop](#local-development-loop)
1. [Push development branch to your fork](#push-development-branch-to-your-fork)
1. [Create pull request](#create-pull-request)
1. [Address feedback and update pull request](#address-feedback-and-update-pull-request)
1. [When your PR is approved...](#when-your-pr-is-approved)
## Clone the Thrust Repository
To get started, clone the main repository to your local computer. Thrust should
be cloned recursively to setup the CUB submodule (required for `CUDA`
acceleration).
```
git clone --recursive https://github.com/NVIDIA/thrust.git
cd thrust
```
## Setup a Fork of Thrust
You'll need a fork of Thrust on Github to create a pull request. To setup your
fork:
1. Create a Github account (if needed)
2. Go to [the Thrust Github page](https://github.com/NVIDIA/thrust)
3. Click "Fork" and follow any prompts that appear.
Once your fork is created, setup a new remote repo in your local Thrust clone:
```
git remote add github-fork git@github.com:<GITHUB_USERNAME>/thrust.git
```
If you need to modify CUB, too, go to
[the CUB Github page](https://github.com/NVIDIA/cub) and repeat this process.
Create CUB's `github-fork` remote in the `thrust/dependencies/cub` submodule.
## Setup Your Environment
### Git Environment
If you haven't already, this is a good time to tell git who you are. This
information is used to fill out authorship information on your git commits.
```
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
```
### Configure CMake builds
Thrust uses [CMake](https://www.cmake.org) for its primary build system. To
configure, build, and test your checkout of Thrust:
```
# Create build directory:
mkdir build
cd build
# Configure -- use one of the following:
cmake .. # Command line interface
cmake -DTHRUST_INCLUDE_CUB_CMAKE=ON .. # Enables CUB development targets
ccmake .. # ncurses GUI (Linux only)
cmake-gui # Graphical UI, set source/build directories in the app
# Build:
cmake --build . -j <num jobs> # invokes make (or ninja, etc)
# Run tests and examples:
ctest
```
See [CMake Options](../setup/cmake_options.md) for details on customizing the build. To
enable CUB tests and examples, set the `THRUST_INCLUDE_CUB_CMAKE` option to
`ON`. Additional CMake options for CUB are listed
[here](https://github.com/NVIDIA/cub/blob/main/CONTRIBUTING.md#cmake-options).
## Create a Development Branch
All work should be done in a development branch (also called a "topic branch")
and not directly in the `main` branch. This makes it easier to manage multiple
in-progress patches at once, and provides a descriptive label for your patch
as it passes through the review system.
To create a new branch based on the current `main`:
```
# Checkout local main branch:
cd /path/to/thrust/sources
git checkout main
# Sync local main branch with github:
git pull
# Create a new branch named `my_descriptive_branch_name` based on main:
git checkout -b my_descriptive_branch_name
# Verify that the branch has been created and is currently checked out:
git branch
```
Thrust branch names should follow a particular pattern:
- For new features, name the branch `feature/<name>`
- For bugfixes associated with a github issue, use `bug/github/<bug-description>-<bug-id>`
- Internal nvidia and gitlab bugs should use `nvidia` or `gitlab` in place of
`github`.
If you plan to work on CUB as part of your patch, repeat this process in the
`thrust/dependencies/cub` submodule.
## Local Development Loop
### Edit, Build, Test, Repeat
Once the topic branch is created, you're all set to start working on Thrust
code. Make some changes, then build and test them:
```
# Implement changes:
cd /path/to/thrust/sources
emacs thrust/some_file.h # or whatever editor you prefer
# Create / update a unit test for your changes:
emacs testing/some_test.cu
# Check that everything builds and tests pass:
cd /path/to/thrust/build/directory
cmake --build . -j <num jobs>
ctest
```
### Creating a Commit
Once you're satisfied with your patch, commit your changes:
#### Thrust-only Changes
```
# Manually add changed files and create a commit:
cd /path/to/thrust
git add thrust/some_file.h
git add testing/some_test.cu
git commit
# Or, if possible, use git-gui to review your changes while building your patch:
git gui
```
#### Thrust and CUB Changes
```
# Create CUB patch first:
cd /path/to/thrust/dependencies/cub
# Manually add changed files and create a commit:
git add cub/some_file.cuh
git commit
# Create Thrust patch, including submodule update:
cd /path/to/thrust/
git add dependencies/cub # Updates submodule info
git add thrust/some_file.h
git add testing/some_test.cu
git commit
# Or, if possible, use git-gui to review your changes while building your patch:
cd /path/to/thrust/dependencies/cub
git gui
cd /path/to/thrust
git gui # Include dependencies/cub as part of your commit
```
#### Writing a Commit Message
Your commit message will communicate the purpose and rationale behind your
patch to other developers, and will be used to populate the initial description
of your Github pull request.
When writing a commit message, the following standard format should be used,
since tools in the git ecosystem are designed to parse this correctly:
```
First line of commit message is a short summary (<80 char)
<Second line left blank>
Detailed description of change begins on third line. This portion can
span multiple lines, try to manually wrap them at something reasonable.
Blank lines can be used to separate multiple paragraphs in the description.
If your patch is associated with another pull request or issue in the main
Thrust repository, you should reference it with a `#` symbol, e.g.
#1023 for issue 1023.
For issues / pull requests in a different github repo, reference them using
the full syntax, e.g. NVIDIA/cub#4 for issue 4 in the NVIDIA/cub repo.
Markdown is recommended for formatting more detailed messages, as these will
be nicely rendered on Github, etc.
```
## Push Development Branch to your Fork
Once you've committed your changes to a local development branch, it's time to
push them to your fork:
```
cd /path/to/thrust/checkout
git checkout my_descriptive_branch_name # if not already checked out
git push --set-upstream github-fork my_descriptive_branch_name
```
`--set-upstream github-fork` tells git that future pushes/pulls on this branch
should target your `github-fork` remote by default.
If have CUB changes to commit as part of your patch, repeat this process in the
`thrust/dependencies/cub` submodule.
## Create Pull Request
To create a pull request for your freshly pushed branch, open your github fork
in a browser by going to `https://www.github.com/<GITHUB_USERNAME>/thrust`. A
prompt may automatically appear asking you to create a pull request if you've
recently pushed a branch.
If there's no prompt, go to "Code" > "Branches" and click the appropriate
"New pull request" button for your branch.
If you would like a specific developer to review your patch, feel free to
request them as a reviewer at this time.
The Thrust team will review your patch, test it on NVIDIA's internal CI, and
provide feedback.
If have CUB changes to commit as part of your patch, repeat this process with
your CUB branch and fork.
## Address Feedback and Update Pull Request
If the reviewers request changes to your patch, use the following process to
update the pull request:
```
# Make changes:
cd /path/to/thrust/sources
git checkout my_descriptive_branch_name
emacs thrust/some_file.h
emacs testing/some_test.cu
# Build + test
cd /path/to/thrust/build/directory
cmake --build . -j <num jobs>
ctest
# Amend commit:
cd /path/to/thrust/sources
git add thrust/some_file.h
git add testing/some_test.cu
git commit --amend
# Or
git gui # Check the "Amend Last Commit" box
# Update the branch on your fork:
git push -f
```
At this point, the pull request should show your recent changes.
If have CUB changes to commit as part of your patch, repeat this process in the
`thrust/dependencies/cub` submodule, and be sure to include any CUB submodule
updates as part of your commit.
## When Your PR is Approved
Once your pull request is approved by the Thrust team, no further action is
needed from you. We will handle integrating it since we must coordinate changes
to `main` with NVIDIA's internal perforce repository.
|