硬解码开发过程中遇到的一些c++和python混合编程问题
2022-9-7
| 2023-11-11
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
当前目的开发c++硬解码并使用python调用其动态库实现一次抽一次帧.
以下是开发过程中遇到的C++的一些特性记录.

1. 二级指针初始化与释放

二级指针需要初始化两次, 分别是二级指针和一级指针
释放指针, 需要先释放一级指针再释放二级指针, 如果先释放二级指针, 一级指针的地址会丢失, 导致内存泄漏.

2. C++结构体与python传值

c++定义结构体对象
python定义同结构体对象
  1. python端初始化结构体示例
    1. 之后就可以输入C++动态库函数
  1. C++端初始化结构体
    1. 全局结构体只需要在结构体结尾加上变量, 其他地方只要使用变量即可
      需要当成调用多次的时候初始化:

3. C++头文件使用C风格的函数

4. struct和typedef struct的区别

5. 实现python调用c++单步抽帧

使用全局指针, 函数中全局指针指向new class demuxer 和 decoder

6. C++ 11 Lambda表达式

遇到符号[=]

7. CUDA C编程

如何在 CUDA C/C++ 中实现数据传输的重叠
在 上一期的 C / C ++ 文章 中,我们讨论了如何在主机和设备之间高效地传输数据。在这篇文章中,我们讨论了如何将数据传输与主机上的计算、设备上的计算相重叠,在某些情况下,主机和设备之间的其他数据传输。实现数据传输和其他操作之间的重叠需要使用 CUDA 流,所以首先让我们了解一下流。 CUDA 中的 stream 是按照主机代码发出的顺序在设备上执行的操作序列。虽然流中的操作被保证按规定的顺序执行,但是不同流中的操作可以被交错,并且在可能的情况下,它们甚至可以并发运行。 CUDA 中的所有设备操作(内核和数据传输)都在一个流中运行。如果没有指定流,则使用默认流(也称为"空流")。默认流与其他流不同,因为它是关于设备上操作的同步流:在所有先前发出的操作 在设备上的任何流中 完成之前,默认流中的任何操作都不会开始,并且默认流中的操作必须在任何其他操作(在设备上的任何流中)之前完成就要开始了。 请注意, 2015 年发布的 CUDA 7 引入了一个新的选项,即每个主机线程使用单独的默认流,并将每个线程的默认流视为常规流(即它们不与其他流中的操作同步)。在文章 GPU 专业提示: CUDA 7 流简化并发 中阅读更多关于这种新行为的信息。 让我们看一些使用默认流的简单代码示例,并从主机和设备的角度讨论操作是如何进行的。 cudaMemcpy(d_a, a, numBytes, cudaMemcpyHostToDevice); increment >>(d_a) cudaMemcpy(a, d_a, numBytes, cudaMemcpyDeviceToHost); 在上面的代码中,从设备的角度来看,所有三个操作都被发布到同一个(默认)流中,并将按照它们发出的顺序执行。 从主机的角度看,隐式数据传输是阻塞或同步传输,而内核启动是异步的。由于第一行上的主机到设备的数据传输是同步的, CPU 线程在主机到设备的传输完成之前不会到达第二行的内核调用。一旦内核被发出, CPU 线程将移动到第三行,但由于设备端的执行顺序,该行上的传输无法开始。 内核从主机的角度启动的异步行为使得重叠的设备和主机计算非常简单。我们可以修改代码以添加一些独立的 CPU 计算,如下所示。
如何在 CUDA C/C++ 中实现数据传输的重叠
cudaMemcpyAsync等知识

7.1. python c++ 混合编程

环境
直接使用pybind11文件夹, 直接放在项目文件夹根目录下, 和CMakeLists.txt还有cu.cc文件放一起.

7.1.1. cmakelists编译的过程中不停循环不终止问题

7.2. C++ 传承python方法2

7.3. python 使用ctype与C++通信

C++编译 Cmakelists.txt
  • Decode
  • GPU
  • Python
  • C/C++
  • PS5/Switch DNS三维计算机视觉相机标定笔记
    • Giscus
    目录