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.hqwc.cn/news/513817.html

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

相关文章

leetcode 3.5

普通数组 1.最大子数组和 最大子数组和 前缀和pre 动态规划 pre保留的是当前包含了当前遍历的最大的前缀和&#xff0c;如果之前的pre 对结果有增益效果&#xff0c;则 pre 保留并加上当前遍历, 如果pre 对结果无增益效果&#xff0c;需要舍弃&#xff0c;则 pre 直接更新为…

【BUG】Windows状态栏总卡死解决办法

屋漏偏逢连夜雨&#xff0c;正在赶deadline呢&#xff0c;Windows状态老卡死&#xff0c;一时间崩溃。 解决办法&#xff1a; 右键状态栏新闻和咨询关掉 这个烧笔新闻与资讯我真服了

MATLAB报错:尝试将 SCRIPT imread 作为函数执行

报错&#xff1a; 在执行matlab脚本的时候出现报错。 >> imread 尝试将 SCRIPT imread 作为函数执行: S:\temp_file\matlab\DigitalImageProcessing\imread.m出错 imread (line 2) I imread(S:\temp_file\matlab\DigitalImageProcessing\blueman.png);分析以及解决方…

splay学习笔记重制版

以前写的学习笔记&#xff1a;传送门 但是之前写的比较杂乱&#xff0c;这里重制一下 问题背景 假设我们要维护一个数据结构&#xff0c;支持插入、删除、查询某个值的排名&#xff0c;查询第 k k k大的值等操作。 最直接的想法是用二叉搜索树&#xff0c;也就是左子树权值&l…

小迪安全32WEB 攻防-通用漏洞文件上传二次渲染.htaccess变异免杀

#知识点&#xff1a; 1、文件上传-二次渲染 2、文件上传-简单免杀变异 3、文件上传-.htaccess 妙用 4、文件上传-PHP 语言特性 #详细点&#xff1a; 1、检测层面&#xff1a;前端&#xff0c;后端等 2、检测内容&#xff1a;文件头&#xff0c;完整性&#xff0c…

安装完NGINX 已经正常启动,用IP访问显示的是Welcome to CentOS?

下头Nginx 以前配置服务器难道配置完nginx默认访问80端口进入不应该是欢迎来到nginx吗&#xff0c;nono变了 nginx变了 现在默认访问就是Welcome to CentOS 你的配置没有问题 只要你能访问 就行 直接改成你的项目地址就ok了

【自然语言处理】NLP入门(四):1、正则表达式与Python中的实现(4):字符串常用函数

文章目录 一、前言二、正则表达式与Python中的实现1.字符串构造2. 字符串截取3. 字符串格式化输出4.字符转义符ASCII编码5. 字符串常用函数a. 字符串长度&#xff1a;len()b. max() 和 min()c. Unicode码转换&#xff1a;ord()和chr()d. 进制转换函数函数与方法之比较 一、前言…

CSS定位,React面试题总结

CSS简介 CSS是层叠样式表&#xff08;Cascading Style Sheets&#xff09;的简称。 作用&#xff1a; 用于HTML文档中元素的样式定义实现内容&#xff08;html元素&#xff09;与表现&#xff08;css样式&#xff09;的分离实现代码的可重用性和可维护性 CSS主要部分&#…

音视频开发之旅——音频基础概念、交叉编译原理和实践(LAME的交叉编译)(Android)

本文主要讲解的是音频基础概念、交叉编译原理和实践&#xff08;LAME的交叉编译&#xff09;&#xff0c;是基于Android平台&#xff0c;示例代码如下所示&#xff1a; AndroidAudioDemo 音频基础概念 在进行音频开发的之前&#xff0c;了解声学的基础还是很有必要的。 声音…

HCIA-Datacom题库(自己整理分类的)_38_IPv6多选【20道题】

1.IPV6地址包含以下哪些类型&#xff1f; 任播地址 组播地址 单播地址 广播地址 2.IPv6有以下哪几种地址&#xff1f; 任播地址 链路本地地址 组播地址 单播地址 广播地址 3.下面关于IPv6描述正确的是&#xff1f; IPv6的地址长度为128bits IPv6的地址长度为64bit…

SAP Business Intelligence(BO)-Overview

BI 启动板 BI 平台包括BI 启动板。BI 启动板是一款Web 应用程序&#xff0c;相当于外界了解公司业务信息的窗口。在BI 启动板中&#xff0c;可访问Crystal 报表、Web Intelligence 文档和其他对象&#xff0c;并按照您的需求组织这些对象。 WebI Web Intelligence的缩写。We…

42岁前TVB女星近况曝光,曾因山头靠不住被雪藏兼生意失败

自从2021年前TVB高层余咏珊倒台离巢后&#xff0c;大批「余派」被雪藏&#xff0c;随即跟着走人&#xff0c;今年42岁的「元老级是非精」梁嘉琪就是其中之一。 梁嘉琪在离巢后就重新签约有线做回老本行主持节目&#xff0c;去年3月又与森美、小仪主持商台903节目《早霸王》&…