首页 > 解决方案 > Cuda 高效矩阵加法

问题描述

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

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

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

  3. 矩阵填充如何提高性能?

标签: cudagpu

解决方案


1:一个简单的方法是将矩阵存储为一个向量/浮点数组,其中行被连接。然后,您可以只使用每个块的大量线程和最少的必要块数。是一个内核看起来如何的示例。

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

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

3:我看不出填充将如何提高性能,因为您需要复制和计算更多元素,但我不是这方面的专家。


推荐阅读