- 博客(79)
- 问答 (2)
- 收藏
- 关注
原创 【cuda学习日记】5.2.1 共享内存额外篇
示例代码中, block的大小是(4,2), 所以在核函数中声明4x2大小的 SMEM, 只需要一次load操作,则8个线程会将数据load进 4x2大小的SMEM里。在做printf的时候,因为SMEM对block 可见,所以访问SMEM[0][0] 打印出来的都是block里第一个线程load进去的数据。3.Block内的线程可以通过共享内存通信。2.由同一个Block内的所有线程共享。1.GPU执行的基本单位,包含一组线程。4.Block之间是独立执行的。Block(线程块)
2025-04-14 15:56:55
173
原创 【cuda学习日记】8.2 GPU加速库 --cuBLAS
两个矩阵都没有转置 – CUBLAS_OP_N (CUBLAS_OP_N ,CUBLAS_OP_T)N 代表列优先,T则变成行优先。如以上代码矩阵A的尺寸m*k 为 3x2 (3行2列) B 为k * n (2x2), 相乘矩阵C 尺寸 m * n;C的数据依然是列优先,所以显示在内存里的顺序是3,4,5,9,14,19。在内存A里的数据是0,1,2,3,4,5,根据列优先,则矩阵A =因为C在内存里依然是列优先顺序: 2,6,10,3,11,19。因为矩阵变为行优先,所以lda = k。
2025-03-20 16:13:48
571
原创 【cuda学习日记】8.1 GPU加速库 --cuSPARSE
坐标稀疏矩阵格式(COO)存储了稀疏矩阵中每个非零元素的行坐标、列坐标及其元素值。因此当通过给定的行列坐标对存储在COO格式中的稀疏矩阵进行检索的时候,如果没有匹配值,那么这个位置的值为零. 只有当矩阵中的非零元素不到1/3时,才会节约存储空间。编译: nvcc -o dense2csr cusparse.cu -lcusparse。cuSPARSE是一个线性代数库,内含很多通用的稀疏线性代数函数。把矩阵中的每个元素都存储起来,不管它是否为零。
2025-03-14 14:19:46
436
原创 【cuda学习日记】7.1 CUDA指令
标准函数包含来自于C标准数学库的数学运算,如sqrt、exp和sin。CUDA内置函数只能对设备代码进行访问。在CUDA中,许多内部函数与标准函数是有关联的,这意味着存在与内部函数功能相同的标准函数。举个例子,标准函数中的双精度浮点平方根函数也就是sqrt。内部函数分解成了比与它们等价的标准函数更少的指令。这会导致内部函数比等价的标准函数更快,但数值精确度却更低。为a和b的最后一个数字不同,预期输出不同,但实际输出: a equal b。下面是调用内部函数的PTX, 而调用标准函数的编译代码有~140行。
2025-03-05 18:02:03
230
原创 【cuda学习日记】6.1流
到目前为止,我们的关注点仅限于内核级的并发,在此级别的并发中,单一的任务或内核被GPU的多个线程并行执行。接下来学习到如何使用CUDA流实现网格级的并发。
2025-03-05 13:22:15
307
原创 【cuda学习日记】5.4 常量内存
进一步验证,查看生成的PTX(虚拟汇编)代码。常量内存其实只是全局内存的一种虚拟地址形式。会生成: constant_mem.ptx。
2025-03-03 17:34:48
229
原创 【cuda学习日记】5.3 减少全局内存访问
发现用动态分配共享内存实现的核函数和用静态分配共享内存实现的核函数之间没有显著的差异。reduceGmem – 使用全局内存作为基准。reduceSmem – 使用共享内存。5.3.1 使用共享内存进行并行归约。在第3章讨论过的并行归约问题。5.3.3 动态共享内存。
2025-03-03 14:18:27
139
原创 【cuda学习日记】5.2 共享内存数据分布
尝试通过NCU查看shared memory transactions。在调用核函数的时候需要在<<>>>的第三个参数中传递memory大小。填充数组是避免存储体冲突的一种方法。填充静态声明的共享内存很简单。·从共享内存中按行主序读取这些值并将它们存储到全局内存中。核函数不知道需要声明多少大小的SMEM时,可以用动态声明。·将全局线程索引按行主序写入到一个二维共享内存数组中。5.2.2 按行主序写和按列主序读。5.2.4 填充静态声明的共享内存。5.2.3 动态共享内存。5.2.1 方形共享内存。
2025-02-27 15:05:22
348
原创 【cuda学习日记】5.1 共享内存
共享内存被SM中的所有常驻线程块划分,因此,共享内存是限制设备并行性的关键资源。为了获得高内存带宽,共享内存被分为32个同样大小的内存模型,它们被称为存储体,每个存储体可以存储8个字节大小的数据 (计算能力2.x为4位),它们可以被同时访问。__syncthreads还确保在障碍点之前,被这些线程访问的所有全局和共享内存对同一块中的所有线程都可见。内存栅栏的功能可确保栅栏前的任何内存写操作对栅栏后的其他线程都是可见的。下面的代码可能会导致块中的线程无限期地等待对方,因为块中的所有线程没有达到相同的障碍点。
2025-02-27 11:02:32
412
原创 【cuda学习日记】4.4核函数带宽(矩阵转置问题)
一旦所有的SM都被完全占用,所有剩余的线程块都保持不变直到当前的执行被完成。由于线程块完成的速度和顺序是不确定的,随着内核进程的执行,起初通过bid相连的活跃线程块会变得不太连续了。观察输入和输出布局,你会注意到:·读:通过原矩阵的行进行访问,结果为合并访问·写:通过转置矩阵的列进行访问,结果为交叉访问。因此,当用对角坐标表示块ID时,需要将对角坐标映射到笛卡尔坐标中,以便可以访问到正确的数据块。编程模型抽象可能用一个一维或二维布局来表示该网格,但是从硬件的角度来看,所有块都是一维的。69.159233%
2025-02-26 14:15:57
831
原创 【cuda学习日记】4.3 结构体数组与数组结构体
如图说明了AoS和SoA方法的内存布局,用AoS模式在GPU上存储示例数据并执行一个只有x字段的应用程序,将导致50%的带宽损失。4.3 数组结构体(AoS)和结构体数组(SoA)·对齐及合并内存访问,以减少带宽的浪费。·足够的并发内存操作,以隐藏内存延迟。4.3.1 简单示例AoS。4.3.1 简单示例SoA。SoA方法来存储数据。
2025-02-24 17:02:55
295
原创 【cuda学习日记】4.2 内存访问模式
如果这两级缓存都被用到,那么内存访问是由一个128字节的内存事务实现的。如果线程束中的每个线程请求一个4字节的值,那么每次请求就会获取128字节的数据,这恰好与缓存行和设备内存段的大小相契合。没有缓存的加载不经过一级缓存,它在内存段的粒度上(32个字节)而非缓存池的粒度(128个字节)执行。如图是非对齐和未合并的内存访问。当设备内存事务的第一个地址是用于事务服务的缓存粒度的偶数倍时,就会出现对齐内存访问。当一个线程束中全部的32个线程访问一个连续的内存块时,就会出现合并内存访问。4.2.1 缓存加载。
2025-02-24 15:32:50
555
原创 【cuda学习日记】4.1 内存
是不能给devData的传递数据。·全局内存 – GPU中最大、延迟最高并且最常使用的内存。因此,CUDA编程的一个基本原则应是尽可能减少主机与设备之间的传输。·寄存器 – 最快的内存空间,有限的资源,核函数中声明的没有其他修饰符的自变量,核函数使用超出限制,则用本地内存。·常量内存 – 只读,修饰符是__constant__。·本地内存 – 线程私有,本质上与全局内存在同一块存储区域,所以高延迟低带宽。变量devData作为一个标识符,并不是设备全局内存的变量地址,所以。·纹理内存 – 只读。
2025-01-23 14:19:17
397
原创 【CUDA学习日记】3.4 动态并行
动态并行是指在一个CUDA内核执行时,该内核能够动态地启动其他内核的能力。启用动态并行,你需要在编译CUDA代码时使用-rdc=true选项,并且确保你的GPU支持这一特性。子线程、子线程块或子网格被父母启动。子网格必须在父线程、父线程块或父网格完成之前完成。编译: nvcc .\nestedHelloworld.cu -o .\nestedHelloworld -rdc=true。由输出可以看出, 主机调用的父网格有1个线程块和8个线程。核函数递归地调用三次,每次调用的线程数是上一次的一半。
2025-01-22 17:40:20
373
原创 【cuda学习日记】2.2 使用2维网络(grid)和2维块(block)对矩阵进行求和
block的尺寸为32x32。//block(dimx,dimy)定义的。接下来进行2维网络(grid)和2维块(block)对矩阵进行求和。在2.0中进行了用一维网格和块对一维向量进行了求和。在2.1中例化了二维的网格和块。基本流程和1维向量求和类似。
2025-01-08 14:45:36
564
原创 【cuda学习日记】2.1 2D matrix操作
因为block(4,2)定义的block.x =4, block.y = 2, 所以grid的尺寸 grid(2,3), grid.x = 2, grid.y = 3。生成的2D 矩阵 8X6 在HOST里的样子。而后在printThreadindex里输出。2.1.1 检查块和线程索引。
2025-01-07 23:32:19
747
原创 AX301 led_test
module led_test(input rst,input clk,output reg [3:0]led);reg [31:0] timer;always @(posedge clk or negedge rst)begin if (!rst) timer <=32'd0; else if (timer == 32'd299_999_999) timer <=32'd0; else timer <= timer +1;endalways @(
2020-09-21 15:20:03
225
原创 Exams/review2015 fsm
https://hdlbits.01xz.net/wiki/Exams/review2015_fsmmodule top_module ( input clk, input reset, // Synchronous reset input data, output shift_ena, output counting, input done_counting, output done, input ack ); par
2020-08-26 16:24:37
606
原创 Exams/review2015 fsmshift
https://hdlbits.01xz.net/wiki/Exams/review2015_fsmshiftmodule top_module ( input clk, input reset, // Synchronous reset output shift_ena); parameter S0=0,S1=1,S2=2,S3=3,S4=4,S5=5; reg [2:0] cs,ns; always@(*) begin
2020-08-26 15:12:07
456
原创 Exams/review2015 fsmseq
https://hdlbits.01xz.net/wiki/Exams/review2015_fsmseqmodule top_module ( input clk, input reset, // Synchronous reset input data, output start_shifting); parameter S0=0,S1=1,S2=2,S3=3,S4=4; reg [2:0] cs,ns; always @(*)
2020-08-26 14:59:26
998
原创 Exams/review2015 shiftcount
Exams/review2015 shiftcountmodule top_module ( input clk, input shift_ena, input count_ena, input data, output [3:0] q); always @(posedge clk) begin case ({shift_ena,count_ena}) 2'b00:q<=q;
2020-08-26 14:41:22
352
原创 hdlbits_Exams/2012_q2fsm
https://hdlbits.01xz.net/wiki/Exams/2012_q2fsmmodule top_module ( input clk, input reset, // Synchronous active-high reset input w, output z); parameter A=0,B=1,C=2,D=3,E=4,F=5; reg [2:0]state,next; always @(*) begin
2020-06-10 14:21:56
332
原创 hdlbits_Exams/m2014_q6b
https://hdlbits.01xz.net/wiki/Exams/m2014_q6bmodule top_module ( input [3:1] y, input w, output Y2); reg [3:1]d; parameter A=0,B=1,C=2,D=3,E=4,F=5; always@(*) begin case(y) A:d = w?A:B;
2020-06-08 20:48:36
1031
原创 hdlbits_Exams/2014_q3c
https://hdlbits.01xz.net/wiki/Exams/2014_q3cmodule top_module ( input clk, input [2:0] y, input x, output Y0, output z); parameter S0=0,S1=1,S2=2,S3=3,S4=4; reg [2:0]Y1; always@(*) begin case(y)
2020-06-05 20:14:17
1058
1
原创 hdlbits_Exams/2014_q3bfsm
https://hdlbits.01xz.net/wiki/Exams/2014_q3bfsmmodule top_module ( input clk, input reset, // Synchronous reset input x, output z); parameter S0=0,S1=1,S2=2,S3=3,S4=4; reg [2:0] cs,ns; always@(*) begin
2020-06-05 19:37:47
272
原创 hdlbits_Exams/2014_q3fsm
https://hdlbits.01xz.net/wiki/Exams/2014_q3fsmerror info:module top_module ( input clk, input reset, // Synchronous reset input s, input w, output z); parameter A=0,B=1; reg state,next; reg[2:0]d; parameter
2020-06-05 19:32:22
644
原创 hdlbits_Exams/ece241_2014_q5b
https://hdlbits.01xz.net/wiki/Exams/ece241_2014_q5b有errormodule top_module ( input clk, input areset, input x, output z); parameter A=0,B=1; reg state, next; always @(*) begin case(state)
2020-06-04 16:59:56
1506
原创 hdlbits_ece241_2013_q8
https://hdlbits.01xz.net/wiki/Exams/ece241_2013_q8module top_module ( input clk, input aresetn, // Asynchronous active-low reset input x, output z ); parameter idle=0,S1=1,S2=2; reg [1:0]state,next; always
2020-06-02 17:20:28
329
原创 hdlbits_Fsm_hdlc
https://hdlbits.01xz.net/wiki/Fsm_hdlc有errormodule top_module( input clk, input reset, // Synchronous reset input in, output disc, output flag, output err); reg [7:0]d; always @(posedge clk) begin
2020-05-31 19:41:29
438
2
原创 Fsm_serialdata_hdlbits
https://hdlbits.01xz.net/wiki/Fsm_serialdata看图发现先进的是bit0module top_module( input clk, input in, input reset, // Synchronous reset output [7:0] out_byte, output done); // reg [9:0] d; // Use FSM from Fsm_serial paramete
2020-05-29 20:56:57
522
原创 hdlbits_Exams/review2015_shiftcount
https://hdlbits.01xz.net/wiki/Exams/review2015_shiftcountmodule top_module ( input clk, input shift_ena, input count_ena, input data, output [3:0] q); always @(posedge clk) begin if (shift_ena) q&
2020-05-27 19:23:58
320
原创 hdlbits_Exams/review2015_fsmseq
https://hdlbits.01xz.net/wiki/Exams/review2015_fsmseq用LFSR 写更简单一些module top_module ( input clk, input reset, // Synchronous reset input data, output start_shifting); reg [3:0] d; always @(posedge clk) begin
2020-05-27 19:19:04
469
1
空空如也
python 抓的UDP数据与实际不符
2022-01-18
用wireshark可以抓到UDP数据包,但是用python socket抓不到数据。
2022-01-17
TA创建的收藏夹 TA关注的收藏夹
TA关注的人