传入两个数组,在GPU中将两个数组对应索引位置相加

#include "cuda_runtime.h"
#include "device_launch_parameters.h" #include <iomanip>
#include <iostream>
#include <stdio.h> using namespace std; //检测GPU
bool CheckCUDA(void){
int count = ;
int i = ; cudaGetDeviceCount(&count);
if (count == ) {
printf("找不到支持CUDA的设备!\n");
return false;
}
cudaDeviceProp prop;
for (i = ; i < count; i++) {
if (cudaGetDeviceProperties(&prop, i) == cudaSuccess) {
if (prop.major >= ) {
break;
}
}
}
if (i == count) {
printf("找不到支持CUDA的设备!\n");
return false;
}
cudaGetDeviceProperties(&prop, );
printf("GPU is: %s\n", prop.name);
cudaSetDevice();
printf("CUDA initialized success.\n");
return true;
}//使用一维数组相加
__global__ void addForOneDim(double *a, double *b, double *c, int N); //初始化一维数组
void InitOneDimArray(double *a, double b, int N); int main(){
//检测GPU
if (!CheckCUDA()){
cout << "No CUDA device.";
return ;
}   //****数组相加************************************************************************************************************************
cout << "****************************************数组相加*********************************************************************" << endl;
int N = ; //定义数组大小
double *h_a_one, *h_b_one, *h_c_one; //声明在CPU上使用的指针
double *d_a_one, *d_b_one, *d_c_one; //声明在GPU上使用的指针
//为数组分配大小
h_a_one = new double[N];
h_b_one = new double[N];
h_c_one = new double[N]; cudaMalloc((void **)&d_a_one, sizeof(double)*N); //在GPU上分配内存空间
cudaMalloc((void **)&d_b_one, sizeof(double)*N);
cudaMalloc((void **)&d_c_one, sizeof(double)*N);
//为数组初始化
InitOneDimArray(h_a_one, 1.1, N);
InitOneDimArray(h_b_one, 2.2, N); //使用GPU中分配的指针指向CPU中的数组
cudaMemcpy(d_a_one, h_a_one, sizeof(double)*N, cudaMemcpyHostToDevice);
cudaMemcpy(d_b_one, h_b_one, sizeof(double)*N, cudaMemcpyHostToDevice); //调用核函数,使用1个线程块N个线程
//addForOneDim<<<1, N>>>(h_a_one, h_b_one, d_c_one, N); //不能使用h_a_one和h_b_one,只能使用GPU上定义的指针,不然结果如图一所示
addForOneDim<<<, N>>>(d_a_one, d_b_one, d_c_one, N); //结果如图二所示
  //调用核函数,使用N个线程块,每个线程块中包含1个线程
  //addForOneDim<<<N, >>>(d_a_one, d_b_one, d_c_one, N); //结果如图三所示
//将GPU上计算好的结果返回到CPU上定义好的变量
cudaMemcpy(h_c_one, d_c_one, sizeof(double)*N, cudaMemcpyDeviceToHost); //打印结果
for (int i = ; i < N; i++){
cout << h_a_one[i] << " + " << h_b_one[i] << " = " << h_c_one[i] << endl;
} cout << endl << endl;
system("pause");
return ;
}
//使用一维数组相加
__global__ void addForOneDim(double *a, double *b, double *c, int N){
int tid = threadIdx.x; //线程索引,启用1个线程块,每个线程块N个线程
if (tid < N){
c[tid] = a[tid] + b[tid];
}
} //初始化一维数组
void InitOneDimArray(double *a, double b, int N){
for (int i = ; i < N; i++){
a[i] = (i+) * b;
//cout << a[i] << endl;
}
}

图一 (该图是错误的)

图二 (该图是正确的)

图三 (该图是错误的)当在调用核函数时,

addForOneDim<<<N, >>>(d_a_one, d_b_one, d_c_one, N);

使用的索引是

int tid = threadIdx.x;      //对应的是一个线程块中每个线程id

正确的索引是

int tid = blockIdx.x;       //对应的是每个线程块id

