TorchScript C++ 自定義運算符 cpucuda

參考

在 C++ 中注冊調度運算符
使用自定義 C++ 運算符擴展 TorchScript

環境:

  • NVIDIA Driver Version : 545.23.08
  • CUDA Version: 12.1
  • Python Version: 3.11
  • Pytorch Version: 2.1
  • Cmake version : 3.18.1
  • 工作目錄:workspace/test

一、 C++ 自定義運算符

創建workspace/test/add2.cpp:

#include <stdio.h>
#include "add2.cuh"#include "torch/script.h"namespace {
using torch::Tensor;
using torch::DeviceType;Tensor myadd_cpu(const Tensor& self_, const Tensor& other_) {TORCH_CHECK(self_.sizes() == other_.sizes());TORCH_INTERNAL_ASSERT(self_.device().type() == DeviceType::CPU);TORCH_INTERNAL_ASSERT(other_.device().type() == DeviceType::CPU);printf("cpu\n");Tensor self = self_.contiguous();Tensor other = other_.contiguous();Tensor result = torch::empty(self.sizes(), self.options());const float* self_ptr = self.data_ptr<float>();const float* other_ptr = other.data_ptr<float>();float* result_ptr = result.data_ptr<float>();for (int64_t i = 0; i < result.numel(); i++) {result_ptr[i] = self_ptr[i] + other_ptr[i];}return result;
}Tensor myadd_cuda(const Tensor& self_, const Tensor& other_) {TORCH_CHECK(self_.sizes() == other_.sizes());TORCH_INTERNAL_ASSERT(self_.device().type() == DeviceType::CUDA);TORCH_INTERNAL_ASSERT(other_.device().type() == DeviceType::CUDA);printf("cuda\n");Tensor self = self_.contiguous();Tensor other = other_.contiguous();Tensor result = torch::empty(self.sizes(), self.options());const float* self_ptr = self.data_ptr<float>();const float* other_ptr = other.data_ptr<float>();float* result_ptr = result.data_ptr<float>();launch_add2(result_ptr, self_ptr, other_ptr, result.numel());return result;
}} //namespaceTORCH_LIBRARY(myops, m) {m.def("myadd(Tensor self, Tensor other) -> Tensor");
}
TORCH_LIBRARY_IMPL(myops, CPU, m) {m.impl("myadd", myadd_cpu);
}
TORCH_LIBRARY_IMPL(myops, CUDA, m) {m.impl("myadd", myadd_cuda);
}

創建workspace/test/add2.cu:

#include "add2.cuh"__global__ void add2_kernel(float* c,const float* a,const float* b,long n) {for (int i = blockIdx.x * blockDim.x + threadIdx.x; \i < n; i += gridDim.x * blockDim.x) {c[i] = a[i] + b[i];}
}void launch_add2(float* c,const float* a,const float* b,long n) {dim3 grid((n + 1023) / 1024);dim3 block(1024);add2_kernel<<<grid, block>>>(c, a, b, n);
}

創建workspace/test/add2.cuh:

void launch_add2(float* c, const float* a, const float* b, long n);

二、 cmake編譯動態庫

創建workspace/test/CMakeLists.txt:

cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
project(add2)find_package(Torch REQUIRED)
#find_package(CUDA REQUIRED)# Define our library target
add_library(add2 SHARED add2.cpp add2.cu)
# Enable C++17
target_compile_features(add2 PRIVATE cxx_std_17)
# Link against LibTorch
target_link_libraries(add2 "${TORCH_LIBRARIES}")

新建目錄build,編譯:

mkdir build
cd build
cmake -DCMAKE_PREFIX_PATH="$(python -c 'import torch.utils; print(torch.utils.cmake_prefix_path)')" ..
make

創建workspace/test/test.py:

import time
import ctypes
import numpy as np
import torchprint(torch.__version__)
torch.ops.load_library("build/libadd2.so")
print(torch.ops.myops.myadd)# c = a + b (shape: [n])
n = 1024 * 1024
a1 = torch.rand(n, device="cpu")
b1 = torch.rand(n, device="cpu")a2 = torch.rand(n, device="cuda:0")
b2 = torch.rand(n, device="cuda:0")def run_torch():c = torch.ops.myops.myadd(a1, b1)return cdef run_cuda():c = torch.ops.myops.myadd(a2, b2)return cprint("\nRunning cpu...")
print(a1)
print(b1)
start_time = time.time()
c_cpu = run_torch()
end_time = time.time()
print(c_cpu)
print((end_time-start_time)*1e6)print("\nRunning cuda...")
print(a2)
print(b2)
start_time = time.time()
c_cuda = run_cuda()
end_time = time.time()
print(c_cuda)
print((end_time-start_time)*1e6)

結果如下

