[b]dim3 grid(10,1);
dim3 blk(20,25);
matrix_mul<<<grid,blk>>>(par,d_d,d_block,d_dct_block);
global void matrix_mul(myparameter par,float *d_d,float d_block,float d_dct_block)
{
int y_id=blockIdx.yblockDim.y+threadIdx.y;
int x_id=blockIdx.xblockDim.x+threadIdx.x;
float a;
a=0;
for(int i=0;i<72;i++)
{
for (int j=0;j<25;j++)
{
a+=d_d[y_id25+j]d_block[j14400+x_id+i200];
}
d_dct_block[y_id14400+x_id+i200]=a;
a=0;
}
__syncthreads();
}[/b]
用这个来实现2525的矩阵与2514400的矩阵相乘,不知道有什么问题,希望斑竹能分析一下,谢谢 了
您这个算法貌似还是CPU的矩阵分块模型,并不是CUDA的编程模型。
问题在于:您这个a是局部变量,每个线程各自维护一个。
然而
a+=d_d[y_id25+j]d_block[j14400+x_id+i200];
这个语句,却是涉及到每个线程对a的累加,这是问题的关键。当然,你可以用原子操作实现你现有的想法。
至于矩阵乘法的实现,建议您还是先看下编程手册(论坛里有yyfn风辰大神翻译的5.0中文版),里面对矩阵乘法有非常详尽的阐述。
LZ程序是没问题……我没有认真看清程序,再次思过~
你的算法没什么问题,但是有改进空间。首先就是A可以放在共享内存,这样会减少对全局内存访问次数,提升内核的性能。其次,仅仅从代码上来看,你的线程数比较少,只有5000个,假设你用的是kepler架构设备,一个SMX可以驻留2048个活动线程,如果你的设备较好,比如有3组以上的smx,那么多余的流多处理器就空闲了,而对于kepler来说活动线程数量也是影响其性能的一方面,所以建议增加活动线程数。
非常感谢您的关注,前几天一直忙,没顾得上这个,真心谢谢;
谢谢斑竹,现在才回复您,我这个程序也就是简单的一个实验,后期还得优化;
谢谢斑竹,现在才回复您,我这个程序也就是简单的一个实验,后期还得优化;
现在想起一个问题:我的GPU计算能力为2.1,且只有一个sm,每个sm中有48个sp;
通过查资料:每个sm中的block数量限制为8个,每个block中线程数为1024,每个sm中线程数限制为1536个,那么我这个程序是不是就会出为题了呢,
谢谢斑竹;
您的硬件实现你顶楼所说的计算规模可以说是轻而易举的,请勿怀疑它。
至于您的代码是否有问题,这取决于您的写法,取决于您的调用方法和任务划分。请您在理解问题的基础上考虑您代码的撰写。
祝您好运。