CUDA学习(三)之使用GPU进行两个数组相加的更多相关文章

  1. PHP两个数组相加

    在PHP中,当两个数组相加时,会把第二个数组的取值添加到第一个数组上,同时覆盖掉下标相同的值: <?php $a = array("a" => "apple& ...

  2. PHP基础--两个数组相加

    在PHP中,当两个数组相加时,会把第二个数组的取值添加到第一个数组上,同时覆盖掉下标相同的值: <?php $a = array("a" => "apple& ...

  3. PHP将两个数组相加

    $arr_a=[1=>1,2=>2,3=>3];$arr_b=[1=>'a',4=>4];print_r($arr_a+$arr_b);返回结果:Array ( [1] ...

  4. OpenCL入门:(二:用GPU计算两个数组和)

    本文编写一个计算两个数组和的程序,用CPU和GPU分别运算,计算运算时间,并且校验最后的运算结果.文中代码偏多,原理建议阅读下面文章,文中介绍了OpenCL相关名词概念. http://opencl. ...

  5. CUDA学习(三)之使用GPU进行两个数相加

    在CPU上定义两个数并赋值,然后使用GPU核函数将两个数相加并返回到CPU,在CPU上显示 #include "cuda_runtime.h" #include "dev ...

  6. cuda学习3-共享内存和同步

    为什么要使用共享内存呢,因为共享内存的访问速度快.这是首先要明确的,下面详细研究. cuda程序中的内存使用分为主机内存(host memory) 和 设备内存(device memory),我们在这 ...

  7. CUDA学习,第一个kernel函数及代码讲解

    前一篇CUDA学习,我们已经完成了编程环境的配置,现在我们继续深入去了解CUDA编程.本博文分为三个部分,第一部分给出一个代码示例,第二部分对代码进行讲解,第三部分根据这个例子介绍如何部署和发起一个k ...

  8. CUDA学习笔记3:CUFFT(CUDA提供了封装好的CUFFT库)的使用例子

    一.FFT介绍 傅里叶变换是数字信号处理领域一个很重要的数学变换,它用来实现将信号从时域到频域的变换,在物理学.数论.组合数学.信号处理.概率.统计.密码学.声学.光学等领域有广泛的应用.离散傅里叶变 ...

  9. CUDA学习之二:shared_memory使用,矩阵相乘

    CUDA中使用shared_memory可以加速运算,在矩阵乘法中是一个体现. 矩阵C = A * B,正常运算时我们运用 C[i,j] = A[i,:] * B[:,j] 可以计算出结果.但是在CP ...

随机推荐

  1. Zeus,一个可以快速使用微服务组件

    去年(上周)一直准备着做一个分布式微服务的组件,可以让使用者用最简单的方式引入,只需要使用简单的注解就能够使用. 用一点一点的空闲时间终于堆出来一个暂时可用的zeus-1.0版本. Zeus,意为宙斯 ...

  2. 洛谷$P$2518 计数 $[HAOI2010]$ 数位$dp$

    正解:数位$dp$ 解题报告: 传送门$w$ 感觉省选的数位$dp$还是比较有质量的辣,,,至少有一定的思维难度是趴$QwQ$ 这题要考虑到一个,我认为比较关键的点,就,对于一个位数不满的数,可以理解 ...

  3. C / C++ 保留小数函数(setprecision(n)的一些用法总结)

    从C语言开始正式学习C++,但是一上来输出位数就懵了,查资料才知道C++需要使用 “ setprecision  ”函数.自己总结一下. 首先说C++代码 #include <iomanip&g ...

  4. 用 Serverless 快速搭建个人相册网站

    日常生活中我们经常会拍摄一些视频.照片等,这些文件会占用比较多的存储空间.本文将介绍一种方法:利用 ThumbsUp 工具,结合 Serverless Framework 的 component 快速 ...

  5. Linux学习_菜鸟教程_2

    Linux 系统目录 /bin:  bin是Binary的缩写,这个目录存放着最经常使用的命令. /boot:  存放启动Linux时的一些核心文件,包括一些连接文件以及镜像文件. /dev : de ...

  6. C++ | C++ 基础知识 | 结构、联合与枚举

    1. 结构 1.0 结构 数组是相同类型元素的集合,相反,struct 是任意类型元素的集合. 代码例子: struct Address { const char* name; int number; ...

  7. Pandas的介绍与基本使用

    1.什么是Pandas 当大家谈论到数据分析时,提及最多的语言就是Python和SQL,而Python之所以适合做数据分析,就是因为他有很多强大的第三方库来协助,pandas就是其中之一,它是基于Nu ...

  8. win10关闭系统更新 (转载)

    一.关闭Windows10系统的自动更新服务 1:使用快捷键Win+R,打开运行 2:输入命令:services.msc,打开系统服务界面 找到Windows Update双击 将启动类型改为[禁用] ...

  9. excel 转换成pdf 总结

    excl 转换成pdf 1.freespire   只能转换前三页 // 使用此组件 只能转换前3页 //需要引用 如下命名空间 //using Spire.Doc; //Document doc = ...

  10. 【转】程序员"青春饭"问题之我见

    1. 问题描述问题1: 什么是程序员?在本文中程序员的定义为: 拥有编程技能,在IT.互联网公司打工的IT从业人员.程序员与很多行业最大的不同是该行业的形成时间短:1954年第一台计算机才诞生,而中医 ...