CUDA学习笔记04:向量之和

参考资料

CUDA编程模型系列二(向量操作)_哔哩哔哩_bilibili (非常好的学习资料!)

vs2019

随意新建一个空项目,按照之前的环境配置配好项目依赖:

CUDA学习笔记02:测试程序hello world-CSDN博客

代码结构如下:

代码片段,demo_gpu.cu:

#include <cuda_runtime.h>
#include <device_launch_parameters.h>
#include <stdio.h>
#include <math.h>__global__ void vecAdd(const double* x, const double* y, double* z, int count)
{const int index = blockDim.x * blockIdx.x + threadIdx.x;// t00 t01 t02 t10 t11 t12 t20 t21 t22if (index < count){z[index] = x[index] + y[index];}
}void vecAdd_cpu(const double* x, const double* y, double* z, int count)
{for (int i = 0; i < count; ++i){z[i] = x[i] + y[i];}
}void test()
{const int N = 1000;const int M = sizeof(double) * N;//cpu mem allocdouble* h_x = (double*)malloc(M);double* h_y = (double*)malloc(M);double* h_z = (double*)malloc(M);double* result_cpu = (double*)malloc(M);for (int i = 0; i < N; ++i){h_x[i] = 1;h_y[i] = 2;}double* d_x, * d_y, * d_z;cudaMalloc((void**)&d_x, M);cudaMalloc((void**)&d_y, M);cudaMalloc((void**)&d_z, M);cudaMemcpy(d_x, h_x, M, cudaMemcpyHostToDevice);cudaMemcpy(d_y, h_y, M, cudaMemcpyHostToDevice);const int block_size = 128;const int grid_size = (N + block_size - 1) / block_size;vecAdd << <grid_size, block_size >> > (d_x, d_y, d_z, N);cudaMemcpy(h_z, d_z, M, cudaMemcpyDeviceToHost);vecAdd_cpu(h_x, h_y, result_cpu, N);bool error = false;for (int i = 0; i < N; ++i){if (fabs(result_cpu[i] - h_z[i]) > (1.0e-10)){error = true;}}printf("Result: %s\n", error ? "Errors" : "Pass");free(h_x);free(h_y);free(h_z);free(result_cpu);cudaFree(d_x);cudaFree(d_y);cudaFree(d_z);
}

主函数:

#include <iostream>void test();int main()
{test();std::cout << "Finished! \n";
}

运行结果:

ok,结果通过。

Linux(CMake)

如果是使用CMake配置环境就更简单了,CMakeLists.txt这样写即可:

cmake_minimum_required(VERSION 3.10)project(vector_add LANGUAGES CXX CUDA)add_definitions(-std=c++11)
option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CUDA_STANDARD 11)
set(CMAKE_BUILD_TYPE Debug)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build)
set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -O0 -Wfatal-errors -pthread -w -g")find_package(CUDA REQUIRED)cuda_add_executable(vector_add add.cu)

代码结构:

add.cu和前边的代码没有区别:

