手机百度 网站提交三水做网站
手机百度 网站提交,三水做网站,wordpress主题模板 教育,网页设计实验报告结果分析习题
一
在文件sumArraysOnGPU-timer.cu中#xff0c;设置block.x#xff1d;1023#xff0c;重新编译并运行。与执行配置为block.x#xff1d;1024的运行结果进行比较#xff0c;试着解释其区别和原因#xff1a;
现象与分析
本次实验使用的数据划分是一维block和一维gr…习题一在文件sumArraysOnGPU-timer.cu中设置block.x1023重新编译并运行。与执行配置为block.x1024的运行结果进行比较试着解释其区别和原因现象与分析本次实验使用的数据划分是一维block和一维grid为了使得实验现象更精确数据量大小改成了125即128MBblocksize改成1024-31发现block.x为1024,kenerl需要的时间短于993,且两次gpu的计算时间远远短于cpu。原因2. 资源浪费即使只有 1 个线程活跃GPU 仍要为整个 warp 分配寄存器、调度槽位3. 执行时间不减少warp 的执行时间取决于最慢的线程空闲线程不会让 warp 变快4. 占用率下降每个 SM 能同时驻留的 warp 数有限“残废” warp 降低了整体利用率思考第一次比较的时候我使用的是cpu的工具gettimeofday这样会导致对GPU的计时包括了数据的流转而非单纯kenerl的计算,且数据量很小64k导致每次运行的时间极短,误差较大对于GPU运行时间应当使用cudaevent如下:cudaEvent_t start_GPU,stop_GPU;...cudaEventCreate(start_GPU);// 创建CUDA事件cudaEventCreate(stop_GPU);cudaEventRecord(start_GPU);// 记录GPU开始时间sumArraysgridsize,blocksize(d_a,d_b,d_c,size);// 启动内核cudaEventRecord(stop_GPU);// 记录GPU结束时间cudaEventSynchronize(stop_GPU);// 等待内核执行完成二参考文件sumArraysOnGPU-timer.cu设置block.x256。新建一个内核使得每个线程处理两个元素。将此结果和其他的执行配置进行比较现象与分析需要修改两个地方第一处修改kenerl函数为__global__voidsumArrays_2elem(float*a,float*b,float*c,intn){intidxblockIdx.x*blockDim.x*2threadIdx.x;// 计算全局线程IDif(idxblockDim.xn)// 处理第二个元素{c[idx]a[idx]b[idx];// 执行元素级加法c[idxblockDim.x]a[idxblockDim.x]b[idxblockDim.x];}}第二处将girdsize除以2由于每次计算相邻两个数据可以看做block变为原来的2倍长所以gird可以减小一半dim3 gridsize((sizelen-1)/(len*2));// 计算网格大小时长当block为256时速度最快。思考256block相对于512的情况线程数减半 → Kernel 启动、调度开销降低每个线程连续访问两个元素 → 内存预取效率提升边界判断次数减半 → 分支预测更准耗时更短128block相对于256的情况每个线程需要更多寄存器 → occupancy 下降总并行线程数减少 → 无法完全隐藏内存延迟代码复杂度增加 → 编译器优化难度提升总体来说修改kenerl为2element加速有限说明原配置已接近硬件最优三参考文件sumMatrixOnGPU-2D-grid-2D-block.cu并将它用于整数矩阵的加法运算中获取最佳的执行配置现象与分析block sizegrid sizeGPU time32,32512,51237.668865 ms32,16512,102426.476543 ms32,8512,204825.776129 ms32,526.267649 ms32,4512,409624.706047 ms32,325.240543 ms32,2512,819235.554302 ms32,1512,1638463.569920 ms最佳配置block(32,4), grid(512,4096)预期性能~24.7ms (16384×16384 矩阵)加速比相比 CPU 约 40-50 倍思考128 线程/block 4 warpswarp 对齐无浪费资源消耗适中SM occupancy 接近 100%block.x32 保证内存访问完美合并每 block 工作量适中调度开销占比最优不盲目追求最大 block或最高 occupancy需要平衡每个SM里面的block和资源消耗。四参考文件sumMatrixOnGPU-2D-grid-1D-block.cu新建一个内核使得每个线程处理两个元素获取最佳的执行配置现象与分析因为kenerl处理2个元素故以下grid x都除以了2对于2d block和2d gridblock sizegrid sizeGPU time32,32256,51228.575745 ms32,16256,102420.695040 ms32,8256,204820.259840 ms32,521.350401ms32,4256,409620.180992 ms32,319.796991ms32,2256,819219.982016ms32,1256,1638450.400257 ms对于1d block和2d girdblock sizegrid sizeGPU time10248,1638428.033024ms51216,1638420.207617ms25632,1638420.259840 ms12864,1638419.562496 ms64128,1638427.003904 ms32256,1638449.563648 ms16512,1638449.302528 ms思考2elem 的1d block配置整体更快1D Block → 所有线程在同一行 → 缓存局部性最佳block.x128 → 平衡 occupancy 和调度开销2elem → 减少线程启动和边界检查次数网格减半 → 避免冗余计算五借助程序checkDeviceInfor.cu找到你的系统所支持的网格和块的最大尺寸现象与分析可以看到支持的最大块和网格为Maximum sizes of each dimension of a block: 1024 x 1024 x 64Maximum sizes of each dimension of a grid: 2147483647 x 65535 x 65535第二章完结回头来补前面的知识点。