一个使用share memory进行性能优化的实例
来源:互联网 发布:网络与新媒体考研科目 编辑:程序博客网 时间:2024/05/16 01:23
下面是这段代码是我的一个算法中用来求和以及求平方和的kernel函数:
__global__ static void CompSumAndSquare(int rate,int I_n,int size,int width,int wsize,int *image,float *sum,float *sumOfSquare)
{
int x,y,p,i,j,ix,k;
const int pos = threadIdx.x+blockIdx.x*blockDim.x;
const int max_dimension=blockDim.x*gridDim.x;
k=wsize/2;
for(i=0;i<rate;i++)
{
p=pos+i*max_dimension;
if(p<size){
x=p%I_n+wsize/2;
y=p/I_n;
ix=y*width+x;
sum[ix]=0;
sumOfSquare[ix]=0;
for(j=-k;j<=k;j++)
{
sum[ix]+=(float)image[ix+j];
sumOfSquare[ix]+=pow((float)image[ix+j],2);
}
}
}
}
这个函数的运行时间约为12ms,其中窗口大小为15,测试平台为nGeforce 9800GT,由于这个函数占据了我整个算法时间的一半以上。所以本人在无聊之余将累加和平方和运算屏蔽一个,看单独运算的时间,结果这个函数运行的时间为3ms多一点。于是我觉得这个函数的性能瓶颈应该是global memory访问的方式而非计算指令的吞吐量,然后做了下面一点改动。
改动部分:
for(j=-k;j<=k;j++)
{
sum[ix]+=(float)image[ix+j];
// sumOfSquare[ix]+=pow((float)image[ix+j],2);
}
for(j=-k;j<=k;j++)
{
// sum[ix]+=(float)image[ix+j];
sumOfSquare[ix]+=pow((float)image[ix+j],2);
}
这个版本函数运行的时间结果约为7ms,相比较第一版本有些提高,但还是很慢。随后想到了share memory作为中间运算的载体,使用后的代码如下,改动之后的函数时间约为1.65ms,还不错哈!改动的代码如下:
__global__ static void CompSumAndSquare(int rate,int I_n,int size,int width,int wsize,int *image,float *sum,float *sumOfSquare) { int x,y,p,i,j,ix,k,t; const int pos = threadIdx.x+blockIdx.x*blockDim.x; const int tid = threadIdx.x; const int max_dimension=blockDim.x*gridDim.x; k=wsize/2; extern __shared__ float s_m[]; float *s_q=(float*)&s_m[wsize*THREADNO_VAR]; int N; for(i=0;i<rate;i++) { p=pos+i*max_dimension; if(p<size){ x=p%I_n+k; y=p/I_n; ix=y*width+x; N=tid*wsize; s_m[N]=0; for(j=-k,t=0;j<=k;j++,t++) { s_m[N+t]=(float)image[ix+j]; } s_q[N]=pow(s_m[N],2); for(j=1;j<wsize;j++) { s_m[N]+=s_m[N+j]; s_q[N]+=pow(s_m[N+j],2); } sum[ix]=s_m[N]; sumOfSquare[ix]=s_q[N]; } } }
- 一个使用share memory进行性能优化的实例
- 一个关于使用OIT表进行查询优化的实例
- 使用ARM DS-5与Dstream StreamLine进行Android底层性能分析的一个实例
- Share Disk、Share Memory和Share Nothing的区别
- 【CUDA笔记1】share memory优化
- OpenCL性能优化实例研究系列2:避免Local Memory Bank Conflicts的两个简单方法
- 使用instrument进行性能优化
- share memory
- 使用valgrind进行后台服务器的性能优化
- 使用valgrind进行后台服务器的性能优化
- [Share]使用 appium1.0 与 Java 进行自动化的例子
- IPC--共享内存 Share Memory 实例(shmget shmat shmdt shmctl)
- 使用SQL Server 2008进行优化性能
- 使用APC对PHP进行性能优化
- 使用Hierarchy Viewer进行UI性能优化
- 使用临时表进行性能优化
- 对oracle实例的内存(SGA和PGA)进行调整,优化数据库性能
- oracle实例的内存(SGA和PGA)进行调整,优化数据库性能
- WPF 数据绑定[9]
- 驾校考试秘笈
- 防止被骗!笔记本新本测评软件大集合
- 使用JavaScript 对Cookie 操作的封装
- java常见的两种Singleton模式
- 一个使用share memory进行性能优化的实例
- 新年快乐
- 将visual studio 2008生成的可执行工程打包成安装软件
- JS首页上滚动的数据
- 解决mysql中文乱码的问题
- C#正则表达式整理以备后用
- 三国鼎立(INTEL/NVIDIA/AMD)
- 房子我有了你还是个处女么
- get访问器和set访问器