我想将Octave转换为使用CuBLAS进行矩阵乘法。此视频似乎表明这就像键入28个字符一样简单:
Using CUDA Library to Accelerate Applications
在实践中,它比这复杂一点。有谁知道必须做哪些额外的工作才能在这个视频编译中进行修改?
这是我正在尝试的方法
在dMatrix.cc中添加
#include <cublas.h>
更改了(保留大小写)
的所有出现 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_'
答案 0 :(得分:8)
<强> EDIT2:强> this video中描述的方法需要使用fortran“thunking library”bindings for cublas。 这些步骤对我有用:
从here下载八度音阶3.6.3:
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
为您的“thunking cublas library”创建一个目录
mkdir mycublas
切换到该目录
cd mycublas
建立“thunking cublas library”
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
开关的目录更改为与您在步骤4中创建的mycublas
目录的路径相匹配的目录
现在根据the video中的说明修改octave-3.6.3/liboctave/dMatrix.cc
。将dgemm
的每个实例替换为cublas_dgemm
并将DGEMM
的每个实例替换为CUBLAS_DGEMM
就足够了。在我使用的八度音阶3.6.3版本中,每个都有3个这样的实例(小写和大写)。
现在你可以建立八度:
make
(确保您在octave-3.6.3
目录中)
此时,对我而言,Octave成功建造。我没有追求make install
,尽管我认为这样可行。我只是使用./run-octave
目录中的octave-3.6.3
脚本运行八度音程。
以上步骤假定安装了正确且标准的CUDA 5.0。我将尝试回答特定于CUDA的问题或问题,但是在您的平台上安装Octave时可能会出现许多问题。我不是一个八度专家,我将无法回答这些问题。我使用CentOS 6.2进行此测试。
如所示,此方法涉及修改八度音阶的C源文件。
在GTC 2013 GPU技术大会的S3527会议中详细介绍了另一种方法。本次会议实际上是一次动手实验练习。不幸的是,那里的材料不方便。然而,那里的方法没有涉及GNU Octave源的任何修改,而是使用LD_PRELOAD
capability of Linux来拦截BLAS库调用并将(适当的)重定向到cublas库。
答案 1 :(得分:2)
我能够使用提供的信息生成已编译的可执行文件。这是一个可怕的黑客,但它确实有效。
过程如下:
首先为fortran_thunking.c生成一个目标文件
sudo /usr/local/cuda-5.0/bin/nvcc -O3 -c -DCUBLAS_GFORTRAN fortran_thunking.c
然后将该目标文件移至src
octave
子目录
cp /usr/local/cuda-5.0/src/fortran_thunking.o ./octave/src
运行make
。编译将在最后一步失败。切换到src
目录。
cd src
然后在./fortran_thunking.o -lcudart -lcublas
之后添加octave-main.o
执行失败的最后一行。这会产生以下命令
g++ -I/usr/include/freetype2 -Wall -W -Wshadow -Wold-style-cast -Wformat
-Wpointer-arith -Wwrite-strings -Wcast-align -Wcast-qual
-I/usr/local/cuda/include -o .libs/octave octave-main.o
./fortran_thunking.o -lcudart -lcublas -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
将在octave
目录中创建src/.libs
二进制文件。这是你的八度可执行文件。
答案 2 :(得分:1)
在最新版本的CUDA中,您无需重新编译任何内容。至少我在Debian中找到了。首先,为NVBLAS(cuBLAS包装器)创建配置文件。没有它就行不通。
tee nvblas.conf <<EOF
NVBLAS_CPU_BLAS_LIB $(dpkg -L libopenblas-base | grep libblas)
NVBLAS_GPU_LIST ALL
EOF
然后像往常一样使用Octave:
LD_PRELOAD=libnvblas.so octave
NVBLAS将在GPU上尽其所能,同时将其他所有内容转发给OpenBLAS。
进一步阅读:
值得注意的是,根据使用的CPU / GPU,您可能无法享受GPU计算的所有好处:OpenBLAS与当前的多核处理器相当快。如此之快time spend copying data to GPU, working on it, and copying可以接近在CPU上完成工作所需的时间。检查自己。虽然GPU通常更节能。