将Octave转换为使用CuBLAS

时间:2013-07-05 16:25:39

标签: cuda octave cublas

我想将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_'

3 个答案:

答案 0 :(得分:8)

<强> EDIT2: this video中描述的方法需要使用fortran“thunking library”bindings for cublas。 这些步骤对我有用:

  1. here下载八度音阶3.6.3:

    wget ftp://ftp.gnu.org/gnu/octave/octave-3.6.3.tar.gz
    
  2. 从档案中提取所有文件:

    tar -xzvf octave-3.6.3.tar.gz
    
  3. 切换到刚创建的八度目录:

    cd octave-3.6.3
    
  4. 为您的“thunking cublas library”创建一个目录

    mkdir mycublas
    
  5. 切换到该目录

    cd mycublas
    
  6. 建立“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
    
  7. 切换回主构建目录

    cd ..
    
  8. 使用其他选项运行八度音阶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目录的路径相匹配的目录

  9. 现在根据the video中的说明修改octave-3.6.3/liboctave/dMatrix.cc。将dgemm的每个实例替换为cublas_dgemm并将DGEMM的每个实例替换为CUBLAS_DGEMM就足够了。在我使用的八度音阶3.6.3版本中,每个都有3个这样的实例(小写和大写)。

  10. 现在你可以建立八度:

    make
    

    (确保您在octave-3.6.3目录中)

  11. 此时,对我而言,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库。

    this blog article

    中讨论了一种更新,更好的方法(使用NVBLAS拦截库)

答案 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通常更节能。