问题标签 [blas]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2174 浏览

c++ - 用非零值初始化双精度数组(blas)

我分配了一个大的双向量,假设有 100000 个元素。在我的代码中的某个时刻,我想将所有元素设置为一个恒定的非零值。如何在不对所有元素使用 for 循环的情况下做到这一点?如果有帮助,我也在使用 blas 包。

0 投票
1 回答
608 浏览

c - 处理器子集上的不相交网格及其在 Scalapack 中的通信

总之,我的问题是关于如何在Scalapack(BLACS)中的两个不同进程网格上的两个块循环分布矩阵之间实现矩阵复制。我正在尝试使用 pdgemr2d_ 来实现这一点,我经常在其他情况下使用它,我在同一进程网格上的两个矩阵之间进行复制。

下面是对我遇到的问题状态的相当技术性的讨论。我已经把它归结为一个基本问题,但在我看来没有解决方案......虽然必须有,因为 Scalapack 特别指出我正在尝试的操作类型是可能的。我在任何地方都找不到足够的例子。

在 C 中使用 MPI 运行的 Scalapack 中的 1x1 计算网格的初始化通常如下所示:

此代码将生成一个 1x1 网格,无论 MPI 知道多少处理器({1, 1},网格的大小,被传递给 Cblacs_gridinit)。在这里,CONTEXT 向 Scalapack 函数指示我们正在处理哪个网格(可以同时使用多个网格,并且由 Cblacs_get 生成)。Cblacs_gridinfo 将 NPROW 和 NPCOL 设置为处理器行数和列数(在本例中为 {1, 1})。MYPROW 和 MYPCOL 向每个处理器指示哪个网格块属于它。在这种情况下,在 1x1 网格上,只有一个处理器参与,其网格 ID 为 {0, 0}。

为简单的块循环分布式 100x100 矩阵初始化矩阵描述符通常也很简单:

(稍后我们将看到为什么需要“保护”变量,因为在某些处理器上 num_cols_local 或 num_rows_local 将非常正确地返回为负整数。)

上面的大部分内容都是不言自明的,除了传递给 descinit_ 的 &zeros,它表示矩阵的第一行所在的处理器行,以及第一列所在的处理器列。这些值在 descinit_ 函数中使用时具有非常明确的界限。从 Fortran 函数本身来看,

我们在这里将 IRSRC 和 ICSRC 作为零传递,因为 {0,0} 是我们单个网格块的正确索引。即使网格大得多,我们可能仍会传递 {0,0},因为第一个处理器块可能会存储第一行和第一列的值。

在一个处理器上运行时,效果很好。NPROW、NPCOL、MYPROW 和 MYPCOL 的唯一处理器 RANK 0 上的值分别为 1、1、0 和 0。在这种情况下,CONTEXT 为 0,它的非负性表明它所指的网格在此 RANK 上是活动的。这些值表示存在 1x1 进程网格,并且第一个处理器具有正确的表示属于 RANK 0 的正确进程网格块。在这种情况下,它是唯一的块。

然而,当在两个处理器上运行时,事情会发生故障,而且它们不应该正式出现。在第一个和第二个 RANK 中,我们有 CONTEXT、NPROW、NPCOL、MYPROW 和 MYCOL:

所有值都是负数。最重要的是,RANK 1 上的 CONTEXT 为负数,表明此 RANK 不参与我们的 1x1 处理器网格。现在调用 descinit_ 立即成为所有处理器的问题。如果我们从 descinit_ 引用 Fortran 代码,我们有(为了清楚起见从上面重复):

只要每个处理器都参与网格,这些限制就有意义。索引不能为负数或大于或等于进程网格中的总行数或列数,因为这样的网格块不存在!

然后在 RANK 1 上,IRSRC 作为零传递,但 NPROW 和 NPCOL 从网格初始化返回为 -1,因此 descinit_ 将始终失败。

通过简单地将矩阵描述符的初始化和所有后续操作限制为参与当前网格的处理器,可以轻松地克服上述所有问题。就像是:

但是,我不只有一个处理器网格,我有两个,我需要它们通过 pdgemr2d_ 函数进行通信。此函数的目的是将一个网格上的分布式矩阵 A 的子集复制到另一个网格上的分布式矩阵 B。网格不需要以任何方式相互关联,并且可以部分或完全不相交。这应该是一个微不足道的操作。例如,我想将具有上下文 CONTEXT_A 的处理器网格中的完整矩阵复制到具有上下文 CONTEXT_B 的处理器网格中。每个上下文中矩阵的描述符以 desc_A 和 desc_B 的形式给出。

这也是相当不言自明的。它必须在任一上下文具有任何网格成员的所有处理器上运行。在我的例子中,CONTEXT_A 有一个跨越 MPI 知道的所有处理器的网格,而 CONTEXT_B 是一个 1x1 单处理器网格。

pdgemr2d_ 必须提供一个上下文标识符,至少包含包含在 CONTEXT_A 和 CONTEXT_B 中的所有处理器,并且对于那些不属于 CONTEXT_A 或 CONTEXT_B 的处理器,元素 desc_A[CTXT] 或 desc_B[CTXT] 必须分别设置为 - 1 在那个处理器上。

理论上,descinit_ 可以优雅地做到这一点,因为 Cblacs_gridinit 返回的 CONTEXT 值在任何不参与该上下文网格的处理器上都是 -1。但是,由于上面详述的 NPROW 和 NPCOL 负值的限制,descinit_ 不会在任何不参与网格的处理器上生成正确的矩阵描述符。

