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

网站设计样式/黑帽seo培训网

网站设计样式,黑帽seo培训网,买房子最好的网站,苏州做网站推广的公司作者:翟天保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.bjxfkj.com.cn/article/136.html

相关文章:

  • 关于成立政府网站建设/app联盟推广平台
  • dw如何做网站界面/东莞网站建设seo
  • 长沙网站排名方法/千锋教育培训多少钱
  • 建站模板建网站/全国最新疫情实时状况地图
  • 网站站长是什么意思/站长之家seo工具
  • 惠州做网站建设/谷歌seo建站
  • 网站克隆下来了然后再怎么做/重庆seo推广公司
  • 遵义网站开发培训/陕西整站关键词自然排名优化
  • 北京工程建设合同备案网站/网络营销服务商有哪些
  • 网站建设项目计划书如何写/太原百度关键词优化
  • 规范机关单位网站建设/常用的网络推广的方法有哪些
  • 游戏网站开发什么意思/凡科建站小程序
  • 多个域名指向同一个网站/西地那非片的功效与作用
  • 江西网站设计哪家靠谱/seo刷关键词排名软件
  • 个人 可以做社交网站/网站优化推广招聘
  • 网站设计作品/标题关键词优化报价
  • 河南科技园网站建设/站长平台网站
  • wordpress邮箱汉化插件下载/搜索引擎优化培训免费咨询
  • 西安网站维护/公众号软文怎么写
  • 东莞长安网站设计公司/腾讯广告联盟
  • 六安网站怎么做seo/软文发布系统
  • Django 个人博客网站开发/网络营销与策划试题及答案
  • 小说网站有源码了该怎么做/网络站点推广的方法有哪些
  • 集安网站建设/真正免费的网站建站平台推荐
  • 南昌网站建设大全/广州网站营销seo费用
  • 国家粮食局和储备局建设网站/徐州seo建站
  • 做外贸需要关注的网站有什么问题/seo赚钱
  • 网站一级域名申请/什么网站可以免费推广
  • 网页设计网站测试/杭州产品推广服务公司
  • 哪里做外贸网站/国内搜索引擎有哪些