#include <stdio.h>
#include <math.h>__global__ void vecAdd(const double *x, const double *y, double *z, int count)
{const int index = blockDim.x * blockIdx.x + threadIdx.x;// t00 t01 t02 t10 t11 t12 t20 t21 t22if( index < count){z[index] = x[index] + y[index];}
}void vecAdd_cpu(const double *x, const double *y, double *z, int count)
{for(int i = 0; i<count; ++i){z[i] = x[i] + y[i];}
}int main()
{const int N = 1000;const int M = sizeof(double) * N;//cpu mem allocdouble *h_x = (double*) malloc(M);double *h_y = (double*) malloc(M);double *h_z = (double*) malloc(M);double *result_cpu = (double*) malloc(M);for( int i = 0; i<N; ++i){h_x[i] = 1;h_y[i] = 2;}double *d_x, *d_y, *d_z;cudaMalloc((void**) &d_x, M );cudaMalloc((void**) &d_y, M );cudaMalloc((void**) &d_z, M );cudaMemcpy(d_x ,h_x ,M , cudaMemcpyHostToDevice);cudaMemcpy(d_y ,h_y ,M , cudaMemcpyHostToDevice);const int block_size = 128;const int grid_size  = (N + block_size -1)/block_size;vecAdd<<<grid_size, block_size>>>(d_x, d_y, d_z, N);cudaMemcpy( h_z, d_z, M, cudaMemcpyDeviceToHost);vecAdd_cpu(h_x, h_y, result_cpu, N);bool error = false;for(int i=0; i<N; ++i){if(fabs(result_cpu[i] - h_z[i]) > (1.0e-10)){error = true;}}printf("Result: %s\n", error?"Errors" : "Pass");free(h_x);free(h_y);free(h_z);free(result_cpu);cudaFree(d_x);cudaFree(d_y);cudaFree(d_z);}

当前目录下建立build路径并且进入,用cmake构建:

cmake ..

构建好后编译:

最后查看编译结果,并运行:

OK,结果通过!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《 前端挑战与未来:如何看待“前端已死”》

在技术领域&#xff0c;时常会有一些激进的言论引发热议&#xff0c;比如近年来不少人声称“前端已死”。这样的言论引发了广泛的讨论和反思。本文将从几个方向探讨这个话题&#xff1a;为什么会出现“前端已死”的言论、如何看待这种说法、前端技术的未来发展趋势以及前端人如…

MS8911S/8921S/8922M/8931S——4ns 延时、轨到轨高速比较器

产品简述 MS8911S/MS8921S/MS8922M/MS8931S 是一款具 有内部迟滞的高速比较器。其电源电压范围为 3.0V- 5.5V &#xff0c;输入和输出范围均可做到轨到轨。其输出为推 挽结构&#xff0c;兼容 CMOS/TTL 逻辑电平标准。传输延时为 4ns &#xff0c;且失调电压低。单一比…

在虚拟机vm下的Linux系统下 安装redis 超详细

打开Linux后 右键打开终端 1.输入:su root 登录root 密码是123456 2.然后输入:yum -y install gcc-c 安装gcc基础依赖包 3.yum -y install centos-release-scl 4.yum -y install devtoolset-9-gcc devtoolset-9-gcc-c devtoolset-9-binutils //为了编译最新版本的Redis源码 用…

二维码门楼牌管理系统应用场景:城市规划与土地管理的新利器

文章目录 前言一、城市规划部门的新助手二、门牌数据的深度应用三、支持可持续城市发展四、与城市规划部门的联动 前言 随着科技的不断进步&#xff0c;二维码技术已经深入到我们生活的方方面面。在城市规划与土地管理领域&#xff0c;二维码门楼牌管理系统正成为一项革命性的…

【Selenium】UI自动化|元素定位常见问题

1、报错NoSuchElementException——定位不到元素 分析的可能原因&#xff1a; 页面还没有加载出来&#xff0c;就对页面上的元素进行的操作 元素在iframe中&#xff0c;先要理解下frame的实质&#xff0c;frame中实际上是嵌入了另一个页面&#xff0c;而webdriver每次只能在一…

Linux中给复杂命令起别名

目录 1 前言 2 操作步骤 2.1 打开.bashrc 2.2 编辑.bashrc-添加别名 2.3 使别名生效 1 前言 在linux中有些指令会比较长&#xff0c;为了便捷的使用它们&#xff0c;我们就可以采取起别名的方式&#xff0c;具体操作如下。 2 操作步骤 2.1 打开.bashrc 输入如下指令&a…

前端WebRTC局域网1V1视频通话

基本概念 WebRTC&#xff08;Web Real-Time Communications&#xff09; 网络实时通讯&#xff0c;它允许网络应用或者站点&#xff0c;在不借助中间媒介的情况下&#xff0c;建立点对点&#xff08;Peer-to-Peer&#xff09;的连接&#xff0c;实现视频流和音频流或者其他任…

如何在2.2.1版Aduino IDE中开发ESP32

ESP32芯片集成了WIFI和蓝牙&#xff0c;而且关于生态也很不错&#xff0c;越来越多的学习者和开发者选择此类芯片&#xff0c;而不像用keil开发STM32或者51一样&#xff0c;ESP32虽然也有官方的ESP32-IDF开发软甲&#xff0c;但是经过我个人的实操体验&#xff0c;不适合小白或…

【数据结构与算法】二叉树解题20240306

这里写目录标题 一、104. 二叉树的最大深度二、100. 相同的树三、226. 翻转二叉树四、101. 对称二叉树 一、104. 二叉树的最大深度 简单 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 1、确定递归…

基于R语言和iris数据集实现随机森林模型及测试应用

基于R语言和iris数据集实现随机森林模型及测试应用 测试应用R代码 #加载随机森林模型库 > library("randomForest") #加载iris数据集 > data(iris) > head(iris)# 设置训练数据和标签 t_data <- iris[, -5] t_labels <- iris[, 5] # 训练随机森…

机器学习-面经(part6、集成学习)

10 集成学习 定义:通过结合多个学习器(例如同种算法但是参数不同,或者不同算法),一般会获得比任意单个学习器都要好的性能,尤其是在这些学习器都是"弱学习器"的时候提升效果会很明显。 10.1 Boosting(提升法) 可以用于回归和分类 问题,它每一…

Jenkins的安装和helloworld Pipeline

文章目录 环境安装下载安装启动初始化 PipelineUISCM&#xff08;Source Control Management&#xff09;准备pipeline 参考 环境 RHEL 9.3Jenkins 2.44.0.1 安装 参考 https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos 。 下载安装 [ding192 ~]$ sudo …

Elasticsearch搜索引擎

目录 初识elasticsearch 了解ES 什么是elasticsearch elasticsearch的发展 搜索引擎技术排名&#xff1a; 总结 倒排索引 正向索引和倒排索引 正向索引 倒排索引 总结 es的一些概念 文档 索引 概念对比 架构 总结 安装es&#xff0c;kibana 安装es 安装kiba…

中医舌苔笔记

舌诊时按照舌尖-舌中-舌根-舌侧的顺序进行观察。 先看舌体再看舌苔&#xff0c;30秒左右。 如果一次望舌判断不清&#xff0c;可令病人休息3~5分钟后&#xff0c;重新观察一次 舌诊脏腑部位分属图 舌体 胖嫩而边有齿痕为气虚、阳虚。 薄白而润为风寒&#xff1b; 薄白而燥…

顶顶通呼叫中心中间件-机器人话术如何实现在放音期间不接收按键信息

文章目录 前言联系我们实现方法 前言 场景&#xff1a;进入机器人话术时&#xff0c;在话术放音期间不接收用户的按键信息&#xff0c;等话术放音完成后才允许接收用户的按钮信息&#xff0c;然后根据用户的按钮信息执行相应的机器人话术流程。 联系我们 有意向了解呼叫中心中…

图解 TCP 拥塞控制

文章目录 什么是拥塞控制拥塞控制算法慢启动拥塞避免快速恢复 TCP拥塞控制状态机 什么是拥塞控制 拥塞控制是一种 确保网络中的数据包以可持续的速率传输 的机制&#xff0c;避免因为数据包太多而超过网络当前的承载能力&#xff0c;导致网络性能下降&#xff0c;甚至产生大量…

(四)关系模型之关系代数

4.1关系代数概述 基于集合&#xff0c;提供了一系列的关系代数操作&#xff1a;并、差、笛卡尔积(广义积)、 选择、投影和更名等基本操作以及交、 连接和关系除等扩展操作&#xff0c;是一种集合思维的操作语言。关系代数操作以一个或多个关系为输入&#xff0c;结果是一个新的…

单片机为什么需要时钟?2种时钟电路对比?

目录 一、晶体振荡器&#xff08;Crystal Oscillator&#xff09;的核心知识 二、单片机为什么需要时钟电路&#xff1f; 三、单片机的时钟电路方案 01、外部晶振方案 02、内部晶振方案 四、总结 单片机研发设计的项目中&#xff0c;它的最小电路系统包含 电源电路复位…

电源PCB设计:确保稳定高效的电源供应

作为电子设备的心脏&#xff0c;电源的设计与布局布线质量&#xff0c;将直接关系到整个系统的稳定性和效率&#xff0c;那么电子工程师该如何惊喜打造电源PCB&#xff0c;确保电源供应的稳定、高效安全&#xff1f; 1、电源PCB设计的核心要素①板层与铜厚选择&#xff1a;根据…

算法46:动态规划专练(力扣198: 打家劫舍 力扣740:删除并获取点数)

打家劫舍问题&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定…