Category: Programming

  • Squeezing Memory out of Caffe

    No, I am not talking about thinking of the good old days with a cup of drink. Today we are talking about our recent release of a new feature in our modified version of deep learning toolbox, Caffe. https://github.com/yjxiong/caffe In this release, we have implemented the functionality usually referred to as “memory multiloading”. A Wiki…

  • MPI Broadcast

    One interesting answer I saw on Stack Overflow. Someone asked how he can receive the msg send by `MPI_Bcast`. The answer is This is a common source of confusion for people new to MPI. You don’t use MPI_Recv() to receive data sent by a broadcast; you use MPI_Bcast(). For MPI collective communications, everyone has to particpate; everyone has to call…

  • MEX文件,CUDA程序,以及用VS编译和用Nsight调试

    写了一个简介,在   http://personal.ie.cuhk.edu.hk/~xy012/others/cuda_mex_vs.html

  • 使用MATLAB的Mex文件以及OPENMP加速

    Why MEX 由于matlab的迭代器不太给力,Mathworks建议大家尽量将程序向量化。但是我们有时候需要使用for 循环,这时可以自己编写c代码再编译成mex文件。这样就可以在matlab中调用。同时以后的c模块也可以通过编写mex文件来与matlab交互。 Hello world! 下面是一段简单的c代码,可以把它保存为helloworld.c, 然后在matlab执行 mex helloworld.c 编译。然后运行 helloworld() //You can include any C libraries that you normally use #include “math.h” #include “mex.h” //–This one is required void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { //All code and internal function calls go in here! printf(“Hello world!\n”); return; }  …

  • Windows从当前位置打开Cmd.exe

    很多时候,我们只能依赖于命令行来执行一些操作。通常我们会用文件浏览器定位要执行操作的路径。这时我们可以用下面的操作直接在当前路径打开cmd。

  • 设置VS2010使用x64平台

    在VS中,要使用64位compiler编译程序,需要设置一下。下面是在StackOverflow上找到的一般步骤。 注意,64位编译器在Express版本的VS中是没有的。但是可以安装windows sdk来间接获取。 设置步骤如下: Project Properties-> Configuration Manager 在列表中找到project的名字,在platform 下拉菜单中,只能看到win32。 点击下拉箭头,选择<new> 在弹出的对话中,上面有个New Platform的下拉菜单,选择x64,一路OK保存,设置完成。 如果project的dependency有64位版本,注意修改 使用这种方式,成功编译启动CULA 64位API程序

  • 在使用Job Scheduler的机群(Cluster)系统上安装PETSC和SLEPC

    最近在学习使用超算,主要用来做SVD相关的计算,需要用到SLEPC库,这个库依赖于PETSC库。在深圳的曙光6000上没有装这两个库,所以自己摸索着装了一下,下面是具体步骤。实验环境为曙光6000超算系统,OpenMPI-1.4,intel MKL, intel 64 架构 1 源代码(source) PETSC SLEPC 下载最新版即可 2 PETSC安装 通常情况下PETSC安装分为两步,即configure和make。但是对于使用job scheduler的cluster来说,configure的步骤要复杂一些。下面一一介绍 A. Configure步骤 下载代码之后用tar命令解包,然后进入包含源代码的路径,使用chmod命令将config目录下所有文件赋予X权限,我们假设为 /LIB/PATH,运行以下bash命令 export PETSC_DIR=/LIB/PATH ./configure –with-batch –with-cc=mpicc –with-cxx=mpicxx –with-fc=mpif90 –with-blas-lapack-dir=”intel mkl path” –with-mpi-include=”mpi include path” –with-mpi-lib=”mpi lib path” –known-mpi-shared-libraries=0 其中configure参数要注意的主要是几个依赖库的位置,这里intemkl包含了lapack和blas,mpi则视系统安装版本。特别注意的是好像系统不能自动发现mpi的安装位置,需要专门指出。此外,–with-batch指明我们使用的是batch类系统,需要额外操作来完成设置。 然后,若configure运行完成会生成一个二进制文件名字叫conftest-***|||的,这就是job scheduler系统和一般工作站的区别,这是我们需要向系统提交一个单核的job来运行这个二进制文件。在曙光6000上,job描述如下: APP_NAME=”intelg_small” NP=1 RUN=$PETSC_DIR+”/conftest-arch-linux2-c-debug” 运行完以后会在路径下生成一个reconfigure-***|||.py的文件,运行之,就可以完成configure了。 B. Make步骤 Make的步骤相对简单,设置好$PETSC_DIR和$PETSC_ARCH变量,运行 make all 就可以了。这样就完成PETSC的安装。需要注意的是,安装完成后的test工作也要写成job的形式提交。 3 SLEPC安装 装好PETSC之后,SLEPC安装就快多了,一样的下载代码解压后进入路径,使用chmod命令将config目录下所有文件赋予X权限。设置好$PETSC_DIR和$PETSC_ARCH 变量之后,运行 ./configure 然后按提示运行 make…

  • MATLAB求最大的k个元素

    在matlab的内置函数中已经给出了sort和min,max的实现,都是比较高效的。但是我们常常遇到这种情况,就是要在一个矩阵或者是向量中取出最大的前k个元素,k一般相比元素的总数量要小很多。 这个时候,一般最朴素的做法是先用sort排序,然后取前n个,这样得到的时间复杂度为O(n*log(n))。假设向量有n个元素。 或者当k远远小于n时,可以考虑重复调用max或min,这时的复杂度为O(k*n)。 Bruno Luong 给出了一个用部分快速排序实现的算法,复杂度为O(n+k*log(k)),比上面的解决方法更加优雅和有效。 这个算法的mex实现可以在MatlabCentral上免费下载 Min/Max Selection mex实现 常常有面试题要求O(n)时间内求第k大的元素,可以参考这个算法的思路。

  • MATLAB读取INI文件

    编程可能会有一些设置参数,这时需要读取ini文件。这个文件可以帮助我们做ini文件的读取 MATLAB File Exchange 链接 一个m文件,包含函数 fetchIniData(file,varargin) 可以把ini文件读取为树状的结构体。具体请看help

  • 为Dialog窗口的菜单添加加速键

    首先,我们先了解一下什么是加速键?我们随便打开一个程序(如记事本),点击“文件(F)”获得其子菜单,我们会看见诸如“保存(S) Ctrl+S”的菜单项,没错“Ctrl+S”就是加速键,我们只要按下“Ctrl+S”键,文件就可以快速保存了。嗯,有点废话了,大家都知道的。 那么,接下来我们就为 VC++ 的 Dialog 程序的菜单添加加速键吧。因为在 VC++ 中加速键和菜单是分离的,不像在 VB 里直接在菜单编辑器里直接选择快捷键的下拉菜单,或者是在 Delphi 里的菜单控件里选择 ShortCut 属性的值那么简单了。如果是选择 MFC 里的单文档或者多文档的话,加速键是自动生成的,而如果是选择 Dialog 的话,就只能自己动手了。 首先,自然是为 Dialog 窗口添加一个菜单了: 注意菜单的标明要为“新建(&N)tCtrl+N”,t 一定要加,这样可以保证加速键的提示对齐。最后在 Dialog 的属性框里把菜单加入。不过这样只是有了加速键的提示而没有加速键的功能,下面我们就来完善加速键的功能。 在资源列表里插入名为 Accelerator 的新资源.怎么样,简单吧,不过这样还是没有把加速键加入我们的菜单,不信我们可以为菜单添加事件来测试。为每个菜单都添加点击后跳出一个对话框的事件,如: void CMy2Dlg::OnMenuNew() { // TODO: Add your command handler code here MessageBox(“新建了一个文件!”); } 运行,点击菜单会跳出对话框,但是按下“Ctrl+N”键后无效果。下面是关键了,为 C*Dlg 类(*为你的程序名)添加一个成员变量: 然后在 OnInitDialog 函数里载入加速键列表: //载入加速键表。 m_hAccel=::LoadAccelerators(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1)); IDR_ACCELERATOR1 为加速键的资源名称。最后,重载 PreTranslateMessage 函数,使加速键可用。 //重载…