# torch.utils.cpp_extension

### torch.utils.cpp_extension.CppExtension(name, sources, *args, **kwargs)

创建一个`C++`的`setuptools.Extension`。

便捷地创建一个`setuptools.Extension`具有最小（但通常是足够）的参数来构建`C++`扩展的方法。

所有参数都被转发给`setuptools.Extension`构造函数。

例

```py
>>> from setuptools import setup
>>> from torch.utils.cpp_extension import BuildExtension, CppExtension
>>> setup(
        name='extension',
        ext_modules=[
            CppExtension(
                name='extension',
                sources=['extension.cpp'],
                extra_compile_args=['-g'])),
        ],
        cmdclass={
            'build_ext': BuildExtension
        }) 
```

### torch.utils.cpp_extension.CUDAExtension(name, sources, *args, **kwargs)

为`CUDA/C++`创建一个`setuptools.Extension`。 创建一个`setuptools.Extension`用于构建`CUDA/C ++`扩展的最少参数（但通常是足够的）的便捷方法。这里包括`CUDA`路径，库路径和运行库。 所有参数都被转发给`setuptools.Extension`构造函数。

例

```py
>>> from setuptools import setup
>>> from torch.utils.cpp_extension import BuildExtension, CppExtension
>>> setup(
        name='cuda_extension',
        ext_modules=[
            CUDAExtension(
                    name='cuda_extension',
                    sources=['extension.cpp', 'extension_kernel.cu'],
                    extra_compile_args={'cxx': ['-g'],
                                        'nvcc': ['-O2']})
        ],
        cmdclass={
            'build_ext': BuildExtension
        }) 
```

### torch.utils.cpp_extension.BuildExtension（dist，** kw ）[source]

自定义`setuptools`构建扩展。

`setuptools.build_ext`子类负责传递所需的最小编译器参数（例如`-std=c++11`）以及混合的`C ++/CUDA`编译（以及一般对`CUDA`文件的支持）。

当使用`BuildExtension`时，它将提供一个用于`extra_compile_args`（不是普通列表）的词典，通过语言（`cxx`或`cuda`）映射到参数列表提供给编译器。这样可以在混合编译期间为`C ++`和`CUDA`编译器提供不同的参数。

### torch.utils.cpp_extension.load(name, sources, extra_cflags=None, extra_cuda_cflags=None, extra_ldflags=None, extra_include_paths=None, build_directory=None, verbose=False)

即时加载(JIT)`PyTorch C ++`扩展。

为了加载扩展，会创建一个`Ninja`构建文件，该文件用于将指定的源编译为动态库。随后将该库作为模块加载到当前`Python`进程中，并从该函数返回，以备使用。

默认情况下，构建文件创建的目录以及编译结果库是`&lt;tmp&gt;/torch_extensions/&lt;name&gt;`，其中`&lt;tmp&gt;`是当前平台上的临时文件夹以及`&lt;name&gt;`为扩展名。这个位置可以通过两种方式被覆盖。首先，如果`TORCH_EXTENSIONS_DIR`设置了环境变量，它将替换`&lt;tmp&gt;/torch_extensions`并将所有扩展编译到此目录的子文件夹中。其次，如果`build_directory`函数设置了参数，它也将覆盖整个路径，即,库将直接编译到该文件夹中。

要编译源文件，使用默认的系统编译器（c++），可以通过设置`CXX`环境变量来覆盖它。将其他参数传递给编译过程，`extra_cflags`或者`extra_ldflags`可以提供。例如，要通过优化来编译您的扩展，你可以传递`extra_cflags=['-O3']`，也可以使用 `extra_cflags`传递进一步包含目录。

提供了混合编译的`CUDA`支持。只需将`CUDA`源文件（`.cu`或`.cuh`）与其他源一起传递即可。这些文件将被检测，并且使用`nvcc`而不是`C ++`编译器进行编译。包括将`CUDA lib64`目录作为库目录传递并进行`cudart`链接。您可以将其他参数传递给`nvcc extra_cuda_cflags`，就像使用`C ++`的`extra_cflags`一样。使用了各种原始方法来查找`CUDA`安装目录，通常情况下可以正常运行。如果不可以，最好设置`CUDA_HOME`环境变量。

*   参数：
    *   name - 要构建的扩展名。这个必须和`pybind11`模块的名字一样！
    *   sources - `C++`源文件的相对或绝对路径列表。
    *   extra_cflags - 编译器参数的可选列表，用于转发到构建。
    *   extra_cuda_cflags - 编译器标记的可选列表，在构建`CUDA`源时转发给`nvcc`。
    *   extra_ldflags - 链接器参数的可选列表，用于转发到构建。
    *   extra_include_paths - 转发到构建的包含目录的可选列表。
    *   build_directory - 可选路径作为构建区域。
    *   verbose - 如果为`True`，打开加载步骤的详细记录。
*   返回：
    *   加载`PyTorch`扩展作为`Python`模块。

例

```py
>>> from torch.utils.cpp_extension import load
>>> module = load(
        name='extension',
        sources=['extension.cpp', 'extension_kernel.cu'],
        extra_cflags=['-O2'],
        verbose=True) 
```

### torch.utils.cpp_extension.include_paths(cuda=False)

获取构建`C++`或`CUDA`扩展所需的路径。

*   参数： `cuda` - 如果为 True，则包含`CUDA`特定的包含路径。
*   返回： 包含路径字符串的列表。

例如：

```py
from setuptools import setup
from torch.utils.cpp_extension import BuildExtension, CppExtension

torch.utils.cpp_extension.include_paths(cuda=False)
# ['/usr/local/lib/python3.6/site-packages/torch/lib/include', '/usr/local/lib/python3.6/site-packages/torch/lib/include/TH', '/usr/local/lib/python3.6/site-packages/torch/lib/include/THC'] 
```

### torch.utils.cpp_extension.check_compiler_abi_compatibility(compiler)

验证给定的编译器是否与`PyTorch` ABI 兼容。

*   参数：compiler(str) - 要检查可执行的编译器文件名(例如 g++),必须在`shell`进程中可执行。
*   返回：如果编译器（可能）与`PyTorch`ABI 不兼容，则为`False`，否则返回`True`。

### torch.utils.cpp_extension.verify_ninja_availability()

如果可以在[ninja](https://ninja-build.org/)上运行则返回`True`。

文档地址：[torch.utils.cpp_extension

]([https://ptorch.com/docs/8/torch-utils-cpp_extension](https://ptorch.com/docs/8/torch-utils-cpp_extension))

### 译者署名

| 用户名 | 头像 | 职能 | 签名 |
| --- | --- | --- | --- |
| [Song](https://ptorch.com) | ![](img/2018033000352689884.jpeg) | 翻译 | 人生总要追求点什么 |