首页 > 其他分享 >cuda的简单加法例子

cuda的简单加法例子

时间:2024-03-20 22:44:23浏览次数:19  
标签:显存 int void float length 例子 cuda 加法 include

CMakeLists.txt的写法

CMakeLists.txt

cmake_minimum_required(VERSION 3.9)#Cmake最低版本
#project(demo LANGUAGES CXX CUDA) #这个写法也是可以的
project(demo)
enable_language(CUDA)#激活CUDA语言支持,使用第一个写法时要进行注释
#设置语言标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CUDA_STANDARD 11)   

#添加项目自身的库和依赖
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)#设置编译后的程序存放位置
aux_source_directory(src SRC_LIST)#添加src目录下的所有源文件
include_directories(include)#添加头文件路径

#添加OpenCV库(这个库比较常用,所以写个注释在这里)
#find_package(OpenCV 4 REQUIRED)
#include_directories(${OpenCV_INCLUDE_DIRS})
#message(STATUS "include:${OpenCV_INCLUDE_DIRS}")
#link_libraries(${OpenCV_LIBS})

#编译列表
add_executable(${PROJECT_NAME} ${SRC_LIST})

  

foo.cuh

该文件存放数组的相关

 

#ifndef FOO_CUH
#define FOO_CUH

#include <stdio.h>
//非模板函数才可以进行C连接
extern "C" float *matAdd(float *a,float *b,int length);

#endif

  

得到相应的输出
执行CUDA程序的步骤如下:
1.开辟显存空间
2.数据从内存拷贝到显存
3.执行核函数
4.数据从显存拷贝到内存
5.释放显存

相关详细内容如下

foo.cu

#include "foo.cuh"
//添加cuda库
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
//定义核函数 __global__为声明关键字
template<typename T>
__global__ void matAdd_cuda(T *a,T *b,T *sum)
{
	//blockIdx代表block的索引,blockDim代表block的大小,threadIdx代表thread线程的索引,因此对于一维的block和thread索引的计算方式如下
    int i = blockIdx.x*blockDim.x+ threadIdx.x;
    sum[i] = a[i] + b[i];
}
//核函数用模板不会报错,模板名字是具有链接的,但它们不能具有C链接,因此不能用在供调用的函数上
float *matAdd(float *a,float *b,int length)
{
    int device = 0;//设置使用第0块GPU进行运算
    cudaSetDevice(device);//设置运算显卡
    cudaDeviceProp devProp;
    cudaGetDeviceProperties(&devProp, device);//获取对应设备属性
    int threadMaxSize = devProp.maxThreadsPerBlock;//每个线程块的最大线程数
    int blockSize = (length+threadMaxSize-1)/threadMaxSize;//计算Block大小,block一维度是最大的,一般不会溢出
    dim3 thread(threadMaxSize);//设置thread
    dim3 block(blockSize);//设置block
    int size = length * sizeof(float);//计算空间大小
    float *sum =(float *)malloc(size) ;//开辟动态内存空间
    //开辟显存空间
    float *sumGPU,*aGPU,*bGPU;
    cudaMalloc((void**)&sumGPU,size);
    cudaMalloc((void**)&aGPU,size);
    cudaMalloc((void**)&bGPU,size);
    //内存->显存
    cudaMemcpy((void*)aGPU,(void*)a,size,cudaMemcpyHostToDevice);
    cudaMemcpy((void*)bGPU,(void*)b,size,cudaMemcpyHostToDevice);
    //运算
    matAdd_cuda<float><<<block,thread>>>(aGPU,bGPU,sumGPU);
    //cudaThreadSynchronize();
    //显存->内存
    cudaMemcpy(sum,sumGPU,size,cudaMemcpyDeviceToHost);
    //释放显存
    cudaFree(sumGPU);
    cudaFree(aGPU);
    cudaFree(bGPU);
    return sum;

}

  

main.cpp

用来测试程序

#include <stdio.h>
#include <iostream>
#include "foo.cuh"
//#include "opencv2/opencv.hpp"
int main()
{

    //cv::Mat image = cv::imread("./images/P0000.png");
    //unsigned char *array = image.data;
    //创建数组
    const int length = 10;
    float a[length],b[length];
    float *c = (float *)malloc(length *sizeof(float));
    for(int i=0;i<length;i++)
    {
        a[i] = 1;
        b[i] = 2;
    }
    //矩阵加法运算
    c = matAdd(a,b,length);
    //输出查看是否完成计算
    for(int i=0;i<length;i++)
    {
        std::cout<<a[i]<<" "<<b[i]<<" "<<c[i]<<std::endl;
    }
    return 0;
}

  

 

