- 博客(10)
- 收藏
- 关注
原创 CUDA实现矩阵向量乘法gemv
即使是使用指令去禁用L1Cache,只是用L1 Cache也存在访存粒度,也就是Cache从主存取数据是的最小单位,比如:不使用L1 Cache的粒度是32字节,即使只需要1字节,也会取连续的内存。如果是另一种情况,即所有线程都访问一个地址,那么利用率就是4/128=3.125。j=0时,线程0访问𝐴 ^ 𝑇[0],线程1访问𝐴 ^ 𝑇[1]。第一种1次内存事务就可以完成,因为是连续的128字节。内存情况也变了,32字节一段,128字节4段连续。写,没有L1Cache的事,只有L2Cache。
2025-05-13 22:23:42
958
原创 CUDA实现并行扫描
扫描:scan• • • • 也称为前缀扫描prefix-scan、前缀求和prefix-sum• • • • 并行扫描parallel scan 、并行前缀求和parallel prefix sum并行算法重要基本模块,用于:• • • • 基数排序(radix sort)• • • • 快速排序( quicksort)• • • • 流压缩( stream compaction)和流拆分( stream splitting )• • • • 稀疏矩阵与向量的乘法。
2025-05-12 18:33:44
952
原创 CUDA实现并行归约
• 功能:按width划分线程束,返回块内偏移量为srcLane的线程的var值(类似广播) • mask:掩码32位,表示warp中参加该shuffle的线程,1表示参加,0表示不参加。在32M规模数据下,时间比起手动优化的略少,但是当数据规模扩大时,手动优化的效率就比thrust高了,不过手动实现的时间成本高,看权衡吧。如下图,一个block内,一开始就有一半线程不工作,迭代2不工作的又少一半,,,以此类推。----• 0号线程取sdata[0]和sdata[1]
2025-05-10 16:00:32
2021
原创 StellarSim优化实践(2)——SIMD
查看gprof分析结果,我们会发现getACC的子调用时间占很大比例,其中占大头的是getGradW和getDensity的子调用,另外getPairwiseSeparations也很占时间。我们可以看到这两个函数存在大量的pow、sqrt和exp操作,其中pow和exp在neon指令集中并不存在,所以我们得想办法让向量也可以完成pow和exp计算。故事紧接上次采用OpenMP和传统优化技术对StellarSIM的优化,我们继续用gprof分析程序单线程的执行时间。Emmmmm,有点脱裤子放屁的意思。
2025-05-01 19:33:26
540
原创 NEON Instrinsic指令集、OMP编译器自动向量化及实践
Instrinsic函数:对汇编指令的包装,类似C函数接口风格,更加友好下面的C代码和汇编指令是实现的同一种功能type:数据类型,如int/float/polysize:数据大小lanes:通道数,即元素个数向量类型数组如:int32x4_t vec[4],代表4个向量寄存器访问第i个向量,vec[i]
2025-04-22 16:38:13
893
原创 StellarSim优化实践——基础优化和OpenMP
上述分析可以看到,主要是getAcc、getDensity、getGradW、getPairwiseSeqarations、getW函数占用时间比例大,这也是我们的主要优化目标。另外,经前辈指点,getAcc存在对acc[0][j]写数据时存在“伪共享”问题,使用私有变量解决。在双重嵌套循环中,wx、wy、wz3个数组的访问顺序和循环是相反的,这导致了访存成本增加。使用一个强可扩展性测试的脚本测试了线程数为1、2、4、6、12、24、32的程序。线程为1时就是串行运行,所以执行时间和串行执行差不了太多。
2025-04-13 16:17:45
802
原创 OpenMP并行化实现矩阵乘法
先实现串行程序,并输出结果作为参考。完成基本的矩阵乘法串行程序,并输出时间和计算结果。for (i = 0;i < m;j < n;//初始化//开始时间for(i = 0;i < size;j < size;i < size;j < size;
2025-04-03 20:47:00
1418
原创 基于行列分块并行算法和Cannon算法的两种MPI并行 实现Gemm
行列分块需要实现1,阻塞通信版本2,非阻塞通信版本3,重复非阻塞通信版本Cannon算法选择上述任意一种即可。
2025-03-28 19:53:17
919
原创 python连接数据库时的编码问题(便于日后复习)
python连接数据库时,使用连接工具pymysql的编码问题在学习python读取数据库中数据时,用到了SQLAlchemy库中的create_engine()函数import pandas as pdfrom sqlalchemy import create_engine# create_engine的参数填入的是一个链接字符串:数据库产品名+连接工具名://用户名:密码@数据库IP地...
2020-04-19 12:22:33
736
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