【问题标题】:Converting Octave to Use CuBLAS将 Octave 转换为使用 CuBLAS
【发布时间】:2013-07-03 19:34:45
【问题描述】:

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

【问题讨论】:

  • 其实(对不起)还有更多的东西。演示者正在使用fortran bindings 具体来说,我们需要使用这些绑定的“thunking wrapper”版本。为我的回答中的错误信息道歉,除此之外还有更多。我将尝试使用一组新的说明更新我的答案。您对源文件所做的修改仍然有效,但对构建顺序的修改会有所不同。
  • @RobertCrovella 非常感谢。我真的很期待这个。
  • 我对我的答案进行了另一个(希望是最后一个)编辑。我对此进行了测试,它似乎对我有用。

标签: cuda octave cublas


【解决方案1】:

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

  1. here下载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 库”

    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. 使用其他选项运行 octave 的 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 就足够了。在我使用的 octave 3.6.3 版本中,每个都有 3 个这样的实例(小写和大写)。

  10. 现在你可以构建 octave:

    make
    

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

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

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

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

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

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

【讨论】:

  • 非常感谢。我会再试一次并报告。
  • @Joshua Fleming 将您的答案编辑保留为 cmets,而不是编辑我的答案。我的答案已针对我指定的操作系统(和 gcc)和 Octave 版本进行了测试和纠正。如果您想为其他版本的 gcc 添加信息,请在 cmets 中进行。
  • 这仍然适用于 Octave 版本 4.0.0,尽管要编辑的文件现在位于“octave-4.0.0/liboctave/array/dMatrix.cc”。发行版特定说明:Gentoo 将所有与 cuda 相关的内容放入 /opt/cuda,因此请相应地调整路径。 Debian 8 将 cuda 头文件和库放在标准 /usr 位置,因此不需要路径;但是“fortran_thunking.c”隐藏在“/usr/share/doc/nvidia-cuda-doc/examples/”中。
  • 1.您是否将 CUDA 安装在默认位置(即 libcublas.so 是否位于 /usr/local/cuda/lib64 ?) 2. 我不确定您所说的“其他软件包”是什么意思。 cublasCsyr2k 不是一个包,它是一个库的入口点。如果您所指的所有“其他包”实际上都是cublas 调用,那么它们可能都指向同一个问题。除了 dMatrix.cc 之外,您是否修改了 Octave 发行版中的任何文件? jlh 似乎认为它适用于 Octave 4.0.0
  • 例如,对链接顺序理论的一种可能的测试是在上面的第 8 步中将这个:./configure --disable-docs LDFLAGS="-L/usr/local/cuda/lib64 -lcublas -lcudart -L/home/user2/octave/octave-3.6.3/mycublas -lmycublas" 更改为这个:./configure --disable-docs LDFLAGS="-L/home/user2/octave/octave-3.6.3/mycublas -lmycublas -L/usr/local/cuda/lib64 -lcublas -lcudart"。 (如有必要,对-L 开关指定的路径进行修改)。
【解决方案2】:

我能够使用提供的信息生成已编译的可执行文件。这是一个可怕的 hack,但它确实有效。

流程如下:

首先为fortran_thunking.c 生成一个目标文件

sudo /usr/local/cuda-5.0/bin/nvcc -O3 -c -DCUBLAS_GFORTRAN fortran_thunking.c

然后将该对象文件移动到octave 中的src 子目录

cp /usr/local/cuda-5.0/src/fortran_thunking.o ./octave/src

运行make。编译将在最后一步失败。切换到src 目录。

cd src

然后在octave-main.o 之后添加./fortran_thunking.o -lcudart -lcublas 来执行失败的最后一行。这将产生以下命令

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 目录中创建。这是你的 octave 可执行文件。

【讨论】:

  • 干得好!我还在构建八度音阶。如果您不介意,我会将您所做的以及已经讨论过的内容汇总到我的回答中的一组连贯的说明中。但我赞成你的。
【解决方案3】:

在最新版本的 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 在当前的多核处理器上速度相当快。如此之快以至于time spend copying data to GPU, working on it, and copying back 可能接近在 CPU 上完成这项工作所需的时间。自己检查。尽管 GPU 通常更节能。

【讨论】:

  • 确认这些年来在 octave 5.2.0 上仍然有效。困难的部分是确保专有的 nvidia 设备驱动程序已正确安装和运行。 libnvblas 安装正确,nvblas.conf 配置正确。然后就像宣传的那样:1080TI GPU 上的 1.3 teraflops 而不是单个 cpu 内核上的 3 gigaflops。如果您的矩阵很大,或者您没有监控 GPU 温度以防止过热,请准备好从 GPU 中释放出 95C 的金属熔化热量。
猜你喜欢
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 2023-04-06
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
相关资源
最近更新 更多