首页 > 代码库 > 在主机端和设备端惊醒”incrementArray“并对结果进行比较
在主机端和设备端惊醒”incrementArray“并对结果进行比较
实验思想:
在主机端将数据初始化后传输到设备端,设备端和主机端进行同样的操作对数据加1,然后将设备端的结果传输到主机,最后核对主机端的计算结果和设备端的计算结果是否一直。
1 // incrementArray.cu 2 3 #include <stdio.h> 4 #include <assert.h> 5 #include "cuda.h" 6 #include "cuda_runtime.h" 7 #include "device_launch_parameters.h" 8 9 /*10 主机端函数11 */12 void incrementArrayOnHost(float *a, int N)13 {14 int i;15 for (i = 0; i < N; i++) a[i] = a[i] + 1.f;16 }17 18 /*19 设备端函数(内核函数)20 */21 __global__ void incrementArrayOnDevice(float *a, int N)22 {23 int idx = blockIdx.x*blockDim.x + threadIdx.x;24 if (idx<N) a[idx] = a[idx] + 1.f;25 }26 27 int main(void)28 {29 float *a_h, *b_h; //指向主机的指针30 float *a_d; //指向设备的指针31 32 int i, N = 10;33 size_t size = N*sizeof(float);34 35 //主机端申请内存36 a_h = (float *)malloc(size);37 b_h = (float *)malloc(size);38 39 //设备端申请存储40 cudaMalloc((void **)&a_d, size);41 42 //主机端数据初始化43 for (i = 0; i < N; i++) a_h[i] = (float)i;44 45 //将数据从主机拷贝到设备:a_h-->a_d46 cudaMemcpy(a_d, a_h, sizeof(float)*N, cudaMemcpyHostToDevice);47 48 //在主机端计算49 incrementArrayOnHost(a_h, N);50 51 //在设备端计算52 //块大小为4,Part 1 of 2. Compute execution configuration53 int blockSize = 4;54 //如果N%blockSize取0则需要的块数为N / blockSize,否则再加一块已盛放余下的55 int nBlocks = N / blockSize + (N%blockSize == 0 ? 0 : 1);56 57 //Part 2 of 2. 调用内核函数,nBlocks为所需块数,blockSize为每一块大小58 incrementArrayOnDevice << < nBlocks, blockSize >> > (a_d, N);59 60 //将数据从设备端传输到主机端并存储在b_h中61 cudaMemcpy(b_h, a_d, sizeof(float)*N, cudaMemcpyDeviceToHost);62 63 //核对结果64 for (i = 0; i < N; i++) assert(a_h[i]== b_h[i]);65 66 //释放主机内存和设备端内存67 free(a_h);68 free(b_h);69 cudaFree(a_d);70 }
测试环境:
Win7+VS2013+CUDA6.5
下载链接
在主机端和设备端惊醒”incrementArray“并对结果进行比较
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。