VScode 里面使用 python 去直接调用 CUDA

news/2024/5/9 8:48:59

上一个 帖子主要分享了如何 去将 C++ 程序 打包成一个package。 我们最后的 目的实际上是想把 CUDA 的程序 打包成 一个 Package , C++ 程序只是起到了桥梁的作用

首先:CUDA 程序 和 C++ 的程序一样, 都有一个 .cu 的源文件和 一个 .h 的头文件

我们的文件 包含 Cpp 文件组成,负责当作 CUDA 和 Python 的桥梁。 还有 对应的 CUDA 的源代码文件和 头文件。将这个cpp 文件命名成 ext.cpp.

#include <torch/extension.h>
#include "interpolation_kernel.h"  ## CUDA 的头文件PYBIND11_MODULE(TORCH_EXTENSION_NAME,m){m.def("trilinear_interpolation",&trilinear_interpolation);
}

cpp_properities.json 配置文件

{"configurations": [{"name": "Linux","includePath": ["${workspaceFolder}/**","/home/smiao/anaconda3/envs/Gen_3DGS/lib/python3.8","/home/smiao/anaconda3/envs/Gen_3DGS/lib/python3.8/site-packages/torch/include/","/home/smiao/anaconda3/envs/Gen_3DGS/lib/python3.8/site-packages/torch/include/torch/csrc/api/include/"],"defines": [],"compilerPath": "/usr/bin/gcc","cStandard": "c17","cppStandard": "gnu++14","intelliSenseMode": "linux-gcc-x64"}],"version": 4

CUDA 部分:

CUDA 的头文件 *** interpolation_kernel.h ***

#include <torch/extension.h>#define CHECK_CUDA(x) TORCH_CHECK(x.is_cuda(), #x "must be a CUDA tensor")
#define CHECK_CONTIGUOUS(x) TORCH_CHECK(x.is_contiguous(), #x " must be contiguous")
#define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)torch::Tensor trilinear_interpolation(torch::Tensor feats, torch::Tensor point);

对应的 源代码 文件*** interpolation_kernel.cu ***

include 的 头文件 和源代码文件 尽量放在同一级的 目录

#include <torch/extension.h>
#include "interpolation_kernel.h"
template <typename scalar_t>
__global__ void trilinear_fw_kernel(const torch::PackedTensorAccessor<scalar_t, 3, torch::RestrictPtrTraits, size_t> feats,const torch::PackedTensorAccessor<scalar_t, 2, torch::RestrictPtrTraits, size_t> points,torch::PackedTensorAccessor<scalar_t, 2, torch::RestrictPtrTraits, size_t> feat_interpconst int n = blockIdx.x * blockDim.x + threadIdx.x; // 每个 Thread 都有一个 独特的Idconst int f = blockIdx.y * blockDim.y + threadIdx.y;// 不参与计算的 thread 之间返回即可if(n >= feats.size(0) && f >= feats.size(2))return;const scalar_t u = (points[n][0]+1) / 2;const scalar_t v = (points[n][1]+1) / 2;const scalar_t w = (points[n][2]+1) / 2;const scalar_t a = (1-v) * (1-w);const scalar_t b = (1-v) * w;const scalar_t c = v * (1-w);const scalar_t d = 1-a-b-c;feat_interp[n][f] = (1-u) * ( a*feats[n][0][f]+b*feats[n][1][f]+c*feats[n][2][f]+d*feats[n][3][f]) + u*(a*feats[n][4][f]+b*feats[n][5][f]+c*feats[n][6][f]+d*feats[n][7][f]);
}// 编写启动函数 如下:
torch::Tensor trilinear_interpolation(torch::Tensor feats, torch::Tensor points){CHECK_CUDA(feats);CHECK_CUDA(points);const int N = feats.size(0), F = feats.size(2);torch::Tensor feat_interp = torch::zeros({N,F}, feats.options());// 定义 几个 Block 和 Thread 的数量 const dim3 threads(16,16);const dim3 blocks((N + threads.x-1)/threads.x,(F + threads.y-1)/threads.y);//  启动 Kernel 函数, Kernel 的 函数类型一定是 Void  不会包含任何返回类型AT_DISPATCH_FLOATING_TYPES(feats.type(), "trilinear_interpolation", ([&] {trilinear_fw_kernel<scalar_t><<<blocks, threads>>>(feats.packed_accessor<scalar_t, 3, torch::RestrictPtrTraits, size_t>(),points.packed_accessor<scalar_t, 2, torch::RestrictPtrTraits, size_t>(),feat_interp.packed_accessor<scalar_t, 2, torch::RestrictPtrTraits, size_t>());}));return feats;
}

配置文件 setup.py 部分:

配置文件的 包含 ** *.cpp 文件 和 *.cu 文件 **
其他的部分应该 尽量不去改变。

from setuptools import setup
from torch.utils.cpp_extension import CUDAExtension, BuildExtension
import os
import globos.path.dirname(os.path.abspath(__file__))setup(name="cuda_tutorial",version='1.0',ext_modules=[CUDAExtension(name='cuda_tutorial',sources=["interpolation_kernel.cu","ext.cpp"], extra_compile_args={'cxx': ['-O2'],'nvcc': ['-O2']})],cmdclass={'build_ext': BuildExtension}
)

最后是安装

pip install .

编写 test.py 的 python 代码对于 cuda 代码进行调用:

if __name__ == '__main__':N,F = 65536,256feats = torch.rand(N,8,F,device='cuda')points = torch.rand(N,3,device='cuda')*2-1## C++ 没有 feat=feat 这样传递 参数的形式t1 = time.time() out_cuda = cuda_tutorial.trilinear_interpolation(feats,points)print(f"cuda time {time.time()-t1} s")t2 = time.time() out_py = trilinear_interpolation_py(feats=feats,points=points)print(f"cuda time {time.time()-t2} s")print(torch.allclose(out_cuda,out_py))print(out_cuda.shape)

http://www.mrgr.cn/p/58084588

相关文章

.net8系列-04图文并茂手把手教你配置Swagger支持token以及实现Swagger扩展,Swagger代码单独抽离

前情提要 接上篇文章,我们当前已完成如下内容:创建应用成功 创建接口成功 配置Swagger实现接口注释和版本控制 本文章主要内容为: 配置Swagger支持token传值测试接口快速上手-代码配置 添加如下代码 文件目录:\xiaojinWebApplication\xiaojinWebApplication\Program.cs// S…

【OceanBase诊断调优】——hpet(高精度时钟源)引起的CPU高问题排查

最近总结一些诊断OCeanBase的一些经验&#xff0c;出一个【OceanBase诊断调优】专题出来&#xff0c;也欢迎大家贡献自己的诊断OceanBase的方法。 1. 前言 昨天在问答区帮忙排查一个用户CPU高的问题&#xff0c;帖子链接&#xff1a;《刚刚新安装的OceanBase集群&#xff0c;…

万业企业发布23年年报、24年一季报,集成电路业务同比大增近七成 转型成效显著

4月26日晚间&#xff0c;万业企业&#xff08;600641&#xff09;发布2023年年度报告及2024年一季度报告。2023年&#xff0c;公司实现营业收入9.65亿元&#xff0c;归母净利润1.51亿元。其中&#xff0c;公司集成电路设备制造业务收入较上年同期大幅增长67.53%&#xff0c;公司…

Synchronized关键字的深入分析

一、引言 在多线程编程中&#xff0c;正确地管理并发是确保程序正确运行的关键。Java提供了多种同步工具&#xff0c;其中synchronized关键字是最基本且最常用的同步机制之一。本文旨在深入解析synchronized的实现原理&#xff0c;探讨其在不同应用场景中的使用&#xff0c;并…

.net报错异常及常用功能处理总结(持续更新)

@目录1. WebApi dynamic传参解析结果中ValueKind = Object处理方法问题描述方案1:(推荐,改动很小)方案2:2.C# .net多层循环嵌套结构数据对象如何写对象动态属性赋值问题描述JavaScript动态属性赋值.net动态属性赋值3.Object.GetType().GetProperty().GetValue()读取对象报错…

微信小程序实战项目开发(天气预报项目实战):内涵开发说明文档、需求文档 手把手分步骤教你写出自己的小程序项目 天气预报小程序 时实请求获取天气 自定义功能 完整的源代码

文章目录 微信小程序开发实现天气预报 一、项目需求分析需求分析实现思路分析详解如下&#xff1a;1、创建项目、全局配置 json 文件2、在 wxml文件中完成布局3、wxss的实现美化效果颜色渐变效果&#xff1a;鼠标 hover 浮动阴影效果&#xff1a;圆角效果底部按钮button使用fle…

Blender点操作

顶点操作即一般的“布线”操作 1.顶点移动 -先切到顶点模式 -移动&#xff0c;G 或 G X/Y/Z -旋转&#xff0c;R 同上 -缩放&#xff0c;S 同上 2.顶点滑移&#xff0c;用于微调顶点的位置 快捷键&#xff1a;Shift V&#xff0c;G G 3.顶点删除 -选中一个顶点 -按…

单机三pxc节点集群,+docker-haproxy2.0负载均衡实现

一.下载 https://www.haproxy.org/download/2.0/src/haproxy-2.0.5.tar.gz 或者在这里下载&#xff08;下面需要的各个配置文件都有&#xff09;&#xff1a; https://download.csdn.net/download/cyw8998/89170129 二.编写文件&#xff0c;制作docker镜像 1.Dockerfile&a…

SpringBoot源码阅读2-自动配置

SpringBoot源码阅读2-自动配置 在传统的Spring应用中&#xff0c;开发者需要手动配置一系列Web应用的核心组件&#xff0c;例如DispatcherServlet用于处理请求分发、ViewResolver用于视图解析、CharacterEncodingFilter用于字符编码过滤等。 然而在SpringBoot中只要引入了spr…

Mudem,打造私密安全、高效稳定的私人空间

Mudem 是 Codigger 平台中的一个关键组件&#xff0c;它提供基础通讯服务&#xff0c;确保不同类型的机器之间可以进行安全和高效的连接。它其设计理念在于将本地机器、公有云以及私有云上的设备无缝地整合为一个可远程在线访问的工作站&#xff08;Workstation&#xff09;。这…

Flutter 上架如何解决 ITMS-91053 问题

最近&#xff0c;我的 Flutter App 发布到 TestFlight 后&#xff0c;就会收到一封邮件&#xff1a;The uploaded build for YOUR APP has one or more issues. 上面的邮件主要是说&#xff0c;我的 App 缺少了调用 API 的声明&#xff0c;以前从来没看到过&#xff0c;上网一查…

百度昆仑、华为NPU

百度昆仑、华为NPU 为智能计算而生的昆仑芯XPU架构 昆仑芯科技团队于2017年在Hot Chips上发布自研的、面向通用AI计的芯片核心架构——昆仑芯XPU。 集十余年AI加速研发实践,昆仑芯XPU从AI落地的实际需求出发,按照复杂前沿的人工智能场景需求开展迭代, 致力为开发者提供通用、…

低代码技术与仓储管理的新纪元:革命性的供应链变革

引言 在当今数字化时代&#xff0c;企业对于创新和效率的追求越发迫切。在这样的背景下&#xff0c;低代码技术应运而生&#xff0c;成为企业数字化转型的重要工具之一。低代码技术的崛起为企业提供了一种快速、灵活、成本效益高的开发方式&#xff0c;大大缩短了软件开发周期…

【Leetcode】vector刷题

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;Leetcode刷题 目录 1.只出现一次的数字2.杨辉三角3.删除有序数组中的重复项4.只出现一次的数字II5.只出现一次的数字III6.电话号码的字母组合 1.只出现一次的数字 题目链接&#xff1a;136.只出现一…

使用 NVM 动态切node版本

一、安装nvm 官网链接&#xff1a; Release 1.1.9 coreybutler/nvm-windows GitHub 无脑安装直接下一步 安装完之后验证一下&#xff1a; #打开命令行输入命令 nvm 这样就是安装好了&#xff0c;然后我们开始安装node。 二、使用nvm安装node 1、去node官网获取版本号 …

【Linux】帮助类命令

在Linux中&#xff0c;man用于查看系统手册页&#xff08;manual pages&#xff09;。它用于查阅关于特定命令、函数、工具或文件格式的详细信息。要使用man命令&#xff0c;只需在终端中输入man&#xff0c;后跟您要查看的命令或主题的名称。 例如&#xff0c;如果查看ls命令…

JEECG/SpringBoot集成flowable流程框架

IDEA安装Flowable BPMN visualizer插件 pom.xml中引入flowable相关依赖 <dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</artifactId><version>6.7.2</version></dependency><depe…

CSS基础:table的4个标签的样式详解(6000字长文!附案例)

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

JVM知识点总结二

参考文章&#xff1a;【Java面试题汇总】JVM篇&#xff08;2023版&#xff09;_jvm面试题2023-CSDN博客 1、说说你了解的JVM内存模型&#xff1a; JVM由三部分组成&#xff1a;类加载子系统、运行时数据区、执行引擎 JVM内存模型&#xff1a; 内存模型里的运行时数据区&#…

汽车组装3D电子说明书更通俗易懂

激光打印机由于造价高、技术更先进&#xff0c;因此在使用和维护上需要更专业的手法&#xff0c;而对于普通客户来说并不具备专业操作激光打印机的技能&#xff0c;为了通俗易懂地让客户理解激光打印机&#xff0c;我们为企业定制了激光打印机3D产品说明书&#xff0c;将为您带…