申请内存时是线性的内存,需要知道是按行还是按列排列
设计的好的话内存是对齐的
我们希望线程和内存都是线性排列对齐,效果就会很好。
grid每个维度有多少block
block则是定义每个维度有多少线程
处理矩阵的话可以用二维的网格和块
在使用 CUDA 进行矩阵乘法等大规模矩阵计算时,通常需要将输入矩阵按照块的形式划分为多个子矩阵,然后分配到不同的线程块中去计算,以充分利用GPU并行计算的优势。
对于二维的网格和块而言,其可以很好地描述矩阵的结构,这样可以方便地对每个块做相对应的操作。比如,我们可以定义一个2D线程块,其中每个线程块由多个2D线程组成,每个线程处理一个小块或者一个小行/列。然后,我们可以按行、列或元素交错地访问内存,使所有线程能更加高效地并行访问主机内存。
在处理一维向量时,可以考虑将其作为一个一维数组,在代码中可以从全局索引映射到局部索引。在这种情况下,通常需要对齐内存以提升访问速度和性能。具体来说,可以使用 __align__(n)
修饰符来对变量进行对齐处理,将其地址对齐到 n 的倍数上。例如,使用 __align__(16)
可以将变量地址对齐到16字节边界上。
对于单个块的情况,可以使用共享内存来提高访问速度,以便线程块中的所有线程都可以快速、有效地访问它。同时,在使用共享内存时,需要确保线程块中的线程都能够正常读写,以避免竞争条件的发生。
总之,在 CUDA 中处理矩阵和向量时,需要根据任务的具体特点进行灵活选择和处理,以充分发挥GPU并行计算的优势。
可读可写
线程自己的内存一般都是用完了就释放了
常说的显存,比方说8g 16g
延迟最高,通过l2和mp相连
读的时候有cache 写的时候没有 GPU通过cache大幅度提高效率
有些数据用不到会降低吞吐量
因为这些缓存的存在提前将要读的数据 load, 极大提高效率