cuda实现卷积运算
1. 使用cuda kernel函数实现
2.基于cudnn库实现
#include "cuda_runtime.h"
#include <cudnn.h>
#include <cuda.h>
#include <device_functions.h>#include <opencv2/opencv.hpp>
#include <iostream>using namespace std;
using namespave cv;float3 data_kernel[] = {make_float3(-1.0f, -1.0f, -1.0f), make_float3(0.0f, 0.0f, 0.0f), make_float3(-1.0f, -1.0f, -1.0f), make_float3(-1.0f, -1.0f, -1.0f), make_float3(0.0f, 0.0f, 0.0f), make_float3(-1.0f, -1.0f, -1.0f), make_float3(-1.0f, -1.0f, -1.0f), make_float3(0.0f, 0.0f, 0.0f), make_float3(-1.0f, -1.0f, -1.0f), make_float3(-1.0f, -1.0f, -1.0f), make_float3(0.0f, 0.0f, 0.0f), make_float3(-1.0f, -1.0f, -1.0f), make_float3(-1.0f, -1.0f, -1.0f), make_float3(0.0f, 0.0f, 0.0f), make_float3(-1.0f, -1.0f, -1.0f), make_float3(-1.0f, -1.0f, -1.0f), make_float3(0.0f, 0.0f, 0.0f), make_float3(-1.0f, -1.0f, -1.0f), make_float3(-1.0f, -1.0f, -1.0f), make_float3(0.0f, 0.0f, 0.0f), make_float3(-1.0f, -1.0f, -1.0f), make_float3(-1.0f, -1.0f, -1.0f), make_float3(0.0f, 0.0f, 0.0f), make_float3(-1.0f, -1.0f, -1.0f), make_float3(-1.0f, -1.0f, -1.0f), make_float3(0.0f, 0.0f, 0.0f), make_float3(-1.0f, -1.0f, -1.0f)
};int main()
{Mat img = imread("1.jpg");int imgWidth = img.cols;int imgHeight = img.rows;int imgChannel = img.channels();Mat dst_gpu(imgHeight, imgWidth, CV_8UC3, Scalar(0, 0, 0));size_t num = imgWidth * imgHeight * imgChannel * sizeof(unsigned char);// 1. 在gpu上分配空间unsigned char* in_gpu;unsigned char* out_gpu;float* filter_data;cudaMalloc((void**)&in_gpu, num);cudaMalloc((void**)&out_gpu, num);cudaMalloc((void**)&filter_data, 3 * 3 * 3 * sizeof(float3));// 2. 初始化句柄cudnnHandle_t handle;cudnnCreate(&handle);// 3. 描述Tensor// input tensor descriptorcudnnTensorDescriptor_t input_descriptor;cudnnCreateTensorDescriptor(&input_descriptor);cudnnSetTensor4dDescriptor(input_descriptor, CUDNN_TENSOR_NHWC, CUDNN_DATA_FLOAT, 1, 3, imgHeight, imgWidth);// output tensor descriptorcudnnTensorDescriptor_t output_descriptor;cudnnCreateTensorDescriptor(&output_descriptor);cudnnSetTensor4dDescriptor(output_descriptor, CUDNN_TENSOR_NHWC, CUDNN_DATA_FLOAT, 1, 3, imgHeight, imgWidth);// kernel tensor descriptorcudnnTensorDescriptor_t kernel_descriptor;cudnnCreateTensorDescriptor(&kernel_descriptor);cudnnSetTensor4dDescriptor(kernel_descriptor, CUDNN_TENSOR_NHWC, CUDNN_DATA_FLOAT, 3, 3, 3, 3);// 4. 描述操作并设置(卷积)相关操作cudnnConvolutionDescriptor_t conv_descriptor;cudnnCreateConvolutionDescriptor(&conv_descriptor);cudnnSetConvolution2dDescriptor(conv_descriptor, 1, 1, 1, 1, 1, 1, CUDNN_CROSS_CORRELATION, CUDNN_DATA_FLOAT);// 5. 描述算法cudnnConvolutionFwdAlgoPerf_t algo;cudnnGetConvolutionForwardAlgorithm_v7(handle, input_descriptor, kernel_descriptor, conv_descriptor, output_descriptor, 1, 0, &algo);// 6. 申请工作空间size_t workspace_size = 0;cudnnGetConvolutionForwordWorkspaceSize(handle, input_descriptor, kernel_descriptor, conv_descriptor, output_descriptor, algo.algo, &workspace_size);void* workspcae = nullptr;cudaMalloc(&workspcae, workspcae_size);// 7. 将计算需要的数据传输到GPUcudaMemcpy((void*)filter_data, (void*)data_kernel, 3 * 3 * 3 * sizeof(float3), cudaMemcpyHostToDevice);cudaMemcpy(in_gpu, img.data, num, cudaMemcpyHostToDevice);// 8. 开始计算auto alpha = 1.0f, beta = 0.0f;cudnnConvolutionForward(handle, &alpha, input_descriptor, in_gpu, kernel_descriptor, filter_data,conv_descriptor, algo.algo, workspcae, workspcae_size, &beta, output_descriptor, out_gpu);// 9. 将计算结果传回CPU内存cudaMemcpy(dst_gpu.data, out_gpu, num, cudaMemcpyDeviceToHost);// 10. 释放资源cudaFree(in_gpu);cudaFree(filter_data);cudaFree(out_gpu);cudaFree(workspcae);cudnnDestoryTensorDescriptor(input_descriptor);cudnnDestoryTensorDescriptor(kernel_descriptor);cudnnDestoryTensorDescriptor(output_descriptor);cudnnDestoryConvolutionDescriptor(conv_descriptor);cudnnDestory(handle);imshow("cudnn_conv_sample", dst_gpu);waitKey(0);return 0;
}
cuda实现卷积运算相关推荐
- 机器学习入门(15)— 全连接层与卷积层的区别、卷积神经网络结构、卷积运算、填充、卷积步幅、三维数据卷积、多维卷积核运算以及批处理
卷积神经网络(Convolutional Neural Network,CNN)CNN 被用于图像识别.语音识别等各种场合,在图像识别的比赛中,基于深度学习的方法几乎都以 CNN 为基础. 1. 全连 ...
- tensorflow中转置卷积运算例子
import tensorflow as tf import numpy as np import tensorflow as keras from tensorflow.keras import l ...
- 【数字信号处理】线性时不变系统 LTI “ 输入 “ 与 “ 输出 “ 之间的关系 ( 周期性分析 | 卷积运算规律 | 交换律 | 结合律 | 分配率 | 冲击不变性 )
文章目录 一.LTI 系统 " 输入 " 与 " 输出 " 周期性分析 二.卷积运算规律 1.交换律 2.结合律 3.分配律 4.冲击不变性 一.LTI 系统 ...
- OpenCV图像处理使用笔记(七)——卷积运算原理
前言 1.在图像处理中,特别在深度学习图像处理,最常看到图像卷积操作,那什么是卷积呢,卷积就是两个原函数产生一个新的函数,两个函数之间的这种操作就称着卷积,在图像这里的图像卷积也用输入的图像矩阵与一个 ...
- CUDA: GPU高性能运算
CUDA: GPU高性能运算 2013-10-11 22:23 5650人阅读 评论(0) 收藏 举报 分类: CUDA(106) 目录(?)[+] 0 序言 CUDA是异构编程的一个大头,洋洋洒洒的 ...
- CNN的卷积运算为何使用互相关而不是卷积
CNN的卷积运算并非数学定义的卷积 也就是说,CNN中的运算是不需要翻转卷积核的. 也就是说,CNN在处理图像时的卷积核是不需要翻转180°的 我们来用代码看下为什么? #-*- coding:utf ...
- odoo pivot中去掉求和_一文读懂深度学习中的卷积运算与图像处理
华为人工智能认证讲师 袁梦 在人工智能深度学习技术中,有一个很重要的概念就是卷积神经网络 CNN(Convolutional Neural Networks).卷积神经网络被广泛地运用到计算机视觉中, ...
- 【OpenCV 例程200篇】52. 图像的相关与卷积运算
[OpenCV 例程200篇]52. 图像的相关与卷积运算 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 滤波通常是 ...
- python二维图颜色函数_Python scipy的二维图像卷积运算与图像模糊处理操作示例
本文实例讲述了Python scipy的二维图像卷积运算与图像模糊处理操作.分享给大家供大家参考,具体如下: 二维图像卷积运算 一 代码 import numpy as np from scipy i ...
最新文章
- 不应该在ToString()方法中修改引用类型
- module 'tensorflow' has no attribute 'Session'
- 科大星云诗社动态20210504
- Heap(堆结构/优先队列)-Swift实现
- docker依赖的Linux内核特性及各命令参数说明
- mysql+instr查询,mysql中使用instr进行模糊查询方法介绍
- Windows server 2012远程桌面会话主机和远程桌面授权,server2012
- Linux设置时间和硬件时间
- Gridview中Dataformatstring的使用
- DSP28335学习记录(五)——eCAP、eQEP
- SPADE(GauGAN)代码运行方法
- kubeadm部署kubernetes
- 正则系列4: re.sub用法
- Linux文件系统管理——创建与检测
- 巨儒艮、漂泊信天翁……这位90后中科院动物所研究员用日历讲述“物种故事”...
- 吴式太极拳老架(原乐志先生授)(2008.04.09修改)
- 一文看懂三极管的截止、饱和
- Cisco3750做端口镜像
- 充电桩用linux系统吗,基于嵌入式Linux的电动汽车交流充电桩的设计
- iOS开发,自动续期订阅的坑