矩阵乘法出错,,算小的矩阵正确,,大的出错,,

算512512 的矩阵时正确,,但算10241024就不正确了,,,为什么呢?代码如下::

#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
#include
#include <windows.h>
using namespace std;

#define N 1024
float a[N][N],b[N][N],c[N][N],d[N][N];
global void matMul(float *A, float *B,float *C,int n )//cuda内核运算
{

int row=blockIdx.x16+threadIdx.x;
int col=blockIdx.y
16+threadIdx.y;
float reslut=0;
for(int f=0;f<n;f++)
reslut+=A[rown+f]B[col+fn];
C[row
n+col]=reslut;
}
void mul(float *A,float *B,float C)//GPU计算矩阵乘法 C=AB
{

int size;
size =N N * sizeof(float);
float
Ad;
cudaMalloc((void**)&Ad, size); //在cuda中为A矩阵分配内存
cudaMemcpy(Ad, A, size, cudaMemcpyHostToDevice);//将A矩阵拷贝到cuda中
float* Bd;
cudaMalloc((void**)&Bd, size);//在cuda中为B矩阵分配内存
cudaMemcpy(Bd, B, size, cudaMemcpyHostToDevice);//在cuda中为B矩阵分配内存
float* cd;
cudaMalloc((void**)&cd, size);//在cuda中为C矩阵分配内存

dim3 dimBlock(16, 16);
dim3 dimGrid(N / dimBlock.x, N / dimBlock.y);
matMul<<<dimGrid, dimBlock>>>(Ad, Bd, cd,N);
cudaMemcpy(C, cd, size, cudaMemcpyDeviceToHost);//将cuda中的C矩阵拷贝回cpu内存中

cudaFree(cd);
cudaFree(Ad);
cudaFree(Bd);

}
void Test(float A[N][N],float B[N][N],float C[N][N])//CPU计算矩阵乘法 C=A*B
{
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
{
C[i][j]=0;
for(int f=0;f<N;f++)
C[i][j]+=A[i][f]*B[f][j];
}
}
void compare(float A[N][N],float B[N][N])
{
float maxerror=0;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
{
if(A[i][j]-B[i][j]>maxerror)
maxerror=A[i][j]-B[i][j];
if(B[i][j]-A[i][j]>maxerror)
maxerror=B[i][j]-A[i][j];
}
cout<<“最大误差是:”<<maxerror<<endl;
}
int main()
{

for(int i=0;i<N;i++) //初始化矩阵
for(int j=0;j<N;j++)
{a[i][j]=rand()%13;
b[i][j]=rand()%6;
c[i][j]=0;
d[i][j]=0;
}

for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
cout<<c[i][j];
LARGE_INTEGER BegainTime ;
LARGE_INTEGER EndTime ;
LARGE_INTEGER Frequency ;
QueryPerformanceFrequency(&Frequency);
QueryPerformanceCounter(&BegainTime) ;
mul(*a,*b,*c);

QueryPerformanceCounter(&EndTime);
double timegpu=(double)( EndTime.QuadPart - BegainTime.QuadPart )/ Frequency.QuadPart;

cout << “GPU运行时间(单位:s):” << timegpu<<endl;
//for(int i=0;i<N;i++)
// for(int j=0;j<N;j++)
//cout<<c[i][j];
LARGE_INTEGER BegainTime1;
LARGE_INTEGER EndTime1;
LARGE_INTEGER Frequency1;
QueryPerformanceFrequency(&Frequency1);
QueryPerformanceCounter(&BegainTime1) ;
Test(a,b,d);

QueryPerformanceCounter(&EndTime1);
double timecpu=(double)( EndTime1.QuadPart - BegainTime1.QuadPart )/ Frequency1.QuadPart;
cout << “cpu运行时间(单位:s):” <<timecpu <<endl;

compare(c,d);
cout<<“加速比:”<<timecpu/timegpu<<endl;
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
cout<<c[i][j];
system(“pause”) ;
return 0 ;
}

跟你的GPU block中能分配的最大线程数有关

把a,b,c,d改为用malloc动态分配试试。

学习中。。。。。。。。。

应该是越界判断的问题吧

加个越界判断,就可以计算很大的了。