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实现卷积运算相关推荐

  1. 机器学习入门(15)— 全连接层与卷积层的区别、卷积神经网络结构、卷积运算、填充、卷积步幅、三维数据卷积、多维卷积核运算以及批处理

    卷积神经网络(Convolutional Neural Network,CNN)CNN 被用于图像识别.语音识别等各种场合,在图像识别的比赛中,基于深度学习的方法几乎都以 CNN 为基础. 1. 全连 ...

  2. tensorflow中转置卷积运算例子

    import tensorflow as tf import numpy as np import tensorflow as keras from tensorflow.keras import l ...

  3. 【数字信号处理】线性时不变系统 LTI “ 输入 “ 与 “ 输出 “ 之间的关系 ( 周期性分析 | 卷积运算规律 | 交换律 | 结合律 | 分配率 | 冲击不变性 )

    文章目录 一.LTI 系统 " 输入 " 与 " 输出 " 周期性分析 二.卷积运算规律 1.交换律 2.结合律 3.分配律 4.冲击不变性 一.LTI 系统 ...

  4. OpenCV图像处理使用笔记(七)——卷积运算原理

    前言 1.在图像处理中,特别在深度学习图像处理,最常看到图像卷积操作,那什么是卷积呢,卷积就是两个原函数产生一个新的函数,两个函数之间的这种操作就称着卷积,在图像这里的图像卷积也用输入的图像矩阵与一个 ...

  5. CUDA: GPU高性能运算

    CUDA: GPU高性能运算 2013-10-11 22:23 5650人阅读 评论(0) 收藏 举报 分类: CUDA(106) 目录(?)[+] 0 序言 CUDA是异构编程的一个大头,洋洋洒洒的 ...

  6. CNN的卷积运算为何使用互相关而不是卷积

    CNN的卷积运算并非数学定义的卷积 也就是说,CNN中的运算是不需要翻转卷积核的. 也就是说,CNN在处理图像时的卷积核是不需要翻转180°的 我们来用代码看下为什么? #-*- coding:utf ...

  7. odoo pivot中去掉求和_一文读懂深度学习中的卷积运算与图像处理

    华为人工智能认证讲师 袁梦 在人工智能深度学习技术中,有一个很重要的概念就是卷积神经网络 CNN(Convolutional Neural Networks).卷积神经网络被广泛地运用到计算机视觉中, ...

  8. 【OpenCV 例程200篇】52. 图像的相关与卷积运算

    [OpenCV 例程200篇]52. 图像的相关与卷积运算 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 滤波通常是 ...

  9. python二维图颜色函数_Python scipy的二维图像卷积运算与图像模糊处理操作示例

    本文实例讲述了Python scipy的二维图像卷积运算与图像模糊处理操作.分享给大家供大家参考,具体如下: 二维图像卷积运算 一 代码 import numpy as np from scipy i ...

最新文章

  1. 不应该在ToString()方法中修改引用类型
  2. module 'tensorflow' has no attribute 'Session'
  3. 科大星云诗社动态20210504
  4. Heap(堆结构/优先队列)-Swift实现
  5. docker依赖的Linux内核特性及各命令参数说明
  6. mysql+instr查询,mysql中使用instr进行模糊查询方法介绍
  7. Windows server 2012远程桌面会话主机和远程桌面授权,server2012
  8. Linux设置时间和硬件时间
  9. Gridview中Dataformatstring的使用
  10. DSP28335学习记录(五)——eCAP、eQEP
  11. SPADE(GauGAN)代码运行方法
  12. kubeadm部署kubernetes
  13. 正则系列4: re.sub用法
  14. Linux文件系统管理——创建与检测
  15. 巨儒艮、漂泊信天翁……这位90后中科院动物所研究员用日历讲述“物种故事”...
  16. 吴式太极拳老架(原乐志先生授)(2008.04.09修改)
  17. 一文看懂三极管的截止、饱和
  18. Cisco3750做端口镜像
  19. 充电桩用linux系统吗,基于嵌入式Linux的电动汽车交流充电桩的设计
  20. iOS开发,自动续期订阅的坑

热门文章

  1. sUploadDir
  2. shell——命令排序
  3. Auto Layout和UILabel
  4. 【python】global详解
  5. python工程师必备工具
  6. Weight the Tree CodeForces - 1646D
  7. i5-12400和i5-12400F有什么区别 i512400和12400f哪个好
  8. FBW7通过端粒脱帽介导肺纤维化和衰老
  9. 【数据结构】Java实现栈
  10. python123app_Python实现iOS APP 自动化打包