当前位置: 首页 > news >正文

唐山网站建设唐山google chrome

唐山网站建设唐山,google chrome,全国特种作业证查询官网,网络培训系统建设作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 实现原理 atomicMax和 atomicMin是 CUDA 中的原子操作,用于在并行计算中安全地更新共享变量的最大值和最小值。它们确…

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

实现原理

       atomicMax和 atomicMin是 CUDA 中的原子操作,用于在并行计算中安全地更新共享变量的最大值和最小值。它们确保在多线程环境中,多个线程对同一个变量的访问不会导致数据竞争。使用 atomicMax可以在一个线程中比较当前值与新值,并在新值更大时更新,而 atomicMin则是用于比较和更新最小值。这些操作对于需要从多个线程中汇总结果的应用至关重要,能够确保最终结果的准确性。

       本文将通过一个实战案例,进行atomic求最值的展示。

       (注意本文案例基于OpenCV实现,因为我工作围绕各类图像展开,这样方便些,但是对CUDA而言,核心部分与OpenCV无关,可根据自身场景和数据结构进行更改。)

C++测试代码

ImageProcessing.cuh

#pragma once
#include <cuda_runtime.h>
#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
#include <device_launch_parameters.h>using namespace cv;
using namespace std;#define TILE_WIDTH 16// 预准备过程
void warmupCUDA();// 图像最值计算-CPU
void calcMaxMin_CPU(cv::Mat input, uchar &maxV, uchar &minV);// 图像最值计算-GPU
void calcMaxMin_GPU(cv::Mat input, uchar &maxV, uchar &minV);

ImageProcessing.cu

#include "ImageProcessing.cuh"// 预准备过程
void warmupCUDA()
{float* dummy_data;cudaMalloc((void**)&dummy_data, sizeof(float));cudaFree(dummy_data);
}// 图像最值计算-CPU
void calcMaxMin_CPU(cv::Mat input, uchar &maxV, uchar &minV)
{int row = input.rows;int col = input.cols;// 初始化最值maxV = 0;minV = 255;for (int i = 0; i < row; ++i){for (int j = 0; j < col; ++j){if (input.at<uchar>(i, j) > maxV){maxV = input.at<uchar>(i, j);}if (input.at<uchar>(i, j) < minV){minV = input.at<uchar>(i, j);}}}
}// 获取最大最小值核函数
__global__ void getMaxMinValue_CUDA(uchar* inputImage, int width, int height, int *maxV, int *minV)
{int row = blockIdx.y * blockDim.y + threadIdx.y;int col = blockIdx.x * blockDim.x + threadIdx.x;if (row < height && col < width){atomicMax(maxV, int(inputImage[row * width + col]));atomicMin(minV, int(inputImage[row * width + col]));}
}// 图像最值计算-GPU
void calcMaxMin_GPU(cv::Mat input, uchar &maxV, uchar &minV)
{int row = input.rows;int col = input.cols;// 定义计时器float spendtime = 0.0f;cudaEvent_t start, end;cudaEventCreate(&start);cudaEventCreate(&end);// 分配GPU内存	uchar* d_inputImage;cudaMalloc(&d_inputImage, row * col * sizeof(uchar));// 将输入图像数据从主机内存复制到GPU内存cudaMemcpy(d_inputImage, input.data, row * col * sizeof(uchar), cudaMemcpyHostToDevice);// 计算块和线程的大小dim3 blockSize(TILE_WIDTH, TILE_WIDTH);dim3 gridSize((col + blockSize.x - 1) / blockSize.x, (row + blockSize.y - 1) / blockSize.y);// 求最值int h_maxValue = 0;int h_minValue = 255;int *d_maxValue;int *d_minValue;cudaMalloc((void**)&d_maxValue, sizeof(int));cudaMalloc((void**)&d_minValue, sizeof(int));cudaMemcpy(d_maxValue, &h_maxValue, sizeof(int), cudaMemcpyHostToDevice);cudaMemcpy(d_minValue, &h_minValue, sizeof(int), cudaMemcpyHostToDevice);getMaxMinValue_CUDA << <gridSize, blockSize >> > (d_inputImage, col, row, d_maxValue, d_minValue);cudaMemcpy(&h_maxValue, d_maxValue, sizeof(int), cudaMemcpyDeviceToHost);cudaMemcpy(&h_minValue, d_minValue, sizeof(int), cudaMemcpyDeviceToHost);maxV = uchar(h_maxValue);minV = uchar(h_minValue);
}

