2

I'd like to convert Octave to use CuBLAS for matrix multiplication. This video seems to indicate this is as simple as typing 28 characters:

Using CUDA Library to Accelerate Applications

In practice it's a bit more complex than this. Does anyone know what additional work must be done to make the modifications made in this video compile?

UPDATE

Here's the method I'm trying

in dMatrix.cc add

#include <cublas.h>

in dMatrix.cc change all occurences of (preserving case)

dgemm

to

cublas_dgemm

in my build terminal set

export CC=nvcc
export CFLAGS="-lcublas -lcudart"
export CPPFLAGS="-I/usr/local/cuda/include"
export LDFLAGS="-L/usr/local/cuda/lib64"

the error I receive is:

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_'
4

3 回答 3

7

EDIT2:本视频 中描述的方法需要对 cublas 使用 fortran“ thunking library”绑定。这些步骤对我有用:

  1. 从这里下载 octave 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. 切换到刚刚创建的 octave 目录:

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

    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"
    

    请注意,在上面的命令行中,您需要将第二个开关的目录更改为与您在步骤 4 中创建的目录-L的路径相匹配的目录mycublas

  9. 现在octave-3.6.3/liboctave/dMatrix.cc根据视频中给出的说明进行编辑。dgemm替换 with 的每个实例和with的cublas_dgemm每个实例就足够DGEMMCUBLAS_DGEMM。在我使用的 octave 3.6.3 版本中,每个都有 3 个这样的实例(小写和大写)。

  10. 现在您可以构建八度音阶:

    make
    

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

至此,对我来说,Octave 构建成功。make install尽管我认为这会起作用,但我没有追求。./run-octave我只是使用目录中的脚本运行了 octave octave-3.6.3

上述步骤假定安装了正确且标准的 CUDA 5.0。我将尝试回答特定于 CUDA 的问题或问题,但是在您的平台上安装常规 Octave 可能会出现许多问题。我不是八度专家,我无法回应这些。我使用 CentOS 6.2 进行这个测试。

如前所述,此方法涉及修改 octave 的 C 源文件。

另一种方法在 GTC 2013 GPU 技术大会的 S3527 会议中有一些详细介绍。本次会议实际上是一个动手实验室练习。不幸的是,上面的材料并不方便。然而,那里的方法不涉及对 GNU Octave 源的任何修改,而是使用LD_PRELOAD Linux 的能力来拦截 BLAS 库调用并将(适当的)重定向到 cublas 库。

此博客文章中讨论了一种更新、更好的方法(使用 NVBLAS 拦截库)

于 2013-07-05T16:57:42.020 回答
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刚刚 after 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文件。这是您的八度可执行文件。

于 2013-07-06T02:50:22.147 回答
2

在最新版本的 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

进一步阅读:

值得注意的是,您可能无法享受 GPU 计算的所有好处,具体取决于所使用的 CPU/GPU:OpenBLAS 在当前的多核处理器上速度相当快。如此之快,花在将数据复制到 GPU、对其进行处理和复制回来的时间可能接近于在 CPU 上完成这项工作所需的时间。自己检查。尽管 GPU 通常更节能。

于 2017-04-26T08:05:23.313 回答