将 Octave 转换为使用 CuBLAS

2024-01-14

我想将 Octave 转换为使用 CuBLAS 进行矩阵乘法。该视频似乎表明这就像输入 28 个字符一样简单:

使用 CUDA 库加速应用程序 http://youtu.be/P2Ew4Ljyi6Y?t=1m59s

实际上,情况比这更复杂一些。有谁知道必须做哪些额外的工作才能使该视频中所做的修改编译?

UPDATE

这是我正在尝试的方法

在 dMatrix.cc 中添加

#include <cublas.h>

在 dMatrix.cc 中更改所有出现的情况(保留大小写)

dgemm

to

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

EDIT2:中描述的方法这个视频 http://youtu.be/P2Ew4Ljyi6Y?t=1m59s需要使用 fortran“thunking 库”cublas 的绑定 http://docs.nvidia.com/cuda/cublas/index.html#appendix-b-cublas-fortran-bindings。 这些步骤对我有用:

  1. 下载八度 3.6.3 从here ftp://ftp.gnu.org/gnu/octave/octave-3.6.3.tar.gz:

    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. 运行八度音程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 中创建的目录

  9. 现在编辑octave-3.6.3/liboctave/dMatrix.cc根据给出的说明视频 http://youtu.be/P2Ew4Ljyi6Y?t=1m59s。替换每个实例应该足够了dgemm with cublas_dgemm和每个实例DGEMM with CUBLAS_DGEMM。在我使用的 Octave 3.6.3 版本中,每个都有 3 个这样的实例(小写和大写)。

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

    make
    

    (确保您位于octave-3.6.3目录)

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

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

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

GTC 2013 GPU 技术大会上的 S3527 会议详细介绍了另一种方法。这次会议实际上是一次实验室实践练习。不幸的是,相关材料并不方便获得。然而,那里的方法没有涉及对 GNU Octave 源代码的任何修改,而是使用LD_PRELOAD Linux 的能力 http://www.linuxjournal.com/article/7795拦截 BLAS 库调用并重定向(适当的)到 cublas 库。