$ python3 test.py
2.1.0+cu121
myops.myaddRunning cpu...
tensor([0.5668, 0.9394, 0.5168,  ..., 0.3057, 0.0873, 0.6022])
tensor([0.1668, 0.8012, 0.4616,  ..., 0.7969, 0.7210, 0.8589])
cpu
tensor([0.7335, 1.7406, 0.9784,  ..., 1.1026, 0.8083, 1.4611])
9006.977081298828Running cuda...
tensor([0.3864, 0.3490, 0.5892,  ..., 0.4237, 0.4182, 0.6051], device='cuda:0')
tensor([0.3069, 0.7079, 0.1878,  ..., 0.7639, 0.6509, 0.5006], device='cuda:0')
cuda
tensor([0.6933, 1.0568, 0.7770,  ..., 1.1876, 1.0690, 1.1058], device='cuda:0')
362.396240234375

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160979.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160979.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160979.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

逐字節講解 Redis 持久化(RDB 和 AOF)的文件格式

前言 相信各位對 Redis 的這兩種持久化機制都不陌生&#xff0c;簡單來說&#xff0c;RDB 就是對數據的全量備份&#xff0c;AOF 則是增量備份&#xff0c;而從 4.0 版本開始引入了混合方式&#xff0c;以 7.2.3 版本為例&#xff0c;會生成三類文件&#xff1a;RDB、AOF 和記…

2014年5月28日 Go生態洞察:GopherCon 2014大會回顧

&#x1f337;&#x1f341; 博主貓頭虎&#xff08;&#x1f405;&#x1f43e;&#xff09;帶您 Go to New World?&#x1f341; &#x1f984; 博客首頁——&#x1f405;&#x1f43e;貓頭虎的博客&#x1f390; &#x1f433; 《面試題大全專欄》 &#x1f995; 文章圖文…

Java面試附答案:掌握關鍵技能,突破面試難題!

問題&#xff1a;什么是大O表示法&#xff1f;它在Java中的應用是什么&#xff1f; 回答&#xff1a; 大O表示法是一種用來衡量算法復雜度的方法&#xff0c;它描述了算法的時間復雜度和空間復雜度的增長速度。它使用符號O(n)來表示算法的漸進時間復雜度&#xff0c;其中n表示…

如何讓Python2與Python3共存

安裝 首先分別安裝Py2和Py3&#xff0c;我都安裝到C盤根目錄里了&#xff0c;然后分別將Py2和Py3都配置到系統環境變量中去&#xff1a;C:\Python36\Scripts\;C:\Python36\;C:\Python27\;C:\Python27\Scripts; 配置 修改兩個版本的可執行文件名字 驗證 重新配置一下pip …

Ubuntu刪除應用圖標

刪除用戶下的圖標 sudo nautilus ~/.local/share/applications刪除系統下的圖標 sudo nautilus /usr/share/applications

大數據-之LibrA數據庫系統告警處理(ALM-25500 KrbServer服務不可用)

告警解釋 系統按30秒周期性檢測組件KrbServer的服務狀態。當檢測到組件KrbServer服務異常時產生該告警。 當檢測到組件KrbServer服務恢復時告警恢復。 告警屬性 告警ID 告警級別 可自動清除 25500 致命 是 告警參數 參數名稱 參數含義 ServiceName 產生告警的服務…

解決MySQL中某列數據過長無法入庫的問題-Details:data too long for column `xxx` at row 1

問題描述&#xff1a; 我在將軌跡的經緯度轉換為字符串入庫時&#xff0c;遇到寫入問題 Mysql數據入庫報錯&#xff1a; Caused by:java.long.exception:寫入數據庫表失敗.Details:data too long for column xxx at row 1&#xff0c;我的xxx字段類型是string,在mysql庫表中…

加速CI構建,實現高效流水線——CloudBees CI發布工作區緩存功能

加速軟件交付流程能夠更快接觸到客戶&#xff0c;獲得競爭優勢。然而&#xff0c;識別這一過程中存在的瓶頸可能頗具挑戰。讓我們從審查構建和測試階段開始著手。例如&#xff0c;當CI作業執行時間較長時&#xff0c;它會延遲開發人員的反饋循環&#xff0c;從而可能導致發布延…

使用Python解析CAN總線

緣起 在新能源車輛的開發和維護中&#xff0c;經常需要對CAN總線數據進行分析。CANOE等總線軟件雖然方便&#xff0c;但功能有限&#xff0c;難以滿足數據分析的要求。Matlab的Vehicle Network Toolbox可以方便的進行數據解析和分析&#xff0c;它是閉源且收費的。因此&#x…

SpringBoot啟動順序

