Sorry, this entry is only available in 中文.
(中文) Larrabee的新马甲
June 3rd, 2010 by annkok,78 viewsamd-release-stream-sdk2.1
May 3rd, 2010 by annkok,138 viewsSorry, this entry is only available in 中文.
cuda Array copy
May 3rd, 2010 by wy,113 viewsSorry, this entry is only available in 中文.
Matlab With CUDA(4)
April 7th, 2010 by wy,290 views第三节中我们介绍了NVIDIA的工程师写的编译脚本,但是这个脚本配置起来麻烦,用的时候选项也过于复杂。后来随着GPGPU的发展,CUDA逐渐被重视,因此MathWorks的工程师们重新写了这个nvmex脚本。毕竟是科班出身,新的脚本配置容易,使用简单。详细情况可访问其网站。在上述网站中,可找到下载nvmex源码的链接。下载后解压,得到nvmex.m。对其中的两个选项(红色部分按实际路径修改)稍加编辑,即可使用:
CUDA_LIB_Location = ‘C:\CUDA\lib’;
Host_Compiler_Location = ‘-ccbin "C:\Program Files\Microsoft Visual Studio 8\VC\bin"‘;
修改之后,将其复制到addMatrix.cu相同目录,并将此目录设置为matlab运行目录,在命令窗口输入:
>> nvmex(‘addMatrix.cu’);
即可完成编译。编译成功后,在matlab中即可像常规函数一样使用addMatrix函数。
Matlab With CUDA(3)
April 7th, 2010 by wy,312 views根据第二节的介绍,matlab中可以通过mex文件的方式编译C/C++代码,但是对于.cu文件则无能为力。为了解决这个问题,NV的工程师们开发了用于编译cu文件的脚本,下面进行详细介绍。
测试环境:vs2005,matlab 7.6(r2008a),cuda 2.3
首先在NV的网站http://developer.nvidia.com/object/matlab_cuda.html下载matlab的插件包,并解压,共有4个重要文件:
nvmex.m
nvmex_helper.m
nvmexopts.bat
.\bin\nvmex.pl
首先将nvmex.pl拷贝到matlab的安装目录中的bin目录下,例如笔者的系统中就拷贝到C:\MATLAB\bin中。
下面编写cu文件,我们仍以两个矩阵相加为例,具体流程见代码注释。从代码中可看到,同时使用了matlab函数和cuda函数,并在GPU中完成了两个矩阵相加。完成addMatrix.cu的编写后,需要对其进行编译。
首先将nvmex.m,nvmex_helper.m,nvmexopts.bat拷贝到addMatrix.cu文件所在目录,并设置为matlab的当前目录。
1、在matlab命令窗口中运行: nvmex -setup,选择编译器,此处选择vs2005。
2、编辑nvmexopts.bat,修改其中的VSINSTALLDIR选项,指定为vs2005的安装目录,如笔者的系统中:C:\Program Files\Microsoft Visual Studio 8
3、编译命令:
nvmex -f nvmexopts.bat addMatrix.cu -IC:\cuda\include -LC:\cuda\lib –lcudart
编译成功后,在matlab中即可像常规函数一样使用addMatrix函数。
可能会遇到的问题:
1、目录设置:需要仔细按照上述步骤设置好相关目录
2、编译时出现未定义的变量及结构,如_wchar等,则可更新nvmex.pl和nvmexopts.bat来解决。下载链接
/********************************************************************
filename: addMatrix.cu
file ext: cu
author: wy@gpgpu.org.cn
purpose: test matlab with cuda by nvidia’s nvmex
*********************************************************************/
#include "mex.h"
#include "cuda.h"
/* Kernel*/
__global__ void addMatrix(float* pfC, float* pfA, float* pfB, int M, int N)
{
int x = blockIdx.x*blockDim.x + threadIdx.x;
int y = blockIdx.y*blockDim.y + threadIdx.y;
if (x >= M ||
y >= N)
{
return;
}
int index = y*M + x;
pfC[index] = pfA[index] + pfB[index];
}
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
int i, mA, nA, mB, nB;
double *A, *B, *C;
/* 输入变量检查 */
if (nrhs != 2)
mexErrMsgTxt("输入参数必须为2个");
if (nlhs != 1)
mexErrMsgTxt("输出参数必须为1个");
mA = mxGetM(prhs[0]);
nA = mxGetN(prhs[0]);
mB = mxGetM(prhs[1]);
nB = mxGetN(prhs[1]);
if (mA != mB ||
nA != nB)
mexErrMsgTxt("输入矩阵尺寸必须相同");
/*为输出结果分配内存*/
plhs[0]=mxCreateDoubleMatrix(mA,nA,mxREAL);
/*获取数据指针*/
A = mxGetPr(prhs[0]);
B = mxGetPr(prhs[1]);
C = mxGetPr(plhs[0]);
float* d_pfA = NULL;
float* d_pfB = NULL;
float* d_pfC = NULL;
/* 在GPU中分配显存 */
cudaMalloc( (void **) &d_pfA,sizeof(float)*mA*nA);
cudaMalloc( (void **) &d_pfB,sizeof(float)*mA*mA);
cudaMalloc( (void **) &d_pfC,sizeof(float)*mA*mA);
/*创建一个单精度float缓存区*/
float* pfSwap = (float *) mxMalloc(sizeof(float)*mA*nA);
/* 检查输入矩阵A的精度,并假设A, B, C精度相同*/
mxClassID category = mxGetClassID(prhs[0]);
if (category == mxSINGLE_CLASS)
{
cudaMemcpy(d_pfA, A, sizeof(float)*mA*nA, cudaMemcpyHostToDevice);
cudaMemcpy(d_pfB, B, sizeof(float)*mA*nA, cudaMemcpyHostToDevice);
}
else if (category == mxDOUBLE_CLASS)
{
for (i=0; i < mA*nA; i++)
{
pfSwap[i] = (float) A[i];
}
cudaMemcpy(d_pfA, pfSwap, sizeof(float)*mA*nA, cudaMemcpyHostToDevice);
for (i=0; i < mA*nA; i++)
{
pfSwap[i] = (float) B[i];
}
cudaMemcpy(d_pfB, pfSwap, sizeof(float)*mA*nA, cudaMemcpyHostToDevice);
}
/*此处也可以将块的配置作为参数传入*/
dim3 db,dg;
db.x = 128;
db.y = 4;
dg.x = mA/db.x;
dg.y = mB/db.y;
if (mA % db.x > 0)
dg.x += 1;
if (nA % db.y > 0)
dg.y += 1;
/*调用Kernel函数*/
addMatrix<<<dg, db>>>(d_pfC, d_pfA, d_pfB, mA, nA);
/*将计算结果拷贝到临时分配的内存中*/
cudaMemcpy(pfSwap, d_pfC, sizeof(float)*mA*nA, cudaMemcpyDeviceToHost);
/*将计算结果赋值给matlab缓存中*/
for (i=0; i < mA*nA; i++)
{
C[i] = (double)pfSwap[i];
}
mxFree(pfSwap);
cudaFree(d_pfA);
cudaFree(d_pfB);
cudaFree(d_pfC);
return;
}
OpenCL Studio 1.0 beta released
April 7th, 2010 by wy,147 viewsGeist Software Labs has released the first version of OpenCL Studio for beta testing. OpenCL Studio combines OpenCL and OpenGL into a single integrated development environment that allows you to visualize OpenCL computation using powerful 3D rendering techniques. The editor hides much of the complexity of the underlying APIs while still providing flexibility via the Lua scripting language. Integrated source code editors and debugging capabilities for OpenCL, GLSL, and Lua, as well as a toolbox of 2D user interface widgets provide a framework for a wide range of parallel programming solutions.
From: http://gpgpu.org/
CUDA 3.0 Release
March 20th, 2010 by annkok,308 viewsNew API Features
————————–
o Float16 (half) textures are supported in the runtime
- cudaCreateChannelDescHalf family of functions supports it in C++ style
API or proper channel could be crated via cudaCreateChannelDesc in C
style level API
- users should be aware that halves are promoted to floats during
computation and therefore, only floats could be fetched by texture
fetch functions
- users could use intrinsics in device code to convert between fp16 and
fp32 data
Read the rest of this entry »
Matlab With CUDA(2)
February 22nd, 2010 by wy,591 views背景知识:Matlab下通过Mex文件编写C程序
1、MEX规则
Matlab提供了MEX文件的方式来支持C/C++代码编写的算法。mex文件需要满足如下要求:
(1) 包含mex.h头文件
(2) 函数名称、参数返回值必须为如下形式:
void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]);
其中:
nlhs 为输出数组个数(Left Hand Side)
plhs 为指向输出数组的指针
nrhs 为输入数组个数(Right Hand Side)
prhs 为指向输入数组的指针,且输入数组只读。
以上四个变量,是在C/C++代码中唯一可用到的变量。实际上,由于matlab中所有的变量都是mxArray结构(向量,数组,字符串。。。),因此常见的数据类型均可放入mxArray传递给程序进行处理。
(3)常用mex函数:
a. mex函数定义在mex.h(./extern/include)中,并以mex为前缀,例如打印输出的mexPrintf()函数、在mex文件中调用matlab函数的mexCallMATLAB()函数等。
b. 在matrix.h(./extern/include)中定义了mxArray结构以及对矩阵操作的函数,如创建双精度矩阵的mxCreateDoubleMatrix()、从mxArray中获取数据指针mxGetPr()等。
(4)编译
首先可以通过mex -setup来选择编译器,前提是系统中已经安装了c/c++的编译器,如vc,gcc等。
其他命令可查看matlab中的帮助文档。
>> help mex
2、MEX例程
在本教程中,举例实现将两个矩阵相加(C = A + B)。
/******************************************************************** filename: addMatrix.c file ext: c author: wy@gpgpu.org.cn purpose: test matlab with c *********************************************************************/ #include "mex.h" void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]) { int i, j, mA, nA, mB, nB, nMatSize; double *A, *B, *C; /* 输入变量检查 */ if (nrhs != 2) mexErrMsgTxt("输入参数必须为2个"); if (nlhs != 1) mexErrMsgTxt("输出参数必须为1个"); mA = mxGetM(prhs[0]); nA = mxGetN(prhs[0]); mB = mxGetM(prhs[1]); nB = mxGetN(prhs[1]); if (mA != mB || nA != nB) mexErrMsgTxt("输入矩阵尺寸必须相同"); /*为输出结果分配内存*/ plhs[0]=mxCreateDoubleMatrix(mA,nA,mxREAL); /*获取数据指针*/ A = mxGetPr(prhs[0]); B = mxGetPr(prhs[1]); C = mxGetPr(plhs[0]); /*求和计算*/ nMatSize = mA * nA; for (i=0; i<nMatSize; i++) { C[i] = A[i] + B[i]; } /*输出信息*/ mexPrintf("求和完毕"); }
编译c文件:
mex -v addMatrix.c
编译成功后,在matlab中即可像常规函数一样使用addMatrix函数。
a = rand(2,2)
a =
0.93547 0.41027
0.9169 0.89365
b = rand(2,2)
b =
0.057891 0.81317
0.35287 0.0098613
c = addMatrix(a,b)
求和完毕
c =
0.99336 1.2234
1.2698 0.90351
在下一节中,我们将介绍如何使用mex文件编写cuda程序
Matlab With CUDA(1)
February 4th, 2010 by wy,499 views引言
Matlab作为科学计算中的重要工具,它提供了丰富的基本函数和工具箱,从而在各个领域得到了广泛的应用。但Matlab的缺点是代码效率较低,在工程应用中只能作为模型验证,而不能得到实际应用。而CUDA作为显卡编程比较成熟的语言,能够充分利用GPU的计算能力,提高执行效率。因此如何能将CUDA的高效与matlab的简便有机的结合是本文要解决的问题,根据解决问题的方式我们将分为两节进行讲解。
