# 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`进程中,并从该函数返回,以备使用。 默认情况下,构建文件创建的目录以及编译结果库是`<tmp>/torch_extensions/<name>`,其中`<tmp>`是当前平台上的临时文件夹以及`<name>`为扩展名。这个位置可以通过两种方式被覆盖。首先,如果`TORCH_EXTENSIONS_DIR`设置了环境变量,它将替换`<tmp>/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) | 翻译 | 人生总要追求点什么 |