![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 91
库达ZT
这个作者很懒,什么都没留下…
展开
-
CUDA_GPU编程
•线程组分歧():尽量保证32个线程都进同样的分支,否则两个分支都会执行。•延迟隐藏():需要有足够的blockDim供SM在陷入内存等待时调度到其他线程组。•寄存器打翻():如果核函数用到很多局部变量(寄存器),则blockDim不宜太大。•共享内存():全局内存比较低效,如果需要多次使用,可以先读到共享内存。•跨步访问(coalescedacccess):建议先顺序读到共享内存,让高带宽的共享内存来承受跨步。•区块冲突():同一个warp。原创 2023-07-01 18:37:51 · 764 阅读 · 0 评论 -
访存优化_4、多维数组,插桩与循环分块、莫顿码、多核缓存伪共享
二维数组因为涉及到扁平化的问题,所以分为了两种方法。以下符号约定:i 行号,j 列号;n 行数,m 列数C/C++ 编译器把静态数组 a[i][j]翻译为a[i* m + j],所以是行主序。Fortran 等会把矩阵A(i, j)翻译为a[i+ j * n],所以是列主序。手动扁平化时,如果用 a[i* m + j]就是行主序。手动扁平化时,如果用 a[i+ j * n]就是列主序。简单来说:哪个索引连续,就是什么主序。实际上,如果你认为 C++原创 2023-06-25 23:47:52 · 349 阅读 · 0 评论 -
访存优化_2、预取与直写
针对于原书中的问题,可以在写入时引入_mm_stream_si32()函数,这个函数可以代替直接赋值的操作,改为现绕开缓存,将一个4字节的写入操作挂起到临时队列,等凑满了64字节再统一写入内存,从而避免读的内存。),程序的内存是一页一页贴在地址空间中的,有些地方可能不可访问,或者还没有分配,则把这个页设为不可用状态,访问他就会出错,进入内核模式。的计算,从而只要计算的延迟小于内存的延迟,延迟就被隐藏起来了,而不必等内存抵达了再算。随机访问时,只随机块的位置,而块的内部仍然按顺序访问。原创 2023-06-06 20:57:42 · 603 阅读 · 1 评论 -
TBB并行编程_4分治,流水线
tbb::make_filter(tbb::filter_mode::serial_in_order, ...):这是一个函数调用,用于创建一个过滤器。它指定了过滤器的输入类型为void,表示没有输入数据,输出类型为Data*,表示输出为指向Data类型对象的指针。在这里分别使用了两种算法,第一种是串行的,第二种是cut-off并行的(就是当数据较小的时候采用串行,数据较大的地方采用并行)。像是这一种,那么在这里当t4处理d1的s4的时候,t3正在处理d2的s3。原创 2023-06-02 17:40:13 · 283 阅读 · 0 评论 -
访存优化_1、带宽、缓存局域性
通常来说,并行。因此,对 fill这种没有任何计算量,纯粹只有访存的循环体,并行没有加速效果。称为内存瓶颈(而 sine这种内部需要泰勒展开来计算,每次迭代计算量很大的循环体,并行才有较好的加速效果。称为计算瓶颈(cpu-bound并行能减轻计算瓶颈,但不减轻内存瓶颈,故后者是优化的重点。那我们给他每个加上1是不是就能变快了?可以看到并不是这样的因为一次和相比实在太少了。计算太简单,数据量又大,并行只带来了多线程调度的额外开销。小彭老师的经验公式:1次浮点读写。原创 2023-06-05 19:35:34 · 504 阅读 · 0 评论