【问题标题】:How threads/blocks are mapped on GPU while calling cublasSgemm/clAmdBlasSgemm routines?调用 cublasSgemm/clAmdBlasSgemm 例程时如何在 GPU 上映射线程/块?
【发布时间】:2013-01-28 16:35:11
【问题描述】:

我很想知道在计算矩阵乘法 (C = A * B) 时,cublasSgemm/clAmdBlasSgemm 例程是如何映射到 GPU 上的。

假设输入矩阵的维度 ::A_rows = 6144; A_cols = 12288; B_rows = 12288; B_cols = 15360;

结果矩阵的维度 :: C_rows = 6144; C_cols = 15360;

假设我已经在主机上初始化了输入矩阵,并且我将矩阵数据复制到了设备内存中。之后,我将调用 cuBlasclAmdBlas 例程在 GPU 上进行矩阵乘法。

void cublasSgemm (char transa, char transb, int m, int n, int k, float alpha, const float *A, int lda, const float *B, int ldb, float beta, float *C, int ldc);

其中 m = A_rows;和 n = B_cols;

所以我的疑问是:
1.) 这些例程是如何在 GPU 上实现的?
2.) m 和 n 值是否映射在一个计算单元 (SM) 上?如果否,那么 m 和 n 的最大值是多少?
3.) 我们是否可以控制线程/块?

【问题讨论】:

  • 您是否真的想了解 CUBLAS 或您所询问的任何 OpenCL 库?你认为有一个适用于两者的共同答案吗?
  • @talonmies 是的,我想知道这些例程是如何定义的?
  • 这是两个完全不同的问题。选择其中之一。
  • @talonmies 我只想知道在调用这些例程时如何控制线程/块?

标签: cuda opencl gpgpu blas cublas


【解决方案1】:

在继续之前,您必须阅读 Volkov 和 Demmel 的论文,看看这里:http://www.cs.berkeley.edu/~volkov/ 查看他关于 SGEMM 的文章。自 2008 年以来,答案就在那里。

【讨论】:

    【解决方案2】:

    对于主机端 CUBLAS API(请注意,我不知道您为什么会认为 clAmdBlasSgemm 会是相同的),您的问题的简短回答如下:

    1. 现代 CUBLAS 是封闭源代码。有像Magma 这样的代码库,您至少可以了解一下 CUBLAS 可能 是如何实现的。您还可以在 NVIDIA 提供的分析器之一中运行 CUBLAS 代码,以查看它在 GPU 上的作用。但关键是你不需要知道它是如何工作的。有一个 API 和一些非常详尽的文档。这就是您需要知道的全部内容。
    2. 您的示例问题需要大约 1.2Gb 的内存。如果您有一个具有这么多内存的 GPU,并且有足够的计算能力来避免display driver watchdog timer,或者有一个计算专用的 GPU,它就会工作。内存和显示驱动程序时间限制(如果适用)是唯一的限制。
    3. 没有。

    请注意,还有一个用于 K20 Kepler 设备的 CUBLAS 设备 API,我上面提供的答案不适用于该库。

    【讨论】:

    • 根据您的第二点,我了解到 cublasSgemm() 例程中的 m 和 n 的值将映射到所有 SM(不仅仅是一个 SM)。是这样吗?
    • @Gopal:这是一个未公开的实现细节。如果你真的想要,你可以通过分析一个正在运行的调用来检查发生了什么,但你不必知道任何这些来使用 CUBLAS。
    猜你喜欢
    • 2021-04-04
    • 1970-01-01
    • 2018-10-14
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多