GPU编程实战1

news2025/1/11 21:40:46

给一张测试图,对测试图分别cpu和GPU进行处理,进行时间统计,最后做展示。
环境:win10 + cuda11.3 +python3.7 + numba 等
硬件:cpu:i59400 ,gpu:RTX1650 4G

首先进行cuda安装,cuDNN等的安装,参考该博客https://blog.csdn.net/xiao_yun_zi/article/details/124046964?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167774321216800180677939%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=167774321216800180677939&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~pc_rank_34-1-124046964-null-null.142v73pc_new_rank,201v4add_ask,239v2insert_chatgpt&utm_term=%E6%B8%85%E5%8D%8E%E6%BA%90%E9%95%9C%E5%83%8F%E5%AE%89%E8%A3%85cuda11.3&spm=1018.2226.3001.4187

安装成功后,可以看到自己GPU的信息,大小,传输带宽等
在这里插入图片描述
python GPU编程示例如下:

import cv2
import time
import numpy as np
import math
from numba import cuda


@cuda.jit
def process_gpu(img_gpu, channels):
    tx = cuda.blockIdx.x*cuda.blockDim.x + cuda.threadIdx.x
    ty = cuda.blockIdx.y*cuda.blockDim.y + cuda.threadIdx.y
    for c in range(channels):
        color = img_gpu[tx, ty][c]*2 +30
        if color > 255:
            img_gpu[tx, ty][c] = 255
        elif color < 255:
            img_gpu[tx, ty][c] = 0
        else:
            img_gpu[tx, ty][c] = color



def process_cpu(img_cpu, dst_cpu):
    rows, cols, channels = img_cpu.shape
    for j in range(cols):
        for i in range(rows):
            for c in range(channels):
                color = img[i, j][c]*2 + 30
                if color > 255:
                    dst_cpu[i, j][c] = 255
                elif color < 0:
                    dst_cpu[i, j][c] = 0
                else:
                    dst_cpu[i, j][c] = color




if __name__ == '__main__':
    img = cv2.imread("test.jpg")
    cv2.namedWindow("test", 1)
    try:
        cv2.imshow("test", img)
    except:
        print("load failed")

    rows, cols, channels = img.shape
    img_cpu = img.copy()
    dst_cpu = img.copy()
    start_cpu = time.time()

    process_cpu(img_cpu, dst_cpu)
    end_cpu = time.time()
    print("cpu_time:",str(end_cpu-start_cpu))
    cv2.imshow("cpu_photo", dst_cpu)

    ############### gpu process  #########
    img_gpu = cuda.to_device(img)
    threadperblock = (32, 32)
    blockpergrid_x = int(math.ceil(rows/threadperblock[0]))
    blockpergrid_y = int(math.ceil(cols/threadperblock[1]))
    blockpergrid = (blockpergrid_x, blockpergrid_x)
    cuda.syncthreads

    start_gpu = time.time()
    process_gpu[blockpergrid, threadperblock](img_gpu, channels)
    cuda.syncthreads
    end_gpu = time.time()
    print("gpu_time: ", str(end_gpu-start_gpu))

    dst_gpu = img_gpu.copy_to_host()
    cv2.imshow("img_gpu", dst_gpu)
    cv2.waitKey(0)

    cv2.destroyWindow("test")



运行结果展示:
在这里插入图片描述
在这里插入图片描述
通过结果可以看出,cuda编程加速很多,同时发现GPU得到的图片比cpu得到的图片失真很多。暂时,不知道原因,等待继续研究。

编程时遇到编译问题:numba.cuda.cudadrv.error.NvvmError: Failed to compile
在这里插入图片描述
**有校解决办法是用conda 安装numba ,**若用conda 安装遇到如下错误:

Preparing transaction: done
Verifying transaction: failed

RemoveError: 'requests' is a dependency of conda and cannot be removed from
conda's operating environment.


请先将conda 升级。强制升级命令为conda update --force conda

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

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

相关文章

和年薪30W的阿里测开工程师聊过后,才知道我的工作就是打杂的...

前几天和一个朋友聊面试&#xff0c;他说上个月同时拿到了腾讯和阿里的offer&#xff0c;最后选择了阿里。 阿里内部将员工一共分为了14个等级&#xff0c;P6是资深工程师&#xff0c;P7是技术专家。 其中P6和P7就是一个分水岭了&#xff0c;P6是最接近P7的不持股员工&#x…

720°VR全景家装设计,为传统行业注入新生命力

导语&#xff1a;VR全景家装是一种基于虚拟现实技术的新型家居装修方案&#xff0c;可以通过虚拟现实技术让用户更真实地体验家居装修效果&#xff0c;避免了传统装修中的繁琐流程和不可预知的风险。近几年来&#xff0c;VR全景装修盛行&#xff0c;打破传统二维空间模式&#…

【ArcGIS学习记录01】--利用CRU TS数据集绘制降雨量分布图

【ArcGIS学习记录01】–利用CRU TS数据集绘制降雨量分布图 注&#xff1a;仅作为本人的学习记录方便以后复习查阅。 一、介绍 CRU TS 是目前使用最广泛的气候数据集之一&#xff0c;由英国国家大气科学中心 (NCAS) 制作。简而言之我们能在CRU TS官网上获得几乎各个研究领域能…

[Java基础]—JDBC

前言 其实学Mybatis前就该学了&#xff0c;但是寻思目前主流框架都是用mybatis和mybatis-plus就没再去看&#xff0c;结果在代码审计中遇到了很多cms是使用jdbc的因此还是再学一下吧。 第一个JDBC程序 sql文件 INSERT INTO users(id, NAME, PASSWORD, email, birthday) VAL…