标签:显存,int,void,float,length,例子,cuda,加法,include
From: https://www.cnblogs.com/xiaochouk/p/18086297

相关文章

  • python之自定义表头、列表内容导出excel文件例子
    函数三个参数outputfile:导出excel文件的位置,没有的话在该位置建该文件title:表头args:列的内容,每列是一个列表importxlsxwriterdefwriteExcel(outputfile,title,*args):wb=xlsxwriter.Workbook(outputfile)#创建sheetsheet=wb.add_worksheet("Sh......
  • 安装CUDA
    1.下载CUDA根据cmd的命令,看你的CUDA版本,找到匹配的安装CUDAToolkitArchive|NVIDIADeveloper点击进入点击exe文件安装即可精简安装会安装CUDA相关组件,同时也会将显卡驱动重新安装,如果不想重新安装显卡驱动,可以选择自定义安装,我选择自定义安装,如下图:安装完毕......
  • cuda规约运算
    归:递归约:减小对于一个矩阵做求和运算若串行求和的话需要o(n)的复杂度但若向下图这样,俩俩并行相加,只需要o(logn)的复杂度__global__voidreduceNeighbored(int*g_idata,int*g_odata,unsignedintn)//g_idata是待求和数组,g_odata存放的是每个线程块求和的结果{ un......
  • cuda从入门到精通(六)共享内存和循环分块实现CUDA矩阵乘
    本文系转载,出处:https://mp.weixin.qq.com/s/1w1WFPoUEvVECsurqmvJDw在CUDA编程中,共享内存和循环分块(looptiling)是两种常见的优化策略,它们可以帮助我们提高矩阵乘法的性能。共享内存(SharedMemory):在GPU中,每个线程块(block)都有自己的共享内存。与全局内存相比,共享内存的访问......
  • add魔术方法对象重写加法运算符
    对象重载add魔术方法#__add__魔术方法(与之相关的__radd__反向加法)''' 触发时机:使用对象进行运算相加的时候自动触发 功能:对象运算 参数:二个对象参数 返回值:运算后的值''''''类似的还有如下等等(了解): __sub__(self,other)定义减法的行为:- __mul__(......
  • 【WPF】MVVM极其简单的例子
    目的:通过例子了解、理解MVVM的基本结构。ModelnamespaceWpfStudy.Model{publicclassUserModel{publicstringName{get;set;}}}ViewModelnamespaceWpfStudy.ViewModel{publicclassMainVM:NotifyPropBase{publicM......
  • cuda 加速矩阵乘法
    对于一个m*n的矩阵a和一个n*k的矩阵b因为最后得到一个m*k的矩阵c,那么我们可以分配m*k个线程。在线程(i,j)里矩阵a的第i行和矩阵b的第j列进行点积运算得到c[i][j]#include<iostream>#include"cuda_runtime.h"#include"device_launch_parameters.h"#defineBLOCK_......
  • 数据结构算法系列----高精度加法(大数相加)、处理前导零
    目录一、为什么要使用高精度加法二、处理前导零1、为什么要处理前导零2、处理前导零的代码三、处理大数相加四、完整代码即例题一、为什么要使用高精度加法  当处理远大于longlong数据范围的数时,通常会将这些大数表示为字符串,然后通过字符串的方式进行加减乘除......
  • 通过构造函数实现属性赋值(含有具体例子)
    一、什么是构造函数?new关键字实际上是在调用一个方法,这个方法叫构造方法(构造器)调用构造器的时候,如果你的类中没有写构造器,那么系统会默认给你分配一个构造器,只是我们看不到罢了。可以自己显式的将构造器编写出来:构造器的格式:[修饰符]构造器的名字(){}构造器和方法的......
  • 【论文阅读】Natural Adversarial Examples 自然对抗的例子
    文章目录一、文章概览(一)摘要(二)导论(三)相关工作二、IMAGENET-A和IMAGENET-O(一)数据集构造方式(二)数据收集过程三、模型的故障模式四、实验(一)评估指标(二)使用数据增强(三)使用更多更真实的标记数据(四)架构变化策略一、文章概览(一)摘要文章的主要工作:使用简单的对抗性过......