- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试在linux下的matlab mex中使用cuda代码。使用“整个程序编译”模式,对我很有用。我在nsight内执行以下两个步骤:
(1)将“-fpic”作为编译器选项添加到每个.cpp或.cu文件中,然后分别编译它们,每个文件生成一个.o文件。
(2)将链接器命令设置为“mex”并添加“-cxx”,以指示所有.o输入文件的类型都是cpp文件,并添加cuda的库路径。还可以添加一个cpp文件,其中包含mexfunction条目作为附加输入。
该方法运行良好,生成的mex文件在matlab下运行良好。之后,当我需要使用动态并行时,我必须切换到nsight中的“单独编译模式”。我尝试了上面的相同操作,但是链接器产生了许多缺少引用的错误,我无法解决这些错误。
然后我检查了“单独编译”模式的编译和链接步骤。我被它在做什么弄糊涂了。nsight似乎为每个.cpp或.cu文件执行两个编译步骤,生成一个.o文件和一个.d文件。这样地:
/usr/local/cuda-5.5/bin/nvcc -O3 -gencode arch=compute_35,code=sm_35 -odir "src" -M -o "src/tn_matrix.d" "../src/tn_matrix.cu"
/usr/local/cuda-5.5/bin/nvcc --device-c -O3 -gencode arch=compute_35,code=compute_35 -gencode arch=compute_35,code=sm_35 -x cu -o "src/tn_matrix.o" "../src/tn_matrix.cu"
/usr/local/cuda-5.5/bin/nvcc --cudart static --relocatable-device-code=true -gencode arch=compute_35,code=compute_35 -gencode arch=compute_35,code=sm_35 -link -o "test7" ./src/cu_base.o ./src/exp_bp_wsj_dev_mex.o ./src/tn_main.o ./src/tn_matlab_helper.o ./src/tn_matrix.o ./src/tn_matrix_lib_dev.o ./src/tn_matrix_lib_host.o ./src/tn_model_wsj_dev.o ./src/tn_model_wsj_host.o ./src/tn_utility.o -lcudadevrt -lmx -lcusparse -lcurand -lcublas
nvcc -gencode arch=compute_35,code=sm_35 -Xcompiler '-fPIC' -dlink a.o b.o -o mex_dev.o -lcudadevrt
mex_dev.o
不应该存在,否则上述命令将失败。
最佳答案
好吧,我找到了解决办法。下面是在nsight中使用“单独编译模式”编译mex程序的完整步骤:
创建CUDA项目。
在项目级别中,更改以下项的生成选项:
在项目级“nvcc compiler”的编译器选项中打开-fPIC
。
将-dlink -Xcompiler '-fPIC'
添加到链接器“nvcc linker”的“专家设置”“命令行模式”
在“build artifact”->“artifact extension”中添加字母o
,因为在最后一步中,我们将通过-dlink
使输出成为一个.o
文件。
在“后期构建步骤”中添加mex -cxx -o path_to_mex_bin/mex_bin_filename ./*.o ./src/*.o -lcudadevrt
(添加其他必要的lib)
更新:在我的实际项目中,我将最后一步移到了Matlab中的一个.m文件中,因为否则,如果我在运行Mex程序时这样做,可能会导致Matlab崩溃。
对于需要用mex编译的文件,请为每个文件更改以下生成选项:
在工具链编辑器中将编译器更改为GCC C++ Compiler
。
返回GCC C++ Compiler
的编译器设置并将命令更改为mex
将命令行模式更改为${COMMAND} -c -outdir "src" ${INPUTS}
几个附加说明:
(1)必须向MEX编译器隐藏CUDA特定的详细信息(例如内核函数和对内核函数的调用)。所以它们应该放在.cu文件中,而不是放在头文件中。这里有一个技巧,可以将涉及cuda详细信息的模板放入.cu文件中。
在头文件(例如f.h
)中,只放置函数的声明,如下所示:
template<typename ValueType>
void func(ValueType x);
f.inc
的新文件,该文件保存定义
template<>
void func(ValueType x) {
// possible kernel launches which should be hidden from mex
}
f.cu
)中,您将
#define ValueType float
#include "f.inc"
#undef ValueType
#define ValueType double
#include "f.inc"
#undef ValueType
// Add other types you want.
mex.h
将改变某些系统功能的定义,例如
printf
。所以包含“mex.h”不应该出现在可能包含在CUDA源文件中的头文件中。
MATLAB_MEX_FILE
有选择地编译代码段。通过这种方式,可以将源代码文件编译成mex可执行文件或普通可执行文件,从而允许在nsight下不使用matlab进行调试。下面是在nsight下建立多个目标的技巧:
Building multiple binaries within one Eclipse project
关于matlab - 在单独的编译模式下将cuda代码进行mex链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14600405/
在 Matlab 中,您可以选择创建新的“示例”脚本文件以及脚本、函数、类等。创建它们时,它们会获得一个脚本图标。 它们与其他标准脚本文件的处理方式有何不同? 是否有关于这些示例脚本类型的预期用途的文
我正在运行一个不是我自己编写的大 m 文件,它依赖于某些子函数。我想知道是否在所有嵌套函数的任何地方都使用了特定函数(在我的例子中是函数 eig.m(计算特征值))。有没有快速的方法来做到这一点? 亲
Matlab中有一个函数叫 copulafit .我怎样才能看到这个函数背后的代码?许多 Python 的 numpy 和 scipy 函数在 Github 上很容易开源,但由于某种原因我在 Gith
我定义了一个抽象基类measurementHandler < handle它定义了所有继承类的接口(interface)。这个类的两个子类是a < measurementHandler和 b < me
假设有一个矩阵 A = 1 3 2 4 4 2 5 8 6 1 4 9 例如,我有一个 Vector 包含该矩阵每一列的“类”
我有一个在后台运行的 Matlab 脚本。随着计算的进行,它会不断弹出进度栏窗口。这很烦人。 问题是我没有自己写 Matlab 脚本,这是一段很长很复杂的代码,我不想搞砸。那么如何在不修改 Matla
有没有办法从一个 matlab 程序中检测计算机上正在运行多少个 matlab 进程? 我想要恰好有 n 个 matlab 进程在运行。如果我的数量太少,我想创建它们,如果数量太多,我想杀死一些。您当
我正在测试我们在 Matlab 中开发的一个独立应用程序,当时我注意到它的内存使用量(根据 Windows 任务管理器)达到了 16gb 以上的数倍峰值。我决定在编译版本后面的脚本上使用 profil
我面临着一个相当棘手的问题。在 Matlab 中,命令 S = char(1044) 将俄语字母 д 放入变量 S。但是 disp(S) 返回空白符号,尽管内容实际上是正确的: >> S = char
我在这行 MATLAB 代码中遇到内存不足错误: result = (A(1:xmax,1:ymax,1:zmax) .* B(2:xmax+1,2:ymax+1,2:zmax+1) +
我正在寻找一种在 MATLAB 中比较有限顺序数据与非确定性顺序的方法。基本上,我想要的是一个数组,但不对包含的元素强加顺序。如果我有对象 a = [x y z]; 和 b = [x z y]; 我希
我有一个由 1 和 0 组成的二维矩阵。 mat = [0 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 0 1]; 我需
我可以在 Matlab 中用一组 x,y 点绘制回归线。但是,如果我有一组点(如下图),假设我有四组点,我想为它们绘制四条回归线……我该怎么做?所有的点都保存在 x,y 中。没有办法将它们分开并将它们
我正在尝试使用以下代码在 MATLAB 中绘制圆锥体。但是,当 MATLAB 生成绘图时,曲面中有一个间隙,如下图所示。谁能建议关闭它的方法? clearvars; close all; clc; [
我有一个 map称为 res_Map,包含一组不同大小的数组。我想找到用于存储 res_Map 的总内存。 正如您在下面看到的,看起来 res_Map 几乎不占用内存,而 res_Map 中的各个元素
有没有办法在 MATLAB 中组合 2 个向量,这样: mat = zeros(length(C),length(S)); for j=1:length(C) mat(j,:)=C(j)*S;
已结束。此问题不符合 Stack Overflow guidelines 。它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答它。 关闭 5 年前
我正在尝试将MatLab中的t copula适配到我的数据,并且我的功能是: u = ksdensity(range_1, range_1,'function','cdf'); v = ksdens
大家好,我目前正在尝试使用论文“多尺度形态学图像简化”中的 SMMT 运算符 Dorini .由于没有订阅无法访问该页面,因此我将相关详细信息发布在这里: 请注意,我将相关文章的部分内容作为图片发布。
我在MATLAB中编写代码,需要使用一个名为modwt的函数,该函数同时存在于两个我同时使用的工具箱(Wavelet和WMTSA)中。问题在于,一个版本仅返回一个输出,而另一个版本则返回三个输出。我应
我是一名优秀的程序员,十分优秀!