为了进行适当的不相交网格通信,必须在参与任一上下文的所有处理器上定义这样的矩阵描述符。

显然,pdgemr2d_ 不能用这个作为一个不可克服的缺陷来编写,因为代码中的函数描述特别指出:

PDGEMR2D 将 A 的子矩阵复制到 B 的子矩阵上。A 和 B 可以有不同的分布:它们可以在不同的处理器网格上,它们可以有不同的块大小,要复制的区域的开头可以在 A 上的不同位置和 B。

非常感谢您的帮助,我知道这是一个相当专业的问题。

0 投票
2 回答
6075 浏览

c++ - CUBLAS - 矩阵加法..如何?

我正在尝试使用 CUBLAS 对两个未知大小的大矩阵求和。我需要一个完全优化的代码(如果可能的话),所以我选择不重写矩阵加法代码(简单),而是使用 CUBLAS,特别是允许对 A 和 C 求和的 cublasSgemm 函数(如果 B 是单位矩阵):*C = alpha*op(A)*op(B)+beta*c*

问题是:C 和 C++ 以行优先格式存储矩阵,cublasSgemm 旨在(为了与 fortran 兼容)以列优先格式工作。您可以指定是否要先转置 A 和 B,但不能指示转置 C。所以我无法完成矩阵加法..

我不能自己转置 C 矩阵,因为该矩阵的最大尺寸类似于 20000x20000。

请问有什么办法解决吗?

0 投票
1 回答
117 浏览

blas - 读取矩阵并对其进行操作 BLAS

如果一个矩阵是内存映射的,我需要读取它并分块处理它,因为它有点大,如何读取它并逐块处理它BLAS

0 投票
4 回答
897 浏览

c - 我该如何解决这个 c 代码/BLAS 错误?

我正在尝试编写使用 R 中的 BLAS lib 的 ac 函数(稍后将在 R 脚本中使用)

我使用以下代码编译代码:

我得到错误:

我错过了什么?

0 投票
1 回答
9227 浏览

cuda - CUBLAS 矩阵乘法

在使用 CUDA 实现矩阵乘法之后。我试图用 CUBLAS 来实现它(感谢论坛中一些人的建议)。

我可以将方阵相乘,但是(再次是的......)我在使用非方阵时遇到了困难。唯一有效的非方阵乘法是当您改变矩阵 A 的宽度(A*B=C)时。

我没有收到任何错误,但结果矩阵返回错误值。这是我的代码(它基本上是对 simpleCUBLAS SDK 示例的改编):

有什么想法吗?另外,有没有人在 CUBLAS 中有一个矩阵乘法实现正在工作,所以我可以比较一下吗?提前致谢。

0 投票
2 回答
2951 浏览

python - BLAS sgemm/dgemm 如何工作?

我正在尝试sgemm在 python 中使用 ctypes 来利用 BLAS 中的函数。尝试解决C = A x B以下代码可以正常工作:

现在我想解这个方程:C = A' x A其中A'是 A 的转置,下面的代码运行没有异常,但返回的结果是错误的:

对于测试,我插入了一个矩阵A = [1 2; 3 4]。正确的结果是C = [10 14; 14 20]sgemm例程会吐出C = [5 11; 11 25]

据我了解,矩阵A不必由我转置,因为算法会处理它。在第二种情况下我的参数传递有什么问题?

任何帮助,链接,文章,建议表示赞赏!

0 投票
2 回答
8309 浏览

visual-c++ - Visual C++ 2010 和 Lapack、Blas 库

我想使用BlasLapack库来使用一些 rutines,但是我不知道如何在Visual C++ 2010.

在这种情况下如何使用它们?

0 投票
1 回答
1229 浏览

visual-studio-2010 - Visual C/C++ 2010 上的 LAPACK

我想在 Visual C/C++ 2010 中使用 LAPACK 和 BLAS(将 LAPACK 和 BLAS 库添加到 Visual C/C++ 2010),所以我在这里阅读了一个非常相似的问题相同但使用 Visual C/C++ 2008),他声称他解决了这个问题:

我想出了我的问题的答案。问题是我知道我必须将包含 LAPACK .lib 文件的目录放在库目录列表中(工具 -> 选项 -> 项目和解决方案 -> VC++ 目录 -> 库文件)但忘记了我还必须将其添加到项目->(项目名称)属性->链接器->输入下的“附加依赖项”。

当我尝试遵循他的解决方案时,在得到Tools -> Options -> Projects and Solutions -> VC++ Directories Visual后,C/C++ 2010 说 VC++ 目录未使用...

那么现在如何添加 .libs 以便 Visual C/C++ 2010 识别它们?

0 投票
0 回答
276 浏览

gcc - 混合内存对齐和未对齐的代码

我最近编译了 GotoBLAS2 (MacOSX 10.6) 并将其链接到我的代码,导致各种错误的结果。我通过 valgrind 运行所有内容,注意到来自 GotoBLAS 的一些非法读取。当更仔细地查看它时,我发现 GotoBLAS 是使用 -m128bit-long-double 对齐选项编译的。一旦我也用这个标志编译了我的代码(尽管我根本不使用任何长双打),一切正常,给出正确的结果,没有任何 valgrind 模糊。

现在我的问题是:

  • 我是否必须使用相同的对齐标志编译所有其他库依赖项?