- 博客(90)
- 资源 (1)
- 收藏
- 关注
原创 Opencv cuda版本编译
下载opencv源码包(当前项目使用的是4.5.5版本,但是这里有个坑,由于是cuda12.x的版本,所以后面会出现编译问题,所以后来的opencv版本被升级到了4.10.0)这个是由于版本的问题(cuda12.0开始cuda就放弃了对旧版纹理引用的支持,任何使用纹理引用的代码,都编译不过)当前的编译暂时没有使用ippicv的库(理论上使用该库在cpu上的计算会有性能提升,但是由于下载问题,暂时未使用)下载不成功,就等下,会自动跳过本次下载,或者cmake生成的时候直接禁用掉ipp的选项。
2024-06-05 11:23:56
404
原创 linux动态库的加载
加载完后,链接器会解析可执行文件中对动态库函数的引用,它查找动态库中的符号表,将程序中的符号替换为库中的实际地址,这个过程确保了程序在调用动态库中函数时能够找到正确的地址。链接器解析可执行文件中的依赖信息,识别出程序需要调用的函数和变量是否位于动态库中,这通常涉及到检查可执行文件的重定位表和符号表。找到动态库会,链接器会加载这些库到程序的虚拟地址空间中,通常是mmap完成,会在内存中映射文件的代码和数据段。特别是那些与共享库依赖关系相关的信息,这些信息通常是在编译和链接的阶段由链接器添加到可执行文件中的。
2024-03-27 19:46:27
626
原创 多普勒频移和速度关系
由于探头发射接收是同一个,发射声束经运动物体反射后又被自己接收,所以发生了2次多普勒效应。由于血流速度和扫描速度有夹角,V为矢量,换成标量为V * Cos(theta)theta: 方向角,速度矢量和声束轴线之间的夹角(在测量的时候为偏转角和校正角度的和)Fd: 多普勒频移(频率的移动,假设接收频率为F,那么Fd = F - F0)这个速度是接收者和生源的相对速度,假设这里是靠近,那么速度就是C + V。波长 = 速度 / 频率 = C / F0。频率 = 速度 / 波长 = 1 / 周期。
2024-03-09 13:49:24
4598
1
原创 最小二乘法
1. 当一个位置斜率变化较大时,说明海参矩阵的值比较大(注意是斜率变化,不是函数值变化),那相应的inv(H)的值就会比较小,这个时候步进会慢些。上述两点,相对于梯度下降法来说,尤其好理解的是,平缓区域的时候,梯度下降法步进会很慢,收敛也就相应的比较慢,但是牛顿法却很快。2. 当一个位置比较平缓,斜率变化较小时,说明H矩阵值小,相应的inv(H)会比较大,步进会比较大。为什么这里使用到了海参矩阵就可以快速的收敛呢?
2023-11-25 15:36:00
506
原创 Cuda cmake支持C++17
项目中cuda的编译需要使用到C++17的特性,但是自己在设置C++17的时候,一直不生效,最后找到一种生效的方式。1. 设置CMAKE_CUDA_STANDARD。2. 设置nvcc编译选项。
2023-11-07 17:05:38
1025
原创 C++变参模板的使用
但是这种方式对于我个人遇到的问题有点不适用,我需要的是第一是数据指针,然后第二个参数、第三个参数是数据的宽高,然后后面才是变参,这样递归处理的话不行。1. 使用编译器if常量表达式。上述折叠表达式存在同样的问题。2. C17折叠表达式。3. 变种折叠表达式。
2023-11-03 19:32:47
154
原创 nsight computer运行失败问题
项目中有部分CUDA代码耗时严重,所以想用工具进行统计,直接用visual profile能出来大致的结果,但是感觉还不够详细,因此想要使用nsight compute进行统计。原因是最新版本的Nsight compute抛弃了部分显卡的支持,因此需要回退到2019.5.1的版本才能运行。使用最新版本的nsight compute进行统计,老是报错:显示不支持当前显卡。
2023-09-08 21:22:54
670
原创 cuda显存访问耗时
项目中有个数据量大小为5195 * 512 * 128float = 1.268G的显存,发现有个函数调用很耗时,函数里面就是对这个显存进行128个元素求和,得到一个5195 * 512的图像。
2023-09-07 19:47:55
273
原创 openmp和avx配置
项目中数据拷贝慢(使用的是memcpy),希望能加速拷贝,所以尝试了使用avx的流方式,和openmp方式处理。不同函数配置的-mxxx不同,如果出现类似上述错误,需要去查看。需要配置cmakeLists。代码中使用了上述openmp语句,但是运行无效。CMakeLists需要配置。注意配置的时候是小写。
2023-08-03 15:07:15
305
原创 find和grep各个参数
grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配‘magic’,而不是‘magical’),说明:find命令从指定的起始目录开始,递归地搜索其各个子目录,查找满足寻找条件的文件并对之采取相关的操作。默认情况区分大小写,-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前。-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前。一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
2023-07-08 16:34:53
172
原创 LeakTracer代码学习(1)
项目中有的时候会产生内存泄漏,以往的经验,检测工具更倾向于使用LeakTracer进行检测泄漏问题,但是直接使用会有些问题,比如堆栈不全都是?等问题,该专题希望自己能够坚持将LeakTracer的源码梳理清楚,以供后续的定制化开发,也可以根据这个源码的学历,扩充下自己的知识面。测试发现,无论这个函数定义在main.cpp里面,还是另外一个test.cpp,只要编译或者链接到了执行程序,都会在执行main之前执行上述函数。第 一个字符串,表示是什么函数,第二个参数就是libc的标准函数,第三个是什么?
2023-07-08 12:00:25
408
原创 交叉编译配置
项目中存在在x86的linux系统上编译arm版本代码的需求,这个时候就涉及到交叉编译了,下面记录下项目中别的人cmake配置,方便后续学习。
2023-07-08 10:01:09
270
原创 4.28 周期信号的傅里叶变换
非周期信号的谱之所以是连续的,是因为非周期信号相当于信号是无穷大的,那w -> 0,因此就演变成了连续谱了。,w谱线之间拼起来的连续谱了,由于无穷小的量我们看不到它,那怎么办呢?我们就把Fn放大T倍(无穷大倍),就生成了F(jw)因此傅里叶变换和傅里叶级数不是一个含义,简单理解是F(jw)是Fn的T倍。
2023-07-01 17:32:39
817
原创 4.27 功率谱
1处解释,由于上述信号是截断信号,只有-T/2 ~ T/2有有效信号,因此有了1式。自相关函数和他的能量谱或者功率谱构成傅里叶变换对。能量信号和能量密度构成傅里叶变换对。功率信号和功率密度构成傅里叶变换对。功率信号能量一定是无穷大的。
2023-07-01 17:14:25
485
原创 4.22. 卷积定理
我们知道卷积运算是为了求系统的零状态响应的,即,如果输入给系统的信号是f(t),系统函数是h(t),那系统的输出是什么?就是按照上述方式卷积得到。
2023-07-01 15:59:19
235
原创 ssh远程启动桌面程序
背景:当前项目开发时,如果想远程控制机器启动,必须用VNC连接,或者使用别的远程工具,然后远程到桌面之后,在远程桌面的基础上开启终端,启动桌面应用程序,这样很不方便,如果直接用xshll ssh连上机器启动应用程序,会报这个问题:解决方法:
2023-06-08 19:49:38
450
原创 带错误检测的CUDA资源管理
为什么使用宏定义,而不是函数定义,是因为函数定义的话,如果希望在出错误的时候直接输出出错位置的文件和行号,就需要在使用接口的时候,将__FILE__和__LINE__传入进去,有点麻烦,因此使用了宏定义的方式。项目中发现很多cuda代码很冗余,主要是有一些cuda内存相关的操作,比如cudaMemcpy之后,要进行错误检测,所以修改了一版,实现接口内部自己检测,这样代码看起来不会那么乱。
2023-04-23 19:30:46
131
原创 matlab调用C++接口
3. 包装函数(转接函数)里面去调用真正需要调用的C++逻辑。2. matlab去编译一个C++的包装函数(转接函数)1. 需要安装mingw编译器。
2023-04-18 19:34:28
667
原创 malloc hook进行内存泄漏检测
CMakeLists.txt和相应的memory_leak.cpp文件。记录下使用malloc的hook形式,写个小的demo,并记录遇到的问题。
2023-04-14 19:31:02
845
原创 opencv轮廓内所有点的获取
由于A提供的点有可能是不连续的,所以可能需要进行一个插值,当然这个可以做可以不做,看具体误差要求。在图像区域绘制一个ROI,可能是任意形状的,然后A会将轮廓的一些点传给模块B,让B去计算参数。项目中有个需求点,涉及到两个模块,A、B。获取该ROI内的所有点数据。
2023-04-12 11:04:51
994
1
原创 多项式拟合曲线对比
项目中有些位置使用了多项式拟合曲线,进行了几种方式的实现,效果都不是特别理想,低阶拟合还基本OK,但是高阶拟合效果就不好,下面是效果较差的2种方式实现的代码,后期继续查看为什么效果不好。手写了一版多项式的解法,效果还不错,对比下面两种方式,对于任意阶数拟合效果都很好。
2023-04-11 16:27:33
357
原创 使用LD_PRELOAD加载malloc free
项目代码中发现运行过程中出现一些异常的内存增加,理论上应该是平稳的,不知道为什么增加,所以想要找一个工具进行监测,但是并没有搜到合适的,网上有资料说使用valgrind,但是由于这个工具运行起来拖慢程序太多,所以就不太适用。不过在查找的过程中,想到是不是可以自己实现一个小的工具来检测这个东西,所以就搜到了预加载的相关内容,关于预加载的详细原理,后续再整理,这里只介绍实现。myMalloc.c里面使用到了printf函数,这个函数内部会调用malloc,然后形成一个死循环的递归,所以出错,应该这样。
2023-04-01 14:49:04
534
1
原创 matlab中ColorMap提取
如果C++工程中希望获取到一个ColorMap的映射表,比如是256 * 3的RGB映射表,怎么通过Matlab生成。
2023-03-08 10:14:47
356
原创 lspci命令整理
lspci -tv --树形结构显示设备上所有pcie设备,并显示简要信息。lspci -xxx-d 8086:8c22 --查看8086:8c22设备配置空间的所有内容。lspci -xxx -s 00:1f.3 --查看00:1f.3设备配置空间的所有内容。lspci -vv -d 8086:8c22 --查看8086:8c22设备的的详细信息。lspci -vv -s 00:1f.3 --查看00:1f.3设备的详细信息。
2022-12-09 20:17:00
10201
原创 “状态变化”模式之 Memento模式(备忘录)
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。-----设计模式 GOF备忘录(momento)存储原发器(Originator)对象的内部状态,在需要的时候恢复原发器状态momento模式的核心是信息隐藏,即Originator需要向外隐藏信息,保持其封装性。但同时又需要将状态保持到外界(Momento)这个模式看起来有点过时,因为我们有很多序列化的手段,但是我们需要知道该模式的思想。
2022-11-18 13:26:57
312
原创 18. “状态变化”模式 之State模式(状态模式)
允许一个对象在其内部状态改变的时候改变它的行为(其实里里面使用的是多态,即前面代码中NetworkProcessor中维护的NetworkState *pState;)。从而使对象看起来似乎修改了其行为。------《设计模式》GOFState模式将所有与一个特定状态相关的行为(Operation1、2、3)都放入到一个State的子类对象中,在对象状态切换时,切换相应的对象;但同时维持State的接口,这样实现了具体操作于状态转换之间的解耦。
2022-11-02 23:24:40
200
原创 17. “接口隔离“模式之 Mediator模式(中介者)
用一个中介对象来封装(封装变化)一些列的对象交互。中介者使个对象不需要显式的互相引用(编译时依赖 -> 运行时依赖),从而使其耦合松散(管理变化),而且可以独立地改变他们之间的交互。----《设计模式》GOF将多个对象间复杂的关联关系解耦,Mediator模式将多个对象间的控制逻辑进行集中管理,变“多个对象互相关联”为“多个对象和一个中介者关联”,简化了系统的维护,抵御了可能的变化。随着控制逻辑的复杂化,Mediator具体对象的实现可能相当复杂。这时候可对Mediator对象进行给你分解处理。
2022-11-01 23:36:50
99
原创 16. “接口隔离模式”之 适配器模式
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。-----《设计模式》GOFAdapter模式主要用于“希望复用一些现存的类,但是接口又与复用环境不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。GOF 23定义了两种Adapter模式的实现结构:对象适配器和类适配器。但类适配器是用过“多继承”的实现方式,一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。
2022-11-01 23:03:44
110
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人