很多时候,我们是基于python进行模型的设计和运行,可是基于python本身的速度问题,使得原生态python代码无法满足生产需求,不过我们可以借助其他编程语言来缓解python开发的性能瓶颈。这里简单介绍个例子,以此完成如何先基于cuda编写瓶颈函数,然后在将接口通过cpp进行封装,最后以库的形式被python调用。

1 cpp+python

首先,介绍下如何python调用cpp的代码。这里极力推荐pybind11。因为pybind11是一个轻量级,只包含头文件的库,他可以在C++中调用python,或者python中调用C++代码。其语法类似Boost.Python。可是不同的是Boost是一个重量级的库,因为为了兼容几乎所有的C++编译器,所以需要支持哪些最老的,bug最多的编译器。该作者考虑到现在c11都很普及了,所以丢弃那些之前的东西,从而打造这么一个轻量级的库。我们通过代码统计:

![](https://img2018.cnblogs.com/blog/441382/201904/441382-20190419123958464-1962463145.png)

首先是对pybind11的安装:

git clone https://github.com/pybind/pybind11.git

cd pybind11

mkdir build && cd build

cmake ../

make -j32

上述cmake需要3.2及以上版本。最后输出结果如下图所示:

![](https://img2018.cnblogs.com/blog/441382/201904/441382-20190419123549799-333701811.png) 这里简单呈现下一级目录: ![](https://img2018.cnblogs.com/blog/441382/201904/441382-20190419124316079-1148031983.png)

为了实现python调用cpp,我们先建立个文件名叫test.cpp

#include

namespace py = pybind11;

int

add(int i, int j){

return i+j;

}

// 该宏会在python的import语句触发

PYBIND11_MODULE(example, m){

m.doc() = "pybind11 example plugin";

m.def("add", &add, "a function which adds two numbers",

py::arg("i"), py::arg("j"));

}

然后执行:

g++ -Wall -shared -std=c++11 -fPIC \

-I/home/zzc/software/pybind11/include \

`cd /home/zzc/software/pybind11 && python3 -m pybind11 --includes` \

test.cpp \

-o example`python3-config --extension-suffix`

结果如下图

![](https://img2018.cnblogs.com/blog/441382/201904/441382-20190419125310803-348897980.png) 接下来,我们将其改成参数支持numpy,可参考[官网文档](https://pybind11.readthedocs.io/en/master/advanced/pycpp/numpy.html?highlight=array);[pybind11—python numpy与C++数据传递](https://www.jianshu.com/p/c912a0a59af9): ``` #include #include

namespace py = pybind11;

int add(py::array_t &array, int col){

py::buffer_info buf1 = array.request(); float *p = (float *)buf1.ptr; for (int i=0; i

PYBIND11_MODULE(example, m){ m.doc() = "pybind11 example plugin"; m.def("add", &add, "a function which adds two numbers"); }

然后依然用上述命令编译成so,调用结果如下图:

![](https://img2018.cnblogs.com/blog/441382/201904/441382-20190424133500721-1634342938.png)

更详细的pybind11使用方法,可阅读[官方文档](https://media.readthedocs.org/pdf/pybind11/master/pybind11.pdf)

### 2 cuda+cpp+python

这里只介绍如何编写cuda的代码,然后提供python接口。通过调查pybind11的issues:[alias template error with Intel 2016.0.3 compilers](https://github.com/pybind/pybind11/issues/1121),如果直接编写cu代码,然后一步到位,会触发很多问题。而如[这里](https://github.com/pybind/pybind11/issues/1653)最后所述,较好的方式就是分开:

> * 编写cuda代码,并生成动态链接库;

> * 编写cpp代码,通过函数引用方式用pybind11进行接口封装;

> * python导入对应模块即可使用。

![](https://img2018.cnblogs.com/blog/441382/201904/441382-20190419125644530-802842798.png)

如上图所示,首先,编写cuda代码,这里为了简洁,我们只写一个printf

// cuda_test.cu #include #include

global void kernel(){ printf("inside in kernel\n"); }

int cuda(int a, int b){

kernel<<<1,10>>>(); cudaDeviceSynchronize();

return 0; }

对应头文件:

//cuda_test.h int cuda(int, int);

然后我们将其用nvcc编译成动态链接库

nvcc --shared -Xcompiler -fPIC cuda_test.cu -o libcutest.so

![](https://img2018.cnblogs.com/blog/441382/201904/441382-20190419130211437-536879143.png)

结果如上图

接着,我们借助pybind11,此时增加了几行

#include #include"cuda_test.h" //新增的

namespace py = pybind11;

int add(int i, int j){ return i+j; }

PYBIND11_MODULE(example, m){ m.doc() = "pybind11 example plugin"; m.def("add", &add, "a function which adds two numbers", py::arg("i"), py::arg("j")); m.def("cuda", &cuda,"testing", py::arg("a"), py::arg("b")); //新增的 }

然后输入如下编译方式:

g++ -Wall -shared -std=c++11 -fPIC

-L. -lcutest

-I/home/zzc/software/pybind11/include

cd /home/zzc/software/pybind11 && python3 -mpybind11 --includes

test.cpp

-o examplepython3-config --extension-suffix

此时生成结果

![](https://img2018.cnblogs.com/blog/441382/201904/441382-20190419130555737-568507130.png)

然后使用

![](https://img2018.cnblogs.com/blog/441382/201904/441382-20190419132007493-1789459707.png)

cuda编程python接口_混合编程[python+cpp+cuda]相关推荐

  1. wind python接口_从wind python接口获取数据并存储

    转载的别人的资料,yuzhucu@CSDN # -*- coding:utf-8 -*- ####################################################### ...

  2. c python boost.python_如何利用Boost.Python实现Python C/C++混合编程详解

    前言 学习中如果碰到问题,参考官网例子:D:boost_1_61_0libspythontest 参考:Boost.Python 中英文文档. 利用Boost.Python实现Python C/C++ ...

  3. 编程小白学python路线图_零基础Python学习路线图,让你少走弯路

    近几年Python的受欢迎程度可谓是扶摇直上,当然了学习的人也是愈来愈多.一些学习Python的小白在学习初期,总希望能够得到一份Python学习路线图,小编经过多方汇总为大家汇总了一份Python学 ...

  4. python编程求导数_面向对象编程 —— java实现函数求导

    首先声明一点,本文主要介绍的是面向对象(OO)的思想,顺便谈下函数式编程,而不是教你如何准确地.科学地用java求出函数在一点的导数. 一.引子 defd(f) :defcalc(x) : dx= 0 ...

  5. python采用面向对象编程模式吗_如何理解 Python 中的面向对象编程?

    现如今面向对象编程的使用非常广泛,本文我们就来探讨一下Python中的面向对象编程. 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 以下为译文: Python支持多种类型的编 ...

  6. 哪个专业学python语言_想学Python编程?你真的适合吗?

    原标题:想学Python编程?你真的适合吗? 有的人说我想学什么.我想干什么,很多时候都是头脑发热,单凭一腔热血,可是这样的路即便走上去你又能坚持多久呢?所以,每每有人问我学Python编程怎么样,我 ...

  7. python书籍_最好的Python书籍,让您像专业程序员一样编程

    Python是一种值得学习的语言.学习Python不仅会激发你用最简单的方式完成高度复杂的任务,还会打破传统编程范型的藩篱.Python是能够改变你的编程方式进而改变你看问题的角度的一种语言. Pyt ...

  8. python fortran混合编程_python fortran c 混合编程

    背景 因为编程需要使用python和fortran(或者c,c++)混合编程,所以进行了一些资料查询和实验.首先尝试了f2py,但是这个项目已经很久没有更新,为了以后兼容性考虑(后期可能会使用到c++ ...

  9. python交互式编程在哪里_终于明了python交互式编程入门

    Python是一款功能强大的脚本语言,具有丰富和强大的库,重要的是,它还具有很强的可读性,易用易学,非常适合编程初学者入门.以下是小编为你整理的python交互式编程入门 环境配置:下载Python并 ...

最新文章

  1. 译 | 缓存穿透问题导致Facebook史上最严重事故之一
  2. 分区脚本(fdisk)
  3. Fedora 31 正式版今天发布,Python不是传说的3.8,而是3.7.4
  4. 机器学习之朴素贝叶斯算法的推理及相关知识总结
  5. 域名中主机名是第几个_CentOS7系统如何修改主机名
  6. jQuery:点击某元素后根据兄弟节点是否显示,控制兄弟节点的显示与否
  7. 值得关注的5款低代码平台推荐
  8. 大一大学计算机应用基础,大一计算机应用基础试题
  9. http中长连接与短连接的区别,和实现方式。
  10. vxe-table renderer 渲染器详解,render 渲染器使用方式
  11. 互联网是如何工作的?
  12. 网络对战五子棋(来一起PK鸭)
  13. 判断一个数是不是质数
  14. 计算机一级是word2010,WORD2010讲义计算机一级
  15. 小姐姐都在用的25+技术站点
  16. Word中无法使用“粘贴”快捷键
  17. 蜜糖?砒霜? 区块链真skr磨人小妖精!
  18. Windows 10安全指南
  19. 好的决策是怎么产生的
  20. BASE64编码的图片在网页中直接用

热门文章

  1. require.jsAMD模块化编程
  2. 在Ubuntu下面编译WizNote Qt Project
  3. Android 学习 笔记_03. SQLite的使用
  4. 拒绝网络*** 如何防御Sniffer***
  5. MySQL报错 Packet for query is too large,server向mysql发送的数据包大小超过mysql限制
  6. C#LeetCode刷题-极小化极大
  7. jira如何创建看板筛选器_创建看板
  8. SAS在金融中的应用一
  9. 云服务器 存放 文件夹,云服务器 存放 文件夹
  10. docker下mongodb备份导入数据库