FFmpegPtr – FFmpeg的智能指针

FFmpeg是纯C语法的,内部结构体内存分配和释放需要调用专门的函数,比如avformat_alloc_context,avformat_free_context等。使用起来不太方便,如果调用的时候忘记了一一对应的,很容易造成内存泄漏。 因此用C++的模板把ffmpeg中的内存分配进行了封装。下面的例子只是对AVFormatContext, AVCodecContext进行了封装,其他结构体封装起来也很方便,只需重载FFmpegPtrTraits类就可以。 template<typename T> class FFmpegPtrTraits; template& […]

cuda与OpenGL和DirectX的图形交互

OpenGL和Direct3D中的资源可以被映射到cuda的内存空间,以允许cuda读取,也允许cuda写入后供OpenGL和Direct3D使用。 在映射之前,需要对资源进行注册(register),会得到一个cudaGraphicsResource的指针。使用完成后,需要通过cudaGraphicsUnregisterResource注销资源。 一旦资源注册成功,就可以对资源进行映射cudaGraphicsMapResources和取消映射cudaGraphicsUnmapResource,映射可以根据需要是多次的。映射后的内存,可以被内核函数使用,通过cudaGraphicsResour […]

使用Direct3D 11 Video API播放视频

        最近看了下微软的Media Foundation,发现Media Foundation里面的EVR使用比较旧的Direct3D API,于是想直接使用Direct3D 11 Video API来播放视频。并且可以在视频上添加图片和显示文字,又不想使用Media Foundation的pipeline。视频采集利用Media Foundation 的source reader,或者使用ffMpeg获取视频,然后直接通过Direct3D 11/12 Video A […]

cuda中的异步并行执行

cuda可以让不互相依赖的任务进行并行操作,主要任务包括如下: 主机端的计算 设备端的计算 主机到设备端的内存数据传输 设备到主机端的内存数据传输 设备内的内存之间的数据传输 设备到设备之间的数据传输   在主机和设备间可以并行执行的操作有: 内核函数执行 单个设备内存间的数据拷贝 主机到设备的内存拷贝,内存块的大小,小于64KB。 以async为前缀的内存拷贝函数 memory set function calls 并行执行的特性,可以查询设备的属性,查看是否支持。 cudaDeviceProp.asyncEngineCount > 0    // 支持c […]

cuda 纹理(texture)和表面(surface)的使用

       cuda纹理和表面内存是一种特殊的全局内存,主要针对二维空间的局部性访问进行了优化。纹理内存是只读的,而表面内存是可读可写的。纹理和表面内存都支持一维、二维和三维。        纹理内存的属性: read mode用来指定返回值是归一化模式,还是原始值模式。如果是cudaReadModeNormalizedFloat,则返回[0.0 1.0]之间的浮点数;如果是cudaReadModeElementType,则返回原始值。 addressing mode指定寻址模式,也就是超出坐标范围值如果取值。有 […]

访问者模式 – 让数据存储和数据访问分离

有时候需要将数据的存储和访问分别放到不同对象中,这时就可以使用访问者模式: class MultiThreadVector { std::vector<int> mArray; std::mutex mMtx; public: class Accessor { MultiThreadVector &mData; std::unique_lock<std::mutex> mGuard; public: Accessor(MultiThreadVector &data) : mData(data), mGuard(data.mMtx) { } void pu […]

在visual studio中添加cuda编译选项

1. 创建存放cuda代码的筛选器, 2. 在筛选器中添加cuda源码文件 3. 右击项目—->“生成自定义”,在弹出的窗口中勾选cuda的对应版本。 4. 修改cuda文件的编译链接设置,右击cuda源文件—–>“属性”,在弹出窗口中—->“常规”—->”项类型“的下拉列表中选择点击”应用“后,”常规“下方会出现一个”cuda c/c++”的设置。 5. 修改工程设置,“链接器”—>”输入”—>”附加依赖项&#82 […]

可变参数模板应用 – 动态链接库

       动态链接库的使用有两种方式,一种是在编译的时候就把动态链接库的头文件包含起来,链接的时候,系统自动去查找需要的动态链接库;另一种是程序动态的去加载,windows下是使用LoadLibrary加载库文件,然后通过GetProcAddress获取函数指针;在linux下是使用dlopen加载库文件,然后通过dlsym获取函数指针。但是动态加载的方式,需要在调用的地方定义很多函数指针,使用起来不太方便,而且动态链接库改了接口,使用的地方也需要相应的修改。有没有更好的方法呢?当然有,可以利用可变参数模板来改善动态加载链接库的使用。 windows […]

可变参数模板应用 – 观察者模式

      GoF中的观察者模式,是设计中经常使用的模式。 #include<list> class Subject; class Observer { public: virtual ~Observer(); virtual void Update(Subject* changedSubject) = 0; protected: Observer(); }; class Subject { public: virtual ~Subject(); virtual void Attach(Observer *); virtual void Detach( […]

cuda 统一内存模式

在cuda基本编程步骤这一篇文章中,可以看到cuda编程中需要在两个地方分配内存(主机和设备之间),还需要手动拷贝数据,这样使用起来非常的不方便。从cuda 6.0开始,提供了统一内存的模式,可以方便cuda的编程。要利用统一内存模式,需要SM的架构大于3.0,而且操作系统必须时64位的。 在统一内存模式中,内存分配的方式是: int *value; cudaMallocManaged(&value, sizeof(int)); 还可以结合std中的allocator进行高效的内存分配: #include <cstdio> #include <cstddef> […]