Add workaround for nvcc header dependecies bug#62550
Add workaround for nvcc header dependecies bug#62550peterbell10 wants to merge 54 commits intogh/peterbell10/110/basefrom
Conversation
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
🔗 Helpful links
💊 CI failures summary and remediationsAs of commit d6bba04 (more details on the Dr. CI page):
🕵️ 17 new failures recognized by patternsThe following CI failures do not appear to be due to upstream breakages:
|
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. ghstack-source-id: 123c589 Pull Request resolved: #62550
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. ghstack-source-id: 2d1fd3a Pull Request resolved: #62550
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. ghstack-source-id: c2f1aed Pull Request resolved: #62550
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
tools/nvcc_fix_deps.py
Outdated
| if abs_path.exists(): | ||
| return abs_path | ||
|
|
||
| paths = '\n '.join(str(d / path) for d in include_dirs) |
There was a problem hiding this comment.
Nit (although it goes against my gut feeling, but I was told by many PyTorch contributors that the like to following this rule: https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html#strings )
| paths = '\n '.join(str(d / path) for d in include_dirs) | |
| paths = "\n ".join(str(d / path) for d in include_dirs) |
malfet
left a comment
There was a problem hiding this comment.
Please use double quotes in Python code, per https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html#strings
…es bug" I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. ghstack-source-id: 234f436 Pull Request resolved: #62550
… nvcc header dependecies bug" I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. ghstack-source-id: 28265e9 Pull Request resolved: #62550
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. ghstack-source-id: 798ce27 Pull Request resolved: #62550
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. ghstack-source-id: 864176b Pull Request resolved: #62550
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. ghstack-source-id: 2a4b1ab Pull Request resolved: #62550
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. ghstack-source-id: dbc1415 Pull Request resolved: #62550
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. [ghstack-poisoned]
I noticed that running the build twice in a row resulted in ~80 CUDA files being rebuilt. Running `ninja -d explain` shows ``` ninja explain: TH/generic/THStorage.h is dirty ninja explain: TH/generic/THStorageCopy.h is dirty ninja explain: THC/generic/THCStorage.h is dirty ninja explain: THC/generic/THCStorageCopy.h is dirty ninja explain: TH/generic/THTensor.h is dirty ninja explain: THC/generic/THCTensor.h is dirty ninja explain: THC/generic/THCTensorCopy.h is dirty ninja explain: THC/generic/THCTensorMath.h is dirty ninja explain: THC/generic/THCTensorMathMagma.h is dirty ninja explain: THC/generic/THCTensorMathPairwise.h is dirty ninja explain: THC/generic/THCTensorScatterGather.h is dirty ``` considering `ninja` is working relative to the `build` folder, these files don't actually exist. I traced this back to the output of `nvcc -MD` containing paths relative to the include directory, instead of being absolute. This adds a little script to launch the compiler then resolve any relative paths in the `.d` file before `ninja` looks at it. To use it, I run the build with ``` export CMAKE_CUDA_COMPILER_LAUNCHER="python;`pwd`/tools/nvcc_fix_deps.py;ccache" ``` There are some possible pit-falls here. The same relative path might work for two include directories, and the compiler could pick a different one. Or, the compiler might have additional implicit include directories that are needed to resolve the path. However, this has worked perfectly in my testing and it's completely opt-in so should be fine. ghstack-source-id: 0dc9305 Pull Request resolved: #62550
|
@malfet has imported this pull request. If you are a Facebook employee, you can view this diff on Phabricator. |
Stack from ghstack:
I noticed that running the build twice in a row resulted in ~80 CUDA files being
rebuilt. Running
ninja -d explainshowsconsidering
ninjais working relative to thebuildfolder, these files don'tactually exist. I traced this back to the output of
nvcc -MDcontainingpaths relative to the include directory, instead of being absolute.
This adds a little script to launch the compiler then resolve any relative paths
in the
.dfile beforeninjalooks at it. To use it, I run the build withThere are some possible pit-falls here. The same relative path might work for
two include directories, and the compiler could pick a different one. Or,
the compiler might have additional implicit include directories that are needed
to resolve the path. However, this has worked perfectly in my testing and it's
completely opt-in so should be fine.
Differential Revision: D31503351