- 博客(71)
- 收藏
- 关注
原创 cuda从零开始手搓PB神经网络
基于上一篇的矩阵点乘,实现了矩阵的加减乘除、函数调用等。并且复用之前元编程里面写的梯度下降、Adam、NAdam优化方法。可以看出,经过8000次的训练,这个使用sigmoid激活函数、NAdam优化、Xavier-Gaussian初始化的32。虽然这对于我的工作没有任何关系,但是我还是想搞一下。毕竟“越是没用的知识就越有用,越是有用的东西就越没用”。32的PB能够将误差缩减到0.0001这个量级,而训练时间仅为8.54秒。下面实验一下我们的bp神经网络。
2025-01-17 14:49:20
487
原创 cuda矩阵点乘计算实现
矩阵的点乘运算可以看做把两个矩阵A和B,A的行和B的列结合在一起,形成一个正方体。正方体中每个坐标位置的值为其坐标投影位置值相乘。得出的值为沿着A的行(即B的列)方向,将正方体中元素的值进行求和。这个程序定义了2个30*30的对角矩阵进行点乘运算。基于以上认知,设计了一个cuda程序,用于计算矩阵的乘法。可以看到,正确计算出了点乘的结果。
2025-01-14 15:45:52
255
原创 GO语言写Prometheus自定义node-exporter的Docker容器测试
执行以下命令,安装docker-compose到CentOS7.9环境中:安装完成后输入命令验证docker-compose安装成功:2. 使用go语言编写node-exporter创建文件夹04_prometheus_test,执行以下命令初始化go环境:由于需要用到prometheus的go语言sdk,所以需要下载包:执行完成后写代码:这个程序暴露:8080/metrics给prometheus获取数据,:8080/hello可以增加计数。执行编译生成可执行文件:3. d
2024-04-25 09:53:17
650
3
原创 libco——源码分析(一)
总体的网络服务器操作流程是这样的:fill:#333;co_pollother增加epoll_fd监听文件描述符将自己的协程增加到计时队列中发送网络消息或者其他被激活的文件描述符放到激活队列loop取出超时队列中超时的任务放到超时队列将超时队列黏贴到激活队列末尾激活元素的回调函数处理resume挂起的协程loop写入收到消息的数据并返回上层loopco_pollother。
2024-01-23 18:00:19
1147
1
原创 shared_ptr多线程安全性
shared_ptr的计数对象是原子的,但是有一个问题,就是在析构之前shared_ptr调用父类__shared_ptr的析构,__shared_ptr有一个__shared_count成员,这个成员的析构里面调用了其指针成员_Sp_counted_base的方法_M_release,而这个_M_release里面则调用__gnu_cxx::__exchange_and_add_dispatch方法对计数进行-1操作,如果原来的计数为1那么就调用_M_dispose方法将对象执行删除了。
2024-01-12 14:56:43
599
原创 8086CPU汇编语言基础知识入门
在8086CPU下,栈段地址放在SS寄存器中,地址(SS)*16+(SP)为栈顶指针。可以看出,栈底应该地址是小于栈顶的。所以SP+=2表示出栈,而SP-=2表示入栈。由于16为2的4次方,因此其可以空出4位的偏移地址,段地址是16位的地址,总共加起来是20位的物理地址空间。的方式来确定物理地址,地址的计算方式是。存储器芯片按读写属性分类。8086CPU使用的是。装有BIOS的ROM。
2024-01-04 19:57:47
1238
原创 C++元编程与内联性能对比测试
这个图中可以看出,模板元编程实现同样的10*10矩阵点积运算竟然需要516ns,而内联的函数只需要0.747ns。模板函数,作用是计算两个函数的行列对应元素相乘之和,这个也是在编译期能够确定对应关系的,缺点是调用了递归以实现循环,但是增加了inline关键字,以期望其能内联。,因此循环需要依靠递归来实现,这种递归如果不能进行内联,那么函数入栈和退栈都是比较消耗时间的。函数,由于都是编译期确定的值,如果编译器不进行优化,那么应该是模板的。模板函数,这个函数的作用是针对指定的行列,调用。函数,可以看到模板的。
2024-01-03 10:51:40
474
原创 金融知识——OMS、EMS和PMS分别是什么意思
EMS独具的一个特征是其能够为交易者提供特定交易自定义算法的能力。如果你想通过DMA(direct market access)并执行交易组中的一小部分以进行价格发现,然后再执行剩下的交易,那么EMS就是你需要的。在交易管理方面,OMS提供交易组合,交易指令,与执行目标的FIX连接,算法交易选项,账户分配以及日终的经纪商及委托商的提醒。如果你是一个活跃的交易参与者、套保基金(避险基金)或者长期资产管理者,并且你很关注实现大订单的价格而不是每个账户的一系列分配,那么EMS就是适合你的系统。
2023-12-22 14:45:58
4083
原创 读书笔记——labuladong算法笔记
所以在写二分算法的时候要先想清楚是要用闭区间还是开区间,另外要明白“中点”这个概念是一个开区间的边界,因为在每次判断必然会判断这个点,因此如果你要用开区间,那么这个点可以直接使用,否则就需要跳过该点。双指针比较灵活,需要注意的就是你可以设计双指针的迭代方式,可以是快慢指针,也可以从起点像两边扩展的指针(对于回文子串有效)。另外,回溯算法和动态规划算法不一样的一点就是,回溯算法没有重叠子问题,没有办法通过字典来进行优化,就是纯的暴力搜索。2、连接:将一个域的父节点的父节点指向另外一个域的父节点;
2023-11-02 09:25:28
942
原创 读书笔记——C++高性能编程(六)
此时如果调用exchange,则需要各个线程再锁定cache-line,如果有多个等待线程,则所有等待线程的访问不是并行的,而load是读,是可以多个等待线程并行的访问的。操作系统更偏好于将CPU调度给占用大量CPU的线程,而自旋锁会占用大量的CPU,因此操作系统会更偏向于将CPU调度给正在等待的线程,从而导致等待释放自旋锁的线程没有CPU来执行释放。上面这个是一个wait-free的代码,仅仅是从代码层面看是不需要等待的(wait-free),但是如上所述,在机器的层面其还是会存在硬件层面的锁定。
2023-10-14 14:02:31
1205
1
原创 读书笔记——C++高性能编程(四、五)
对于缓存而言,如果多个线程没有使用到L3级缓存,那么多个线程可以和平的共处,因为不存在寄存器的竞争(虽然依然存在L1级缓存的竞争),但是如果使用到L3级缓存,由于L3级缓存是共享的,在线程太多的情况下就会发现L3级的缓存受到带宽限制,读取速度会变慢,从而拉低了所有线程的速度。第二点,由于缓存的加载会有预缓存的特性,因此,访问连续的内存速度要远快于随机访问。在判断失败的时候CPU虽然会冲刷流水线,但是缓存中的预加载还在,因此在访问缓存中预加载的索引,测量其速度就可以知道对应的被访问值的确切数值。
2023-10-09 09:57:46
150
原创 读书笔记——C++高性能编程(一至三)
介绍了两个性能分析器:perf,gperftools(https://github.com/gperftools/gperftools);以及一个微基准测试工具:google-benchmark(https://github.com/google/benchmark)。其中编译example可执行程序的时候要增加链接库-lprofiler才能使用pprof,编译完成后要使用CPUPROFILER环境变量制定生成的文件名。从这章中我们了解到,不同的整形的计算速度也是不一样的。
2023-10-08 13:03:58
512
原创 C++深度优化——无锁队列实现及测试
当然,这种实现确实是违背了lock-free的原则,因为自旋锁的存在会导致全局的阻塞,虽然这种情况只有在弹出最后一个元素的时候才会存在。总结了一下这些实现的最根本问题:在队列中只有一个元素的时候,在弹出该元素的同时,push可能正在修改该元素的next成员。如果涉及到共享内存的多线程代码在多线程执行下不可能互相影响导致被hang住,不管OS如何调度线程,至少有一个线程在做有用的事,那么就是lock-free。网上有很多无锁队列的实现,看了几个,发现都是有BUG的,也包括我之前写的关于无锁队列的实现。
2023-09-18 11:48:36
747
原创 C++深度优化——cacheline测试
这个地方可以发现,在没有填充的情况下,1秒内访问的速度是3.5*10^8;注意,我在struct c中的a和b都增加了volatile关键字,这个关键字的作用在于将缓存和主存硬绑定,有点同步打开文件描述符的意思。这里可以看到我的这台机器的cacheline大小是64B。cacheline是内存调度的基本结构,其大小一般为32B或者64B。所谓“伪共享”实际上是主存中的一个cacheline中的内容,在同一时刻只能被多核中的一个捕获处理。可以看到,两次的情况,不填充的速度总是要远远逊色于填充的情况。
2023-09-16 09:18:38
434
原创 算法——组合程序算法解析
这个算法的本质实际是一种状态机的保存和状态变化,从1个数的状态到n各数的状态,然后再逐一更换n个数的值。如何遍历这棵树,这里使用的是深度遍历,先遍历到最末叶子节点,然后再遍历其子节点,如此循环往复。放到这个算法,状态机的推进转换实际是通过C++函数栈的形式进行保存的。实际我们用自己创建的栈也可以同样实现,只要记录每个遍历到的节点的当前状态(循环到哪个数字)、求值域(循环到哪个数值结束)。当前状态保存在各递归的栈中,通过循环进行推动,获得各种组合。高清算法的最核心原理,将其关联到最基础的几个简单的认知。
2023-09-07 10:17:59
764
原创 C++元编程——模拟javascript异步执行
javascript有一个期约调用,就是利用内部的一种协程机制实现的类似并行的操作。可以看到,这个里面用了asyncTask创建了一个期约,然后调用期约执行程序。在期约执行的期间主线程会继续执行。当然,我觉得这个就是有点脱裤子放屁,直接创建一个线程,然后依次调用这些then函数就可以了。
2023-08-14 18:38:21
316
1
原创 股票指数——RSI指数
也就意味着RSI指数的取值是[0,100]之间,其中0表示周期内没有上涨的,100表示周期内没有下跌的。RSI的直观意义是它表示了一段周期内的上涨力占总量的比例,值越高上涨力越强。超过70表示的是进入了超买阶段、低于30表示进入超卖阶段。可见之前一日的成交量略大于之前下跌的成交量,这个是符合头肩底图形规则的,今天半日的成交量观察应该会超过上一个下跌的第二阶段的下跌,但是由于已经是超卖状态,其维持下跌趋势的可能性较低,因此不太可能形成头肩底,目前观察这是一个错误的信号,近期内不太可能形成强势的上涨状态。
2023-08-14 11:47:50
388
原创 TCP网络服务器设计
最近设计了一个网络服务器程序,对于4C8G的机器配置,TPS可以达到5W。业务处理逻辑是简单的字符串处理。服务器接收请求后对下游进行类似广播的发送。在此分享一下设计方式,如果有改进思路欢迎大家交流分享。程序运行在CentOS7.9操作系统上,GCC使用4.8.5版本,网络是千兆网。
2023-08-07 11:11:15
573
原创 决策树——CART
CART分类回归树主要是通过灵活的分类方式,而不是死板的维度,对样本集进行划分,使用基尼系数计算分类后的信息增益,然后找到最大的增益方向并进行分类。
2023-05-31 18:12:13
340
原创 决策树——ID3和C4.5
1)输入数据集S,对各个参数进行分类,分别求出当前数据集的信息熵和分类后的期望熵,用当前数据集的信息熵减去期望熵得到信息增益;ID3决策树原理是使用使信息熵下降速度最快(也即不确定性降低速度最快)的参数逐次进行分类的方法。2)在所有参数中找到信息增益最大的那个参数,用那个参数将数据集分成子集;3)如果子集为同一类别,则为叶子节点,函数返回;4)否则针对子集,使用步骤1和2递归进行分类;
2023-05-29 20:05:39
303
原创 C++元编程——EM算法求解高斯混合模型
EM算法跟K-means差不多,步骤就是:1)首先随机固定个数类的均值和方差矩阵;2)将数据集按照目前的分类计算概率,分派到每个类上;3)对各类中的数据计算其均值和方差;4)误差达标则退出,未达标则返回第2步继续执行。下面是实现代码,模拟的是多高斯分布使用EM算法进行优化。20次迭代就收敛了,结果也正确,识别出3类的均值和方差差别不大。
2023-05-16 15:20:22
486
2
原创 关于人工智能的想法
理由如下:1、人工智能缺乏自主性,人工智能起始的学习数据来自于人类加过标签的数据,无论多么复杂高深的技术,目前尚不能让机器学会自己归纳吸取自然界的信息。目前人工智能的种群(如果存在的话),其物理实体完全控制于人类的物理创造(硬盘和CPU);目前人工智能不能正确认识到物理世界的规律,也不能进行物理世界规律的自主发觉也枉谈有指导的改造(这一点更需要依赖于低成本的假象实验)。人工智能发展成“生物”需要人类社会的运算力及存储力3到4个数量级的提升才有可能发生(想像一下,一万个个体的种群才有可能较长久存活下来)。
2023-05-04 18:38:15
293
原创 C++元编程——SVM实现
支持向量机也叫最大间隔机,主要的想法是找到样本集两类中距离最近样本的距离最大的超平面。在寻找超平面的时候涉及到一个样本权重的计算。目前比较流行的方法是使用SMO算法进行优化。因为优化过程及计算过程中使用到的都是样本的乘积,因此引入核函数,将二维的相乘改造成其他坐标系中的类似计算,从而能够实现非线性的分类功能。支持向量机的优点就是这个算法涉及到的只是支持向量,所以计算量不是很大。可见SVM确实正确分类了非线性的数据。
2023-05-04 15:40:15
619
原创 SSL-RSA加密算法实践
这个程序显然不能用于实际使用,其主要原因是求幂,只要一个3位数对3位数的求幂就可以让Python程序报错。一个数据可加密的最大数值是n(毕竟要对n求余)。RSA算法分三部分:1)密码生成;RSA的算法很简单,但是数学原理比较深入。
2023-03-29 17:39:35
269
原创 信息聚合整理理论研究
首先,每个人对于每条信息的时间窗口应该有一个模糊的明确时间窗口,其次能进行时间窗口的设置。我觉得应该对一段时间内依然有效的信息进行可视化的展示,并能够提供信息的概要,这样在图表展示的同时也能明确这些事情到底是哪些。针对目的已经明确的属性,我们可以通过贴标签的方式,给对应的信息集合贴上数个标签,在需要的时候根据标签进行索引。针对潜在的属性,我们如果无法分析数据则不可能提供这种标签,机器学习的方法也无法针对每个人的模糊目的进行匹配,匹配出的结果也可能过多或者缺漏,会导致聚合意义降低,失去使用价值。
2023-03-29 10:20:36
234
原创 动态链接问题及linux多进程调试
最近遇到一个问题,服务器上的程序一直起不来,gdb调试也会在中间“正常退出”。这个程序实际是一个主线程fork出一个守护进程。
2023-02-20 18:27:16
200
原创 BOLL线——C++函数式编程实现
BOLL线由上线、中线、下线组成。中线是R_N日内的股票收盘价均值,上线是均值加上2个标准差,下线是均值减去2个标准差。上线是按照估计最大概率的价格区间,下线是按照高斯分布的最大下线的分布区间。
2023-02-16 16:52:56
523
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人