LeetCode 2 - 两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 开…

常用基础硬件知识 - 判断MOS管导通

目录1. 概述2. 判断MOS管的导通1. 概述 本文主要记录下基础的硬件知识&#xff0c;方便自己查阅。 2. 判断MOS管的导通 在产品硬件设计中&#xff0c;有时需要程序控制一些电源使能。 1.原理图已经标出了G极(gate)—栅极、S极(source)—源极、D极(drain)—漏极。 如果没有标…

「基础篇」机器学习概览

文章目录1. 什么是机器学习2. 引入机器学习3. 应用场景4. 机器学习分类4.1. 有无人类监督4.2. 是否增量学习4.3. 泛化方式5. 主要挑战6. 测试与验证1. 什么是机器学习 机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;是一个研究领域&#xff0c;让计算机无需…

Mac item2 配置免密登录开发机

1、配置 vi ~/.ssh/config 内容如下&#xff1a; Host * ControlMaster auto ControlPath ~/.ssh/master-%r%h:%p ControlPersist yes ServerAliveInterval 60 学习&#xff1a; ControlMaster #连接共享 ControlPath #与ControlMaster一起使用&#xff0c;指定连接共享的路径…

log4j控制台不打印日志的故障解决方案

前言 接管了别的项目组的一个代码&#xff0c;在IDAE调试程序的过程中&#xff0c;发现log4j日志居然没有打印在控制台上&#xff0c;日志相关代码也没有问题。 在网上搜索了一圈&#xff0c;总结了一下个人解决这个问题的流程。 流程 1. 判断用了什么配置文件 不知道是出…

线程池的使用——线程池的创建方式

线程池的使用——创建线程线程池的创建线程池的创建方式Executors.newFixedThreadPool&#xff1a;Executors.newCachedThreadPool&#xff1a;Executors.newSingleThreadExecutor&#xff1a;Executors.newScheduledThreadPool&#xff1a;Executors.newSingleThreadScheduled…

24- 深度学习的模型保存和加载 (TensorFlow系列) (深度学习)

知识要点 keras 保存成hdf5文件, 1.保存模型和参数, 2.只保存参数 1.保存模型和参数 save_modelcallback ModelCheckpoint2. 只保存参数 save_weightscallback ModelCheckpoint save_weights_only True 保存模型: 案例数据: Fashion-MNIST总共有十个类别的图像model.save_w…

spark graph基础(一)

1 overView 1.1 图的构成 图由节点和边组成&#xff0c;其中VertexRDD[VD] 和EdgeRDD[ED] 继承和优化了 RDD[(VertexId, VD)] 和RDD[Edge[ED]] 。 class Graph[VD, ED] {val vertices: VertexRDD[VD]val edges: EdgeRDD[ED] }1.2 图使用示例 如下图所示&#xff0c;使用spa…

Typro使用以及安装教程来啦

Typora是一款轻便简洁的Markdown编辑器&#xff0c;支持即时渲染技术&#xff0c;这也是与其他Markdown编辑器最显著的区别。即时渲染使得你写Markdown就想是写Word文档一样流畅自如&#xff0c;不像其他编辑器的有编辑栏和显示栏。今天为大家分享下有关Typroa的安装以及使用&a…

TryHackMe-黑我杯

黑我杯 相信我们大家在TryHackMe的日积月累都学到了不少东西&#xff0c;从纯萌新到oscp再到更高 我很高兴能将国内各thm玩家聚集到一起&#xff0c;构建一个更好的学习环境和氛围 本次娱乐分两场&#xff1a; Offensive Pentesting — 中等难度Junior Penetration — 容易难…

@Autowired和@Resource到底有什么区别

Autowired 和 Resource 都是 Spring/Spring Boot 项目中&#xff0c;用来进行依赖注入的注解。它们都提供了将依赖对象注入到当前对象的功能&#xff0c;但二者却有众多不同&#xff0c;并且这也是常见的面试题之一&#xff0c;所以我们今天就来盘它。 Autowired 和 Resource 的…

Linux 确认 NTP 是否同步成功

NTP 即Network Time Protocol&#xff0c;它通过网络同步计算机系统之间的时钟。NTP 客户端会将其时钟与 NTP 服务器同步。NTP同步状态可以通过以下三个命令查询&#xff1a;ntpq&#xff1a;ntpq 是标准的 NTP 查询程序。ntpstat&#xff1a;显示网络时间同步的状态。timedate…

【房间墙上凿个洞,看你在干嘛~】安全攻防内网渗透-绕过防火墙和安全检测,搭建DNS隐蔽隧道

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。所以可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。…

Spark 广播/累加

Spark 广播/累加广播变量普通变量广播分布式数据集广播克制 Shuffle强制广播配置项Join Hintsbroadcast累加器Spark 提供了两类共享变量&#xff1a;广播变量&#xff08;Broadcast variables&#xff09;/累加器&#xff08;Accumulators&#xff09; 广播变量 创建广播变量…

快速上手配置firewalld

firewalld使用firewall-cmd命令配置策略。 查看当前firewalld当前服务运行状态 firewall-cmd --state firewalld防火墙状态还用使用如下命令查看状态 systemctl status firewalld 查看所有打开运行的端口 firewall-cmd --zonepublic --list-ports 查看区域信息情况 firewall…

qml学习之qwidget与qml结合使用并调用信号槽交互

学习qml系列之一说明&#xff1a; 学习qml系列之qwiget和qml信号槽的交互使用&#xff0c;并在qwidget中显示qml界面 在qml中发送信号到qwidget里 在qwidget里发送信号给qml 在qwidget里面调用qml界面方式 方式一&#xff1a;使用QQuickView 这个是Qt5.0中提供的一个类&…