9

我正在尝试将 CUSP 用作 Mathematica 的外部线性求解器,以利用 GPU 的强大功能。这是CUSP 项目网页。我正在寻求一些建议,我们如何将 CUSP 与 Mathematica 集成。我相信在座的许多人都会有兴趣讨论这个问题。我认为编写一个输入矩阵然后将其提供给 CUSP 程序不是要走的路。使用 MathematicaLibrarayFunctionLoad将是一种将输入矩阵动态流水线到基于 GPU 的求解器的更好方法。直接从 Mathematica 提供矩阵和右侧矩阵的方法是什么?

这是一些 CUSP 代码片段。

#include <cusp/hyb_matrix.h>
#include <cusp/io/matrix_market.h>
#include <cusp/krylov/cg.h>

int main(void)
{
// create an empty sparse matrix structure (HYB format)
cusp::hyb_matrix<int, float, cusp::device_memory> A;

// load a matrix stored in MatrixMarket format
cusp::io::read_matrix_market_file(A, "5pt_10x10.mtx");

// allocate storage for solution (x) and right hand side (b)
cusp::array1d<float, cusp::device_memory> x(A.num_rows, 0);
cusp::array1d<float, cusp::device_memory> b(A.num_rows, 1);

// solve the linear system A * x = b with the Conjugate Gradient method
cusp::krylov::cg(A, x, b);

return 0;
}

这个问题让我们有机会讨论 Mathematica 8 的编译能力。也可以调用 MMA 的 mathlink 接口的话题。我希望这里的人们发现这个问题值得思考并且足够有趣。

BR

4

1 回答 1

1

如果您想使用 LibraryLink(LibraryFunctionLoad 用于访问动态库函数作为 Mathematica 的下值)实际上没有太多讨论空间,LibraryFunctions 可以接收机器双精度数或机器整数的 Mathematica 张量,您就完成了。

Mathematica MTensor 格式是一个密集数组,就像您在 C 中自然使用的一样,因此如果 CUSP 使用其他格式,您将需要编写一些胶水代码来在表示之间进行转换。

有关详细信息,请参阅LibraryLink 教程

您需要特别注意与 Mathematica 交互页面中的“MTensors 的内存管理”部分,并选择“共享”模式以仅通过引用传递 Mathematica 张量。

于 2011-10-24T20:04:04.577 回答