- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于CUDA的图像亮度直方图统计
1、先计算原始图像每个像素的亮度:u = (unsigned char)(0.299f * r + 0.587f * g + 0.114f * b)。
2、用一个256大小的数组统计每个亮度的点的数量。
C++实现方法:
memset(out,?0, sizeof(out));unsigned?long?offset;unsigned?long?p;unsigned char r, g, b, u;offset?=?0;for(y?=?0; y??h; y?++)????for(x?=?0; x??w; x?++)????{????????p?=?((unsigned?long?*)in)[offset?++];????????b?=?p??0xff;????????g?=?(p??8)??0xff;????????r?=?(p??16)??0xff;????????//?计算亮度,结果0~255????????u?=?(unsigned char)(0.299f?*?r?+?0.587f?*?g?+?0.114f?*?b);????????//?统计????????out[u]?++;????}
对1280×1024大小的图像,在QX6600(2.4GHz)上单线程运行时间为17.5ms。
CUDA实现的方法比较复杂。因为如果每个线程处理一个像素然后累加到统计数组中的话,多个线程同时累加一个地址会造成数据错误,需要用原子操作进行排队,大量的线程排队操作会造成计算单元空闲,无法发挥大部分的计算性能。因此从GPU内部架构考虑,最好的方法是分两步。第一步把整个图像分成很多个部分,每个部分用一个线程块(含很多个线程)独立统计,统计结果放在线程块共有的shared memory中(同样需要用原子操作,但是shared memory在GPU内部,速度很快,而且每个SM有独立的shared memory,因此这样操作并行度很高,能使计算单元满载运行);第二步则把各个部分独立统计的结果再累加起来得到总的统计结果。代码比较复杂:
#define THREAD_N????128#define LOOP_N????????64__global__ void histKernel(unsigned char?*in, unsigned?long?*out){????__shared__ unsigned?long?smem[256];????//?shared memory????const?unsigned?long?tid?=?threadIdx.x;????const?unsigned?long?bid?=?blockIdx.x;????unsigned?long?offset?=?__umul24((__umul24(bid, THREAD_N)?+?tid), LOOP_N);????//(bid?*?THREAD_N?+?tid)?*?LOOP_N????int?i;????unsigned char r, g, b, u;????unsigned?long?p;????smem[tid]?=?smem[tid?+?128]?=?0;????__syncthreads();????//?每个线程块有THREAD_N(128)个线程,每个线程处理LOOP_N(64)个点,统计结果存储在每个线程块的smem[256]中????for(i?=?0; i??LOOP_N; i?++)????{????????p?=?*(unsigned?long?*)in[offset??2];????????b?=?p??0xff;????????g?=?(p??8)??0xff;????????r?=?(p??16)??0xff;????????offset?++;????????//?计算亮度(0~255)????????u?=?(unsigned char)(0.299f?*?r?+?0.587f?*?g?+?0.114f?*?b);????????//?用原子操作统计,防止线程同时进行“读-修改-写”操作时造成冲突????????atomicAdd((int?*)smem[u],?1);????}????__syncthreads();????//?线程块统计计算完成后,汇总各线程块的统计结果????//?把结果从smem[256]累加到global memory中????//?128字交替访存,以满足各线程的合并访问要求以及防止shared memory的bank conflict,提高效
您可能关注的文档
最近下载
- 某县关于巩固拓展脱贫攻坚成果同乡村振兴有效衔接工作的表态发言.docx VIP
- 体格检查【呼吸内科】--PPT课件.ppt VIP
- 3.2 营造清朗空间 课件 统编版道德与法治 八年级上册.pptx VIP
- 活动课 家国情怀与统一多民族的演进 课件-高一上学期统编版(2019)必修中外历史纲要上.pptx VIP
- 2024高考英语天津卷历年作文范文衡水体临摹字帖(描红无参考线).pdf VIP
- 水工建筑物止水带技术规范DLT52152023年.docx
- Tableau数据可视化基础.pptx VIP
- 2025年职业技能邮件快件安检员参考题库含答案解析(5套试卷).docx VIP
- 地面数字电视接收技术考核试卷.docx VIP
- 呼吸科病史采集.pptx VIP
文档评论(0)