高性能计算SIMD实验CPU SIMD+GPU SIMD

CPU SIMD

Intel SIMD

Code:

Run on my PC:

Analysis:

这段程序比较了使用SIMD指令SSE和不使用SIMD指令两种方式的计算速度差距。程序计算的是根号x除以x的值,程序中用SIMD指令可以并行四个浮点数计算,最后我们发现SIMD指令可以有效加速计算

Kunpeng SIMD(ARM NENO)

Code:

Run on HUAWEI TaiShan200 server

Analysis:

程序使用了ARM NEON指令集提供的函数实现了对16个uint8_t类型的数据进行并行计算。add3函数是使16个unit8_t元素的向量每个元素加3。其中vmovq_n_u8函数创建了一个有16个uint8_t 类型元素的向量three,每个元素值都是3。vaddq_u8函数将three和data中每个对应元素相加,将结果写回data。print_uint8函数,用于打印uint8x16_t类型的向量,方法是先把向量元素的值存储到数组再打印。主函数中定义了一个uint8_data数组,包含了16个 uint8_t类型的数据再转化为16个元素的向量data。print_uint8函数打印出data最初的值,再调用add3函数操作data,最后调用print_uint8函数打印出计算后的值。

GPU SIMD

CUDA installation information

通过win+r输入cmd打开命令行,用nvcc -V查看cuda的安装信息,我安装的版本是11.7

deviceQuery in CUDA

按照我的按照位置在

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\extras\demo_suite

下运行deviceQuery,可以看到给出了详细的设备信息,里面有我的显卡型号和最大的计算能力,以及运行内存和主频等

vector calculation in CUDA

Code:

Result:

这个是根据源码运行的结果

增加一个计时,源码是用了一个线程块计算,时间为0.03677s

更改线程块参数,每个线程块只能计算两个线程,于是需调用五个线程块并行计算,速度明显提高

Analysis:

程序创建了一个包含10个元素的浮点数数组。把数组从主机内存复制到显卡的内存中。调用显卡的算力,然后,它计算了该数组中每个元素的平方,并将结果存到显卡的内存。最后,它从显卡内存中将计算结果复制回主机内存,打印出每个元素的索引以及对应的平方值。

计算过程采用了并行计算,这里设置了每个线程块包含32个线程,每个线程计算一个数组元素的平方。由于数组大小为10,因此只需要启动1个线程块

PI calculation in CUDA

Code:

Result:

这是根据源码未作修改的运行结果,源码中每个线程块的线程数是1024,而计算只调用了一个线程块

这是我根据我显卡的线程块上限调整了代码,调用了十四个线程块计算,速度提升了十倍左右

Analysis:

使用 CUDA 计算圆周率的程序。程序中sumHost和sumDev两个数组分别在主机和显卡内存中存储计算结果。cudaMalloc() 函数和 cudaMemset() 函数在显卡开辟空间以及清零,然后执行 cal_pi 函数对圆周率进行计算。计算是在显卡上并行地运行的,它会根据输入的参数计算圆周率,并将结果存储在传入的 sum 数组中。每个线程计算一部分区域的和,编号为 idx = blockIdx.x * blockDim.x + threadIdx.x。通过循环,每次累加一小段区域的和,即计算左端点为 (i+0.5)*step,右端点为 (i+1.5)*step 的小矩形面积,并将结果加到 sum[idx] 中。最后,程序输出了圆周率的值以及计算所花费的时间。计算前用numBlocks 和 threadsPerBlock 来分指定了线程块数量和线程数。用 <<<numBlocks, threadsPerBlock>>> 来指定使用多少个线程块和每个线程块中包含多少个线程。

猜你喜欢

转载自blog.csdn.net/lijj0304/article/details/130907858
今日推荐