Hi,chenjie13,
从你的文字和代码来看,这不是正常的点乘法过程。 常用的点乘法是将向量的多个分量相乘,然后累积一个标量。 另一方面,从你的文字和代码来看,这对于你的3D矩阵a的任意1024 * 1024=1M个要素的面As,看起来像其中的各要素as(I,j ) ) c ) I,I )
如果是基于这种理解而不是原始说明,根据代码:
在200阶这个矩阵的任何一面,系数矩阵的任何一面,大小都为8MB(1024*1024*2*sizeof )浮点)。 这远远超过了现在GPU的任何L2 cache的大小。 因此,实际上每次乘法运算时,3D矩阵的各面和系数的这个平面都会从global memory中反复加载。 最终将重复加载8MB * 200 8MB * 200 8MB * 200=约4.8GB。 实际的SM的SP几乎都是空载的,显现很忙。 Profiler会验证我的说法。
考虑到计算能力的差异,这些写法并不一定能充分满载内存。 建议分别进行到下一个步骤:
)1)使用配置文件查看设备内存利用率的程度。 无法接近满载的情况。 考虑在一个线程中计算多组数据(你这里两个元素的乘法运算分别得到实部和虚部的过程)。 对于特定计算能力的卡片,这样做是必要的。
)2)如果你的卡现在这个表示法卡在内存、访问、内存的基本峰值上的话,就必须考虑重复数据的优化。 有巨大的重叠系数面(8MB ),每次与200面大矩阵的各面运算时,默认代码每次都会重新加载该系数面。 这是徒劳的。 必须考虑通过shared memory等手段对每批进行缓冲
(1) )中的任何一种,目前该算法都在访问和保存卡。
实际上达到约300GB/s的纸牌,在你的这个编码理论中,跑到约8MB * 401=3.2GB、3.2GB/300GB/s=约10.x ms (例如1080 )是最佳的,实际上跑到20ms以下是最佳的
Regards,
杀人神。
版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。