opencl:提高kernel有效并发约束(Effective concurrency constraint)的一点心得

下面是一个简单的kernel函数,从integ_count_mat矩阵中用vload8函数取出A1,A2,A3,A4四个向量执行A4+A1-A2-A3,结果存入density_mat,代码中只用到了一个向量类型的变量sum

__kernel void object_density_filter(
          matrix_info_cl im_info
        , const __global  ushort *integ_count_mat
        , matrix_info_cl om_info
        , __global ushort8* density_mat
        ,int  face_dist_size
        ,ushort sum_threshold
         ){
    ushort8 sum;
    int start_y=(int)get_global_id(1),x_v=get_global_id(0);
    density_mat+= start_y * om_info.row_stride>>3;
    int index_a1=start_y*im_info.row_stride;                    //A1
    int index_a2=index_a1+face_dist_size;                       //A2
    int index_a3=(start_y+face_dist_size)*im_info.row_stride;   //A3
    int index_a4=index_a3+face_dist_size;                       //A4

    // compute faces sum in each window which size speciialed win_size : A4+A1-A2-A3
    sum=( vload8(x_v,integ_count_mat +index_a4) + vload8(x_v,integ_count_mat+index_a1)
        - vload8(x_v,integ_count_mat +index_a2) - vload8(x_v,integ_count_mat+index_a3) );
    // fake object filter by density_const_param.sum_threshold
    density_mat[x_v]=sum>=sum_threshold?sum:(ushort8)(0);
}

但是使用CodeXL进行静态代码分析显示,这个kernel居然用到41个VGPRS(向量寄存器)!因此导致有效并发约束(Effective concurrency constraint(Max waves per SIMD))只能为5,怎么修改代码都无法提高。

我代码中明明只有一个向量类型的变量啊,这多出来的40个VGPRS用到哪里了?排除自己代码中使用向量寄存器的可能后,我怀疑到了vload8这个函数,vload8是opencl built-in函数,怎么实现的我们是不知道的。极有可能是它用了大量VGPRS,于我尝试把这行代码

sum=( vload8(x_v,integ_count_mat +index_a4) + vload8(x_v,integ_count_mat+index_a1)
    - vload8(x_v,integ_count_mat +index_a2) - vload8(x_v,integ_count_mat+index_a3) );

改为

sum-= sum,//将sum赋值为0,使用sum=0这种方式初始化,一样会增加VGPRS的使用数量
sum+= vload8(x_v,integ_count_mat +index_a4),
sum+= vload8(x_v,integ_count_mat +index_a1),
sum-= vload8(x_v,integ_count_mat +index_a2),
sum-= vload8(x_v,integ_count_mat +index_a3);    

上面的公式等价于A4+A1-A2-A3,只是利用,号运算符强制让4个vload8函数串行执行,这样就防止了编译器对A4+A1-A2-A3这个公式进行并行优化。

于是立即就有了效果,

使用的VGPRS降到了6个。并发限制提高到了满格10.

总结:

在表达式中使用built-in函数时,要注意表达式的书写方式,过长的表达式,要拆分开,尽可能用,操作符进行改造,以防止编译器进行并行做优化,因为一表达式的built-in函数并行执行,所使用的寄存器数量就会成倍上升。

时间: 2024-10-15 04:21:47

opencl:提高kernel有效并发约束(Effective concurrency constraint)的一点心得的相关文章

修改Linux内核参数提高Nginx服务器并发性能

当linux下Nginx达到并发数很高,TCP TIME_WAIT套接字数量经常达到两.三万,这样服务器很容易被拖死.事实上,我们可以简单的通过修改Linux内核参数,可以减少Nginx服务器 的TIME_WAIT套接字数量,进而提高Nginx服务器并发性能.   vi /etc/sysctl.conf   增加以下几行: net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1200 net.ipv4.tcp_syncookie

提高Django高并发性的部署方案(Python)

方案: nginx + uWSGI 提高 Django的并发性        1. uWSGI :                 uWSGI是一个web服务器,实现了WSGI协议.uwsgi协议.http协议等. uWSGI的主要特点是: 超快的性能              低内存占用              多app管理              详尽的日志功能(可以用来分析app的性能和瓶颈)              高度可定制(内存大小限制,服务一定次数后重启等)         

