今天花了一些时间将基于以上几种工具(cuda&arrayfire&matlab)的矩阵乘法的速度进行了测试比较,验证了一些想法吧。
首先是c(CPU)的乘法测试:写的有点繁琐,后面在cuda程序中进行了综合
C.matrix.cpp
void Matrix_print(double **a,long nl, long nh)
/*
矩阵的输出
*/
{
int i,j;
for(i=1;i<=nl;i++)
{
for(j=1;j<=nh;j++)
{
cout<<a[i][j]<<",";
}
cout<<endl;
}
}
double **Matrix(long nrl,long nrh,long ncl,long nch)
/*
分配一个矩阵 m[nrl..nrh][ncl..nch]
*/
{
long i,nrow=nrh-nrl+1,ncol=nch-ncl+1;
double **m;
m=(double **)malloc((size_t)((nrow)*sizeof(double *))); //分配row个行指计
if(!m) nrerror("allocation matrix row failure!");
m-=nrl;
m[nrl]=(double *)malloc((size_t)((nrow*ncol)*sizeof(double))); //分配row*col个内存空间
if(!m[nrl]) nrerror("allocation matrix col failure!");
m[nrl]-=ncl;
for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
return m;
}
void CMatrix_multiply(complex **a,int row1,int col1,complex **b,int row2,int col2,complex **c)
/*
复数矩阵乘法
c=a x b
*/
{
<span style="white-space:pre"> </span>int i,j,k;
<span style="white-space:pre"> </span>if(col1!=row2) nrerror("第一个矩阵的列数不等于第二个矩阵的行数,不能相乘!");
<span style="white-space:pre"> </span>for(i=1;i<=row1;i++)
<span style="white-space:pre"> </span>for(j=1;j<=col2;j++)
<span style="white-space:pre"> </span>{
c[i][j].real=0;
<span style="white-space:pre"> </span> c[i][j].imag=0;
for(k=1; k<=col1;k++)
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> c[i][j]=Cadd(c[i][j],Cmultiply(a[i][k],b[k][j]));
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span>}
}
</pre><pre code_snippet_id="1721460" snippet_file_name="blog_20160619_3_9040794" name="code" class="cpp">#include "stdio.h"
#include "stdlib.h"
#include<vector>
#include<time.h>
void main()
{
int const NN=8;
double **data1,**data2,**result;
data1=Matrix(1,NN,1,NN);
data2=Matrix(1,NN,1,NN);
result=Matrix(1,NN,1,NN);
for(int i=1;i<NN+1;i++)
{
for(int j=1;j<NN+1;j++)
{
data1[i][j]=rand()/(double)(RAND_MAX);
data2[i][j]=rand()/(double)(RAND_MAX);
}
}
//Matrix_print(data1,NN,NN);
//Mat