main.cpp

#include "ImageProcessing.cuh"void main()
{// 预准备warmupCUDA();cout << "calcMaxMin test begin." << endl;// 加载cv::Mat src = imread("test pic/test5.jpg", 0);// 调整数据区间cv::Mat src2;cv::normalize(src, src2, 20, 230, NORM_MINMAX);// CPU版本clock_t s1, e1;s1 = clock();uchar maxV1, minV1;calcMaxMin_CPU(src2, maxV1, minV1);e1 = clock();cout << "CPU time:" << double(e1 - s1) << "ms" << endl;cout << "maxV1:" << int(maxV1) << endl;cout << "minV1:" << int(minV1) << endl;// GPU版本clock_t s2, e2;s2 = clock();uchar maxV2, minV2;calcMaxMin_GPU(src2, maxV2, minV2);e2 = clock();cout << "GPU time:" << double(e2 - s2) << "ms" << endl;cout << "maxV2:" << int(maxV2) << endl;cout << "minV2:" << int(minV2) << endl;cout << "calcMaxMin test end." << endl;}

测试效果 

       在本文案例中,我通过归一化函数将图像的最值设为20和230,所以验证功能是否正确,只需要判断下函数执行完输出的最值是不是20和230即可。速度方面,CUDA也是很快的,我原以为这种简单计算CPU会更有优势。

       该功能相对简单,但也很常用。后续我会写一篇关于归一化的CUDA文章,归一化中很重要的一部分就是确认最值。

       如果函数有什么可以改进完善的地方,非常欢迎大家指出,一同进步何乐而不为呢~

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

http://www.dinnco.com/news/80766.html

相关文章:

  • 盐城网站建设公司网店seo排名优化
  • 怎么用自己电脑做网站服务器搜索引擎seo推广
  • 怎样在网站做视频链接百度客服电话人工服务
  • 网站开发思维导图搜索引擎排名规则
  • 网站备案名称盘多多网盘资源库
  • 苏州建站模板展示网络推广外包一年多少钱
  • 住房和城乡建设部的叉车证能用吗广州seo代理
  • 美橙西安网站备案拍照谷歌商店下载不了软件
  • 网站开发前期调研百度一下首页极简版
  • 做网站的html代码格式网上推广渠道有哪些
  • 博野网站建设百度识图以图搜图
  • 江门论坛建站模板哪些平台可以发布软文
  • 郑州网站建设设计公司百度如何搜索关键词
  • 建设雅马哈摩托车官方网站网站建设的系统流程图
  • 设计师招聘网站创建网址快捷方式
  • 虚拟网站仿制教程网络推广方法有几种
  • 支付宝网站开发文档合肥网站优化搜索
  • iis6 网站无法访问广东深圳龙华区
  • 湘潭网站建设 尖端磐石网络seo类目链接优化
  • 蓟门桥网站建设武汉seo计费管理
  • 比特币做空网站品牌广告语经典100条
  • 移动互联网开发技术学什么广州谷歌seo公司
  • 网站克隆下来了然后再怎么做互联网营销师国家职业技能标准
  • 做垃圾桶的网站推广的软件有哪些
  • 科普网站建设方案什么是sem推广
  • asp本地网站无法打开推广任务接单平台
  • 怎么删除织梦做的网站产品推广策划方案
  • 网站建设银行转账口碑营销案例及分析
  • 制作网站首先做的工作上海营销公司
  • 网站表格怎么做大学生网页设计作业