并发与并行(concurrency vs parallesim)

最近对计算机中并发(concurrency)和并行(parallesim)这两个词的区别很迷惑,将搜索到的相关内容整理如下. http://www.vaikan.com/docs/Concurrency-is-not-Parallelism/#slide-7 定义: 并发 Concurrency 将相互独立的执行过程综合到一起的编程技术. 并行 Parallelism 同时执行(通常是相关的)计算任务的编程技术. 并发 vs. 并行 并发是指同时处理很多事情. 而并行是指同时能完成很多事情. 两

提高tomcat的并发能力

1.Apache + Tomcat 结合起来用Apache负责静态页面,Tomcat负责动态页面,同时减少connectionTimeout的时间,以应对并发量大线程回收来不及的情况. 2.压力过大的问题,可以做负载均衡,一个TOMCAT无论如何也不可能担当如此多的线程负载,而且JVM过大,其内存管理成本将显著加大.2G的内存,做3-4个TOMCAT实例(512RAM*4),更为科学合理. 3.数据库连接池,不少人,都推荐使用C3P0,能提高访问数据库的并发性能好几倍. 4.采用Tomcat集群

读写分离提高 SQL Server 并发性

转自:http://www.canway.net/Lists/CanwayOriginalArticels/DispForm.aspx?ID=476 在一些大型的网站或者应用中,单台的SQL Server 服务器可能难以支撑非常大的访问压力.很多人在这时候,第一个想到的就是一个解决性能问题的利器——负载均衡.遗憾的是,SQL Server 的所有版本,包括2012年3月发布的SQL Server 2012,也未提供该功能. 扩展单台SQL Server 服务器,解决性能瓶颈,有两种方法: 一.分

怎样利用代码与习惯提高网站的并发访问性能以及自己的一些疑惑

最近公司因为网站并发问题.要将.net 改版成PHP.虽然我表示不服,但是人轻言微╮(╯▽╰)╭.一言难尽. 网站的并发性能低.跟语言有毛毛球关系?! 特地去百度了一下,关于如何提高网站并发性能的问题.加上一些自己的见解,这里抛砖引玉.大家随意看看.轻拍. 请先看度娘上搞到的大牛回答: 1.HTML静态化 其实大家都知道,效率最高.消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是 最有效的方法.但是对于大量内容并且频繁更新的网站

提高SPDK高并发的关键--spdk 中的qpair

NVME 协议中的qpaire command queue completion queue queue paire SPDK中的qpaire的限制 example/nvme/nvme/hello_world.c中的qpair example/nvme/nvme/perf/perf.c中的qpair 基于qpair提高并发性 原文地址:https://blog.51cto.com/xiamachao/2371755

php商城网站如何提高性能和并发访问

大型商城网站性能提高策略 大型商城网站,比如在面对大量用户的访问.高并发请求方面,一般的商城解决方案主要在这样几个方面:使用高性能的服务器.高性能的数据库.高效率的编程语言.还有高性能的Web容器.但是这几个解决思路意味着更大的投入.那还有什么办法去更小投入的优化这方面的性能吗?在开发DSmall商城系统的时候,我们利用了一下几点: 1.HTML静态化 大家都知道,执行效率最高.消耗最小的其实就是纯静态化的html页面,所以尽可能使网站上的页面采用静态页面去实现. 2.图片服务器分离 图片是最消

性能测试:通过设置注册表提高 P2P/IIS 并发数

写在前面 在执行性能测试(如用 JMeter 直接压接口)的时候,有的时候并发数上不去.本机大面积出现 TCP 状态为 TIME_WAIT,除了放开 TCP 端口数和调整默认 TCP 释放时间外,另外几个注册表项同样重要且需要调整. 以下设置项针对的是本机和远端机. 设置完成后,重启下电脑使生效. 增加TCP 连接数:TcpNumConnections [HKLM\System\CurrentControlSet\Services\Tcpip\Parameters] TcpNumConnecti