一种更新、更好的方法(使用 NVBLAS 拦截库)在这篇博客文章 https://devblogs.nvidia.com/parallelforall/drop-in-acceleration-gnu-octave/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Octave 转换为使用 CuBLAS 的相关文章

  • 如何在 Visual Studio 2010 中设置 CUDA 编译器标志?

    经过坚持不懈的得到error identifier atomicAdd is undefined 我找到了编译的解决方案 arch sm 20旗帜 但是如何在 VS 2010 中传递这个编译器标志呢 我已经尝试过如下Project gt P
  • matlab中的分箱

    我一直无法在 matlab 或 Octave 中找到函数来完成我想要的操作 我有一个两列的矩阵 m x 和 y 值 我知道我可以通过执行 m 1 或 m 2 来提取列 我想将其分成 可能 大小相等的较小矩阵 并绘制这些矩阵的平均值 换句话说
  • 如何确定完整的 CUDA 版本 + 颠覆版本?

    Linux 上的 CUDA 发行版曾经有一个名为version txt例如 CUDA Version 10 2 89 这非常有用 但是 从 CUDA 11 1 开始 该文件不再存在 我如何在 Linux 上通过命令行确定并检查 path t
  • CUDA 常量内存是否应该被均匀地访问?

    我的 CUDA 应用程序的恒定内存小于 8KB 既然它都会被缓存 我是否需要担心每个线程访问相同的地址以进行优化 如果是 如何确保所有线程同时访问同一地址 既然它都会被缓存 我是否需要担心每个线程访问相同的地址以进行优化 是的 这缓存本身每
  • Yocto for Nvidia Jetson 由于 GCC 7 而失败 - 无法计算目标文件的后缀

    我正在尝试将 Yocto 与 meta tegra 一起使用 https github com madisongh meta tegra https github com madisongh meta tegra 为 Nvidia Jets
  • 如何在cmake中添加cuda源代码的定义

    我使用的是 Visual Studio 2013 Windows 10 CMake 3 5 1 一切都可以使用标准 C 正确编译 例如 CMakeLists txt project Test add definitions D WINDOW
  • cudaSetDevice() 对 CUDA 设备的上下文堆栈有何作用?

    假设我有一个与设备关联的活动 CUDA 上下文i 我现在打电话cudaSetDevice i 会发生什么 Nothing 主上下文取代了堆栈顶部 主上下文被压入堆栈 事实上 这似乎是不一致的 我编写了这个程序 在具有单个设备的机器上运行 i
  • TensorRT 多线程

    我正在尝试使用 python API 来使用 TensorRt 我试图在多个线程中使用它 其中 Cuda 上下文与所有线程一起使用 在单个线程中一切正常 我使用 docker 和 tensorrt 20 06 py3 图像 onnx 模型和
  • 作为动画的八度情节点

    我有以下八度脚本 TOTAL POINTS 100 figure 1 for i 1 TOTAL POINTS randX rand 1 randY rand 1 scatter randX randY hold on endfor 当我运
  • cudaMemcpy() 与 cudaMemcpyFromSymbol()

    我试图找出原因cudaMemcpyFromSymbol 存在 似乎 symbol func 可以做的所有事情 nonSymbol cmd 也可以做 symbol func 似乎可以轻松移动数组或索引的一部分 但这也可以使用 nonSymbo
  • 最小化 MC 模拟期间存储的 cuRAND 状态数量

    我目前正在 CUDA 中编写蒙特卡罗模拟 因此 我需要生成lots使用随机数cuRAND图书馆 每个线程处理一个巨大的元素floatarray 示例中省略 并在每次内核调用时生成 1 或 2 个随机数 通常的方法 参见下面的示例 似乎是为每
  • CUDA 中指令重放的其他原因

    这是我从 nvprof CUDA 5 5 获得的输出 Invocations Metric Name Metric Description Min Max Avg Device Tesla K40c 0 Kernel MyKernel do
  • 如何使用 GNU Octave 中的范围设置 x 或 y 轴的控制?

    x 的长度 1000 y 的长度 1000 plot x y xlabel p ylabel Q p title Custom plot set gca xtick 0 00000 0 20000 0 40000 0 60000 0 800
  • OS X 10.8 上的 PyCuda / 多处理问题

    我正在开发一个项目 将计算任务分配给多个 python 进程 每个进程都与其自己的 CUDA 设备关联 生成子进程时 我使用以下代码 import pycuda driver as cuda class ComputeServer obje
  • CUDA 5.0错误LNK2001:cuda方法无法解析的外部符号

    我的链接器有错误 1 gt ManifestResourceCompile 1 gt All outputs are up to date 1 gt kernel cu obj error LNK2001 unresolved extern
  • Matlab的uicontrol在Octave中的实现?

    我正在尝试在 Octave 中运行我们实验室中使用的图形程序的 m Matlab 代码 Octave 告诉我代码中使用的函数 uicontrol 没有定义 经过一番搜索 我发现 JHandles 包有一个 uicontrol GUI 功能的
  • 如何调整x轴和y轴的大小

    如何调整 x 轴和 y 轴的大小 我想要什么 更具体 3900 60 30 0 60 120 180 3600 我做了什么 a 0 0 1 10000 plot a 我应该写什么才能按预期调整 x 和 y 轴的大小 EDIT 我不想 390
  • GPU上动态分配内存

    是否可以在内核内的 GPU 全局内存上动态分配内存 我不知道我的答案有多大 因此我需要一种方法为答案的每个部分分配内存 CUDA 4 0 允许我们使用 RAM 这是一个好主意还是会降低速度 可以在内核中使用 malloc 检查以下内容 摘自
  • Cuda:最小二乘求解,速度较差

    最近 我使用Cuda编写了一个名为 正交匹配追踪 的算法 在我丑陋的 Cuda 代码中 整个迭代需要 60 秒 而 Eigen lib 只需 3 秒 在我的代码中 矩阵 A 是 640 1024 y 是 640 1 在每一步中 我从 A 中
  • 为什么 cudaGLSetGLDevice 失败,即使它是在 main 函数的第一行中调用的

    我想使用 OpenGL 和 CUDA 之间的互操作性 我知道 正如一些教程所说 第一步是选择设备 但是 当我在主函数的第一行中调用 cudaGLSetGLDevice 0 时 程序退出并显示信息 cudaSafeCall 运行时 API 错

随机推荐