求大牛帮看shared memory的优化问题

jiazhe0909 2014-08-13 04:52:13
求大牛帮看下面这个函数的性能在哪里出了问题,感觉好慢,这个代码实现了从一个矩阵到另一个矩阵的赋值,并加入转置。
template <typename Dtype>
__global__ void aaal(const int n, const Dtype* data_im, const int channels,
const int height, const int width, const int ksize, const int pad,
const int stride, const int height_col, const int width_col,
Dtype* data_col, const int c_num, const int h_num, const int w_num, const int ksmks_num) {

for(int i = blockIdx.x; i < n; i += gridDim.x){

// blocks: (c_blockidx, h_blockidx, w_blockidx, ksmks_blockidx)
int ksmks_blockidx = i%ksmks_num; //ksmks is ksize * ksize
int blockid = __fdividef(i,ksmks_num);
int w_blockidx = blockid%w_num;
blockid = __fdividef(blockid,w_num);
int h_blockidx = blockid%h_num;
int c_blockidx = __fdividef(blockid,h_num);

// threads: (c_threadidx, h_threadidx, w_threadidx, ksmks_threadidx)
int ksmks_threadidx = threadIdx.x%ksmks_dim;
int ksw = (ksmks_blockidx*ksmks_dim+ksmks_threadidx)%ksize;
int ksh = __fdividef(ksmks_blockidx*ksmks_dim+ksmks_threadidx,ksize);
int threadid = __fdividef(threadIdx.x,ksmks_dim);
int w_threadidx = threadid%w_dim;
threadid = __fdividef(threadid,w_dim);
int h_threadidx = threadid%h_dim;
int c_threadidx = __fdividef(threadid,h_dim);

int channel_in = c_blockidx*c_dim+c_threadidx;
int w_out = w_blockidx*w_dim+w_threadidx;
int h_out = h_blockidx*h_dim+h_threadidx;
int h_in = h_out * stride - pad;
int w_in = w_out * stride - pad;

// shared memory
__shared__ Dtype tempmatrix[w_dim*h_dim*c_dim*ksmks_dim];

//
// read data from global memory
//
bool flag = (channel_in<channels && h_in<height && w_in<width && ksmks_blockidx*ksmks_num+ksmks_threadidx < ksize*ksize);
tempmatrix[((c_threadidx * h_dim + h_threadidx) * w_dim + w_threadidx)*ksmks_dim+ksmks_threadidx] = flag ? data_im[(channel_in * height + h_in) * width + w_in+ksh*width+ksw] : 0;

__syncthreads();

// blocks: (c_blockidx, h_blockidx, w_blockidx, ksmks_blockidx)
// threads: (h_threadidx, w_threadidx, c_threadidx, ksmks_threadidx)
threadid = __fdividef(threadIdx.x,ksmks_dim);
c_threadidx = threadid%c_dim;
threadid = __fdividef(threadid,c_dim);
w_threadidx = threadid%w_dim;
h_threadidx = __fdividef(threadid,w_dim);

w_out = w_blockidx*w_dim+w_threadidx;
h_out = h_blockidx*h_dim+h_threadidx;
channel_in = c_blockidx*c_dim+c_threadidx;
int channel_out = channel_in * ksize * ksize;

//
// write data into global memory
//
flag = (channel_in<channels && h_out<height_col && w_out<width_col && ksmks_blockidx*ksmks_num+ksmks_threadidx < ksize*ksize);
if(flag){
data_col += ( h_out * width_col + w_out) * channels * ksize * ksize + channel_out+ksh*ksize+ksw;
int h = h_in + ksh;
int w = w_in + ksw;
*data_col = (h >= 0 && w >= 0 && h < height && w < width) ?
//tempmatrix[((c_threadidx * h_dim + h_threadidx) * w_dim + w_threadidx)*ksmks_dim+ksmks_threadidx] : 0;
tempmatrix[((c_threadidx * h_dim + h_threadidx) * w_dim + w_threadidx)*ksmks_dim+ksmks_threadidx] : 0;
}
}
}
...全文
128 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
bingbingzhe 2014-08-15
  • 打赏
  • 举报
回复
你这个代码能给个说明不。 而且我觉得你就是一个矩阵的转置要这么复杂吗, cublas里面好像有相关的库的。
GPU高性能计算系列丛书的第一本《GPU高性能计算之CUDA》已经出版,由张舒,褚艳利,赵开勇,张钰勃所编写。本书除了详细介绍了CUDA的软硬件架构以及C for CUDA程序开发和优化的策略外,还包含有大量的实例供读者学习参考用。 下表是各个实例的介绍列表。 文件夹 对应书中章节 备注 ACsearch_DPPcompact_with_driver 5.2.2 AC多模式匹配算法 asyncAPI 2.5 异步API调用示例 bandwidthTest 2.3.6 带宽测试 Bitonic 5.1.1 双调排序网络 conjugateGradient 5.2.1 共轭梯度算法,CUBLAS实现 cudaMPI 2.7.3 CUDA+MPI管理GPU集群 cudaOpenMP 2.7.2 CUDA+OpenMP管理多GPU deviceQuery 2.1.4 设备查询 histKernel 2.4.3 亮度直方图统计 matrixAssign 2.1.4 矩阵赋值 matrixMul 4.7.1 矩阵乘法,利用shared memory matrixMul_Berkeley 4.7.1 矩阵乘法,利用register reduction 4.7.2 并行归约(缩减)程序 scan 5.1.2 Scan算法,例如计算前缀和 scanLargeArray 5.1.2 Scan算法,可以处理大数组 simpleCUBLAS 5.1.3 CUBLAS库的简单应用 simpleCUFFT 5.1.4 CUFFT库的简单应用 simpleD3D9 2.6.2 CUDA与Direct3D 9互操作 simpleD3D10 2.6.2 CUDA与Direct3D10互操作 simpleGL 2.6.1 CUDA与OpenGL互操作 simpleMultiGPU 2.7.1 多设备控制 simpleStreams 2.5.2 流的使用演示 simpleTexture 2.3.8 简单的纹理使用 simpleTextureDrv 2.3.8 简单的纹理使用,驱动API 实现 sortingNetworks 5.1.1 双调排序网络,处理大数组 threadMigration 2.7.1 通过上下文管理和设备管理功能实现多设备并行计算 timing 4.2.1 设备端测时 transpose 4.7.3 矩阵转置 transposeDiagonal 4.7.3 矩阵转置,考虑partition conflict VectorAdd 2.2.3/2.3.4 矢量加 VectorAddDrv 2.2.3/2.3.4 矢量加,驱动API实现

353

社区成员

发帖
与我相关
我的任务
社区描述
CUDA高性能计算讨论
社区管理员
  • CUDA高性能计算讨论社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