python cpp cuda混合编程_pytorch通过torch.utils.cpp_extension构建CUDA/C++拓展

本文介绍了如何利用torch.utils.cpp_extension模块在Python中创建CUDA/C++扩展。通过CppExtension和CUDAExtension类,可以方便地构建和编译C++及CUDA源代码。BuildExtension类则用于自定义编译过程,确保C++和CUDA混合编译的顺利进行。此外,还提供了load函数用于即时加载JIT编译的C++扩展,以及辅助函数如include_paths和check_compiler_abi_compatibility来获取所需的包含路径和验证编译器兼容性。
摘要由CSDN通过智能技术生成

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

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

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

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

>>> 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构造函数。

>>> 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进程中,并从该函数返回,以备使用。

默认情况下,构建文件创建的目录以及编译结果库是/torch_extensions/,其中是当前平台上的临时文件夹以及为扩展名。这个位置可以通过两种方式被覆盖。首先,如果TORCH_EXTENSIONS_DIR设置了环境变量,它将替换/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模块。

>>> 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特定的包含路径。

返回: 包含路径字符串的列表。

例如:

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进程中可执行。

返回:如果编译器(可能)与PyTorchABI不兼容,则为False,否则返回True。

torch.utils.cpp_extension.verify_ninja_availability()

如果可以在ninja上运行则返回True。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值