我想将 Octave 转换为使用 CuBLAS 进行矩阵乘法。这段视频似乎表明这就像输入 28 个字符一样简单:
Using CUDA Library to Accelerate Applications
在实践中,它比这更复杂一些。有谁知道必须做哪些额外的工作才能编译此视频中所做的修改?
更新
这是我正在尝试的方法
在 dMatrix.cc 添加#include <cublas.h>
在 dMatrix.cc 中更改所有出现的(保留大小写)dgemm
到cublas_dgemm
在我的构建终端集中
export CC=nvcc
export CFLAGS="-lcublas -lcudart"
export CPPFLAGS="-I/usr/local/cuda/include"
export LDFLAGS="-L/usr/local/cuda/lib64"
我收到的错误是:libtool: link: g++ -I/usr/include/freetype2 -Wall -W -Wshadow -Wold-style-cast
-Wformat -Wpointer-arith -Wwrite-strings -Wcast-align -Wcast-qual -g -O2
-o .libs/octave octave-main.o -L/usr/local/cuda/lib64
../libgui/.libs/liboctgui.so ../libinterp/.libs/liboctinterp.so
../liboctave/.libs/liboctave.so -lutil -lm -lpthread -Wl,-rpath
-Wl,/usr/local/lib/octave/3.7.5
../liboctave/.libs/liboctave.so: undefined reference to `cublas_dgemm_'
最佳答案
编辑2:
this video中描述的方法需要使用 fortran“thunking 库”bindings for cublas .
这些步骤对我有用:
wget ftp://ftp.gnu.org/gnu/octave/octave-3.6.3.tar.gz
tar -xzvf octave-3.6.3.tar.gz
cd octave-3.6.3
mkdir mycublas
cd mycublas
g++ -c -fPIC -I/usr/local/cuda/include -I/usr/local/cuda/src -DCUBLAS_GFORTRAN -o fortran_thunking.o /usr/local/cuda/src/fortran_thunking.c
ar rvs libmycublas.a fortran_thunking.o
cd ..
configure
附加选项:./configure --disable-docs LDFLAGS="-L/usr/local/cuda/lib64 -lcublas -lcudart -L/home/user2/octave/octave-3.6.3/mycublas -lmycublas"
请注意,在上述命令行中,您需要更改第二个
-L
的目录。切换到与您的路径匹配的路径 mycublas
您在步骤 4 中创建的目录 octave-3.6.3/liboctave/dMatrix.cc
根据 the video 中给出的说明.替换 dgemm
的每个实例应该就足够了与 cublas_dgemm
以及 DGEMM
的每个实例与 CUBLAS_DGEMM
.在我使用的 Octave 3.6.3 版本中,每个都有 3 个这样的实例(小写和大写)。 make
(确保您在
octave-3.6.3
目录中)至此,对我来说,Octave 构建成功。我没有追求
make install
虽然我认为这会奏效。我只是使用 ./run-octave
运行了 Octave 音程octave-3.6.3
中的脚本目录。上述步骤假设正确且标准的 CUDA 5.0 安装。我将尝试回答特定于 CUDA 的问题或问题,但是在您的平台上进行常规 Octave 安装可能会出现许多问题。我不是 Octave 专家,我将无法回应这些。我使用 CentOS 6.2 进行此测试。
如上所述,此方法涉及修改 Octave 音程的 C 源文件。
另一种方法在 GTC 2013 GPU 技术 session 上的 S3527 session 中有详细介绍。本次 session 实际上是一个动手实验室练习。不幸的是,上面的 Material 并不方便。然而,那里的方法没有涉及对 GNU Octave 源代码的任何修改,而是使用了
LD_PRELOAD
capability of Linux拦截 BLAS 库调用并将(适当的)重定向到 cublas 库。this blog article 中讨论了一种更新、更好的方法(使用 NVBLAS 拦截库)。
关于cuda - 将 Octave 转换为使用 CuBLAS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17493270/