zoukankan      html  css  js  c++  java
  • 在主机端和设备端进行”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_d
    46     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 configuration
    53     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

    下载链接

     

  • 相关阅读:
    Android学习关于setWidth()和setHeight()没反应的问题
    东芝c600T08B win7改装xp遇到的一些问题总结
    [转]java中long,int,short与byte数组之间的转换
    [转]简述STRUTS2 Convention零配置
    ie6下报错缺少标识符、字符串或数字 问题解决
    Android学习解决Android Graphical Layout 界面效果不显示
    [原创]tomcat6.0+IIS6+jk的配置
    Oracle中NVARCHAR2与VARCHAR2的区别
    优化like查询
    RedHat linux下安装hadoop 0.20.2, 并在windows下远程连接此hadoop,开发调试
  • 原文地址:https://www.cnblogs.com/liangliangdetianxia/p/3979662.html
Copyright © 2011-2022 走看看