库达高效矩阵加法

时间:2019-01-29 10:12:30

标签: cuda gpu

我是cuda的新手,正在学习GPU编程。我想添加两个nxm矩阵(float * A和float * B)并将结果存储在内核的float * C中。目标是获得最快的实施。我有以下问题:

  1. 我想知道如何排列块和网格以获得最佳性能(对于小和大的n和m)

  2. 最好为矩阵的每个元素分配一个线程。但是,对于大的n和m,这是不可能的。那么最好的选择是什么?

  3. 矩阵填充如何改善性能?

1 个答案:

答案 0 :(得分:1)

1 :一种简单的方法是将矩阵存储为连接行的浮点向量/数组。然后,您可以只在每个块中使用大量线程,而使用最少的必要块数。 Here是内核外观的一个示例。

2 :只要矩阵的大小不超过GPU上的可用内存,基本上就可以有无限数量的线程。它们不会同时执行,但是驱动程序会为您安排它们,您不必担心。

每个元素一个线程通常效果很好,如果您想尝试另一种方法,请查看Grid Stride Loops,这是一种可扩展的方法,可以在更少的线程中组织元素。

3 :随着您获得更多要复制和计算的元素,我看不到填充将如何提高性能,但是我对此并不熟练。