pytorch op的c 和cuda編寫

2021-10-10 06:43:08 字數 2462 閱讀 4440

官方文件

需求:當你需要頻繁的使用該自定義操作,或者呼叫很昂貴,或者需該操作要用到一些c/c++庫。

c++擴充套件允許使用者建立源外定義的pytorch運算子,即與pytorch後端分離的運算子。

c++擴充套件有兩種形式:

使用setuptools提前構建

使用torch.utils.cpp_extension.load()即使構建

setup.py來讓setuptools編譯c++**

from setuptools import setup, extension

from torch.utils import cpp_extension

setup(name=

'lltm_cpp'

, ext_modules=

[cpp_extension.cppextension(

'lltm_cpp',[

'lltm.cpp'])

],# cppextension是setuptools的便利包裝.extension傳遞正確的include路徑並將擴充套件語言設定為c++

cmdclass=

)# buildextension執行許多必需的配置步驟並檢查,並且在混合c++ / cuda擴充套件的情況下還管理混合編譯

aten庫:用於張量計算的主要api

pybind11:為c++**建立的python繫結方式

headers:管理aten和pybind11之間的互動資訊

模板:

#include

#include

torch::tensor d_sigmoid

(torch::tensor z)

前傳:基本上1:1翻譯過去

#include

std::vector

lltm_forward

( torch::tensor input,

torch::tensor weights,

torch::tensor bias,

torch::tensor old_h,

torch::tensor old_cell)

,/*dim=*/1)

;auto gate_weights = torch::

addmm

(bias, x, weights.

transpose(0

,1))

;// f.linear(x, self.weights, self.bias)

auto gates = gate_weights.

chunk(3

,/*dim=*/1)

;auto input_gate = torch::

sigmoid

(gates[0]

);auto output_gate = torch::

sigmoid

(gates[1]

);auto candidate_cell = torch::

elu(gates[2]

,/*alpha=*/

1.0)

;auto new_cell = old_cell + candidate_cell * input_gate;

auto new_h = torch::

tanh

(new_cell)

* output_gate;

return

;}

反向

c++擴充套件api當前不提供自動求導的方法,需要自己寫

繫結pybin docs

pybind11_module

(torch_extension_name, m)

// torch_extension_name pytorch構建過程中將其定義為您在setup.py指令碼中為擴充套件程式指定的名稱,在這裡為lltm

使用

pytorch/

lltm-extension/

lltm.cpp

setup.py

macos : clang

ubuntu16.04 : gcc >=4.9

from torch.utils.cpp_extension import load

lltm_cpp =

load

(name=

"lltm_cpp"

, sources=

["lltm.cpp"

], verbose=true)

//verbose 可見具體過程

在後台會執行以下操作:

建立乙個臨時目錄/tmp/torch_extensions/lltm

將ninja構建檔案傳送到該臨時目錄中

將原始檔編譯為共享庫

將該共享庫匯入為python模組

cuda程式設計 c 使用Go和C輕鬆進行CUDA程式設計

cuda程式設計 c 與其他語言相比,使用go程式設計cuda有點複雜。儘管有一些出色的軟體包,例如mumax,但是文件很差,缺少示例並且很難使用。cuda用於c語言,所以最好的選擇是使用command cgo並使用您的cuda核心呼叫外部函式。這就是我在此示例中所做的事情,在該示例中,我使用cud...

Linq To Sql高階系列(三)CUD和Log

cud就是create,update,delete。在別人都寫過了後,還有什麼是新鮮的呢?1,createdatabase northwind db new northwind you connection string 注意database項,起乙個 不存在的資料庫名稱 db.log consol...

linux中同時安裝CUDA8 0和CUDA9 0

1.準備cuda安裝包c.本機已經安裝的版本是cuda8.0和cudnn5.1 2.參考官方文件 cuda 看左上角是不是cuda9.0版本的文件,如果顯示最新版本,需要去找舊的9.0版本 cudnn 3.開始安裝 3.1 除了安裝顯示卡選擇no,還有一步要選擇no 因為之前第一次安裝cuda8.0...