Cuda编程 之 块(block)计算
来源:互联网 发布:天庭淘宝城宋小刀txt 编辑:程序博客网 时间:2024/05/16 14:44
#include <stdio.h>#include <stdlib.h>#include <cuda.h>#include <time.h>#define N 512__global__ void vec_block_add(int *a, int *b, int *c){ c[blockIdx.x] = a[blockIdx.x] + b[blockIdx.x];}void rand_ints(int *arr, int count){ srand(time(NULL)); for(int i=0; i<count; i++) { arr[i] = rand()%100; }}int main(){ int *a, *b, *c; int *d_a, *d_b, *d_c; int size = N*sizeof(int); clock_t start, finish; cudaMalloc((void**)&d_a, size); cudaMalloc((void**)&d_b, size); cudaMalloc((void**)&d_c, size); a=(int*)malloc(size); rand_ints(a, N); b=(int*)malloc(size); rand_ints(b, N); c=(int*)malloc(size); rand_ints(c, N); cudaMemcpy(d_a, a, size, cudaMemcpyHostToDevice); cudaMemcpy(d_b, b, size, cudaMemcpyHostToDevice); start = clock(); vec_block_add<<<100, 1>>>(d_a, d_b, d_c); finish = clock(); double time = (finish - start)/(double)CLOCKS_PER_SEC; cudaMemcpy(c, d_c, size, cudaMemcpyDeviceToHost); for(int i=0; i<N; i++) { printf("%-5d: a:%-5d b:%-5d c:%-5d\n",i,a[i],b[i],c[i]); } printf("%lf\n",time); cudaFree(d_a); cudaFree(d_b); cudaFree(d_c); free(a); free(b); free(c); return 0;}
程序说明
程序有两个关键部分:
c[blockIdx.x] = a[blockIdx.x] + b[blockIdx.x];
vec_block_add<<<100, 1>>>(d_a, d_b, d_c);
add<<<N,1>>>
N表示同时调用N次add函数,这是实现并行的向量相加的语句。每个被并行调用的add函数称之为一个块(block)。
块的集合称之为网格(grid).每个块可以使用索引值blockIdx.x
函数并行执行的过程,相当于由GPU这个加速器使用硬件的方式进行了循环展开,而blockIdx.x就是用来定位当前执行的是循环的哪个部分。通过使用blockIdx.x作为索引,每个块可以处理数组元素中的一部分。从硬件的角度看,相当于同时有多个块在并行执行:
块0: c[0]=a[0]+b[0]
块1: c[1]=a[1]+b[1]
块2: c[2]=a[2]+b[2]
块3: c[3]=a[3]+b[3]
….
程序中通过时间函数比较了并行计算的块数目不同时的计算时间。
本文参考自hipercome博文,向作者致谢!
0 0
- Cuda编程 之 块(block)计算
- cuda编程之thread,block and grid
- CUDA 编程 之并行计算思想
- 【并行计算-CUDA开发】CUDA编程——GPU架构,由sp,sm,thread,block,grid,warp说起
- IOS Block(块)编程初步
- 【转载】IOS block块编程
- 并行计算之CUDA
- CUDA之计算模式
- 【CUDA并行编程之五】计算向量的欧式距离
- 【CUDA并行编程之五】计算向量的欧式距离
- OC之Block块语法
- CUDA软件架构—网格(Grid)、线程块(Block)和线程(Thread)的组织关系以及线程索引的计算公式
- cuda编程之atomicAdd
- cuda编程之 __syncthreads()
- cuda之thread,block,gird详解
- iOS块语法详解(block编程)
- iOS块语法详解(block编程)
- iOS块语法详解(block编程)
- swift学习之路(十)字典
- Android开发--常用的传感器总结
- 安卓volley框架基本使用
- shell-使用getopts指定变量取值
- c++重载总结
- Cuda编程 之 块(block)计算
- AOP TableView
- IOS开发 applicationDidBecomeActive 应用程序挂起、复原与终止
- leetcode 342. Power of Four
- Android Studio遇到的那些坑及爬坑方法
- 【课设】模拟实现动态内存分配—首次适应算法
- JVM调优系列(二)——JVM内存分配解析
- C primer plus 第十章 练习10:
- 浏览器兼容element.dataset