前言 每次有人問起SpringBoot的啟動順序是不是又來翻博客了&#xff1f;其實只需要稍微查看Spring的源碼即可 步驟 SpringBoot的入口org.springframework.boot.SpringApplication#run(String... args), 這里面實現了SpringBoot程序啟動的所有步驟 啟動事件的順序可以看監聽器…

uni-app 使用uni.getLocation獲取經緯度配合騰訊地圖api獲取當前地址

前言 最近在開發中需要根據經緯度獲取當前位置信息&#xff0c;傳遞給后端&#xff0c;用來回顯顯示當前位置 查閱uni-app文檔&#xff0c;發現uni.getLocation () 可以獲取到經緯度&#xff0c;但是在小程序環境沒有地址信息 思考怎么把經緯度換成地址&#xff0c;如果經緯度…

buildadmin+tp8表格操作(1)----表頭上方添加按鈕和自定義按鈕

buildAdmin 的表頭上添加一些按鈕&#xff0c;并實現功能 添加按鈕 <template><!-- buttons 屬性定義了 TableHeader 本身支持的頂部按鈕&#xff0c;僅需傳遞按鈕名即可 --><!-- 這里的框架自帶的 頂部按鈕 分別有 刷新 &#xff0c; 添加&#xff0c; 編輯&…

C++ 問題 怎么在C++11標準語法中調用C++20的類

一. 問題 在工作中,因為一個算法功能需要跟別的部門對接,他們提供了該算法的頭文件.h,靜態庫.lib,動態庫.dll。但是頭文件中使用了C++20才有的新特性,如#include等,而本地使用的vs2015開發環境,只支持C++11標準語法,這種情況下,該怎么把該算法集成到本地項目中呢? …

寫單元測試,沒你想得那么簡單!

前言 單元測試是什么我們就簡單介紹一下&#xff1a; 單元測試是針對程序模塊&#xff08;軟件設計的最小單位&#xff09;來進行正確性檢驗的測試工作。程序單元是應用的最小可測試部件。 接下來是本人對單元測試的理解和實踐。里面沒有廢話&#xff0c;希望每句話能說到你心…

YOLOv8改進實戰 | 更換主干網絡Backbone(六)之輕量化模型VanillaNet進階篇

前言 輕量化網絡設計是一種針對移動設備等資源受限環境的深度學習模型設計方法。下面是一些常見的輕量化網絡設計方法: 網絡剪枝:移除神經網絡中冗余的連接和參數,以達到模型壓縮和加速的目的。分組卷積:將卷積操作分解為若干個較小的卷積操作,并將它們分別作用于輸入的不…

每日一題(LeetCode)----鏈表--分隔鏈表

每日一題(LeetCode)----鏈表–分隔鏈表 1.題目&#xff08;86. 分隔鏈表&#xff09; 給你一個鏈表的頭節點 head 和一個特定值 x &#xff0c;請你對鏈表進行分隔&#xff0c;使得所有 小于 x 的節點都出現在 大于或等于 x 的節點之前。 你應當 保留 兩個分區中每個節點的初…

關于LORA的優勢以及常見應用產品領域

lora的優勢&#xff1a; 1 低功耗 2 傳輸距離遠 3 信號穿透性好 4 靈敏度高&#xff0c;適合可靠性要求高的領域 5 低成本 Lora 產品領域 &#xff1a; 一、智慧城市 1 智能停車&#xff1a;在較大的停車場&#xff0c;通過Lora技術&#xff0c;采集車位信息&#xff0…

問題解決:Ubuntu18.04下nvcc -V指令可用,/usr/local/下卻沒有cuda文件夾,原因分析及卸載方法

問題描述 今天要運行一個程序&#xff0c;需要CUDA版本高于10.0&#xff0c;我的電腦無法運行&#xff0c;于是開始檢查 首先使用nvidia-smi與nvcc -V指令 能夠看出來&#xff0c;當前顯卡驅動適合的CUDA版本為12.1&#xff0c;而本機安裝的版本是9.1.85&#xff0c;那么就需…

實驗7設計建模工具的使用(三)

二&#xff0c;實驗內容與步驟 1. 百度搜索1-2張狀態圖&#xff0c;請重新繪制它們&#xff0c;并回答以下問題&#xff1a; 1&#xff09;有哪些狀態&#xff1b; 2&#xff09;簡要描述該圖所表達的含義&#xff1b; 要求&#xff1a;所繪制的圖不得與本文中其它習題一樣…

有一臺電腦一部手機就可以在網上賺錢,這些項目你也可以學會

很多人都希望能夠在家中或者閑暇的時候&#xff0c;能夠在網上賺錢&#xff0c;而網絡給了我們這樣的可能。只要有一臺電腦和一部手機&#xff0c;你就可以開始你的賺錢之旅。這些項目并不難&#xff0c;只要你肯學&#xff0c;就一定能夠成功。 1、美工設計 這個副業主要是推薦…