初学cuda程序的一点记录
来源:互联网 发布:我是大主宰服务端源码 编辑:程序博客网 时间:2024/06/06 05:34
编cuda程序比较少,尤其是性能分析器也不会看,过段时间还要找工作,把今天看的调的一点点东西记下来,也不一定对,先记录着。程序优化后面再说,就是个naive版代码和分析。
kernel函数分成两个,在主机端调用两次
//按列求和,得到width个结果
__global__ void colAdd(unsigned char* image, int width, int height, int leftUpX, int leftUpY, int x, int y, int* colSum){int tidX = threadIdx.x;int sum = 0;if (tidX < x){for (int i = 0; i < y; i++){sum += imageCon[__mul24((i + leftUpY), width) + leftUpY + tidX];}//printf("imageCon[%d]=%d\n", tidX, imageCon[tidX]);colSum[tidX] = sum;}}
//矢量求和,简单求和,不用多cuda core__global__ void vecAdd(int *vec, int n, int *res){//int n = 256;int sum = 0;for (int i = 0; i < n; i++){sum += vec[i];}*res = sum;}
结果如下
使用的blocks=1, threads=256可以看到活跃的warps太少,活跃的blocks也太少,因此调整blocks数量为(4,64), (16,16), (64,4),(256,1),发现(64,4)是效率较高
活跃warps数量增加了,理论活跃blocks也增加了。耗时减少为原来的40%左右。
后分析主机端调用程序需要设置参数,发射指令,也需要耗时,依据参数数量不同耗时也不用,这里分别为3us和6us,而launch时间达到了15us以上,相对于这里cuda kernel函数的执行来说也算是比较影响体验了
从时间轴上看执行要比lauch要晚很多,不知道为什么,这块还有很多不懂,不太会看这些,以后要找专门讲这东西的资料看看。
为减少launch和参数传递延迟,将两个函数合并如下
//按列求和,得到width个结果__global__ void colVecAdd(unsigned char* image, int width, int height, int leftUpX, int leftUpY, int x, int y, int* colSum,int *dev_average){int tidX = threadIdx.x + blockIdx.x * 4;int sum=0;if (tidX < x){for (int i = 0; i < y; i++){ sum+= imageCon[__mul24((i + leftUpY), width) + leftUpY + tidX];}//printf("imageCon[%d]=%d\n", tidX, imageCon[tidX]);colSum[tidX] = sum;}__syncthreads();if (tidX < 1){int sum = 0;for (int i = 0; i < width; i++){sum += colSum[i];}*dev_average = sum;}}
结果变成,launch和传参总耗时减半,cuda kernel运行时间也减少了
运行时间进一步缩短。
后面可以考虑将该程序使用device端调用,尝试减少耗时。
阅读全文
1 0
- 初学cuda程序的一点记录
- CUDA程序优化的记录
- 初学的一点体会
- 初学Python写的小程序,记录记录!
- cuda运行程序记录时间
- [CUDA]初学CUDA遇到的比较烧脑的问题
- 初学VC 的一点建议
- 初学MFC的一点体会
- 初学VHDL的一点心得。。。。
- 初学J2ME的一点经验
- 初学hibernate的一点心得
- 初学c#的一点看法
- 初学Java的一点体会
- 初学MYSQL的一点感性认识
- 初学Oracle的一点心得
- cuda的简单程序
- 重装系统的一点记录
- kvo 的一点记录
- linux mysql创建用户赋权限
- word2vec
- C++ Vector STL find 查找
- layout优化减少textView创建
- java中的HashSet
- 初学cuda程序的一点记录
- hdu 4430 Yukari's Birthday
- SpringMVC中使用Interceptor拦截器
- [置顶] 写给大一大二大三还在迷惘中的学生
- J2EE 笔记(上)
- html采用vue中ajax调用restful api的跨域问题解决
- QML小结1-(一个简单的qml程序)
- Scheme 初步
- USB和串口(COM)的区别,以及相互转换