cudaMalloc无法分配显存

同时cudaMemcpy也无法在主机和显存之间进行数据拷贝。不知什么原因?

float* dev_a;
cutilSafeCall(cudaMalloc((void**)&dev_a, sizeof(float)DATA_SIZEDATA_SIZE));
执行到此会直接退出

问题解决了,是我的显卡不支持cuda。现在的问题是cutilSafeCall(cudaMemcpy(c,dev_c,sizeof(float)DATA_SIZEDATA_SIZE,cudaMemcpyDeviceToHost));
无法从显存中拷贝出数据

你把你的代码贴的多一点,或者你去掉cutilSafeCall();试试。

从主机向显存拷贝成功就是拷贝回来是不行我装的是4.0是不是哪里设置不对了。
rules选cuda runtime API还是cuda build rule v3.0.0,两个有什么区别。例子程序里选的是前者赵开勇的wizard利用的是后者

这是我的博客,配置部分可能对你有帮助:aban-mtd-CSDN博客

unsigned int timer = 0;
cutilCheckError( cutCreateTimer( &timer));
cutilCheckError( cutStartTimer( timer));
float*a;
float*b;
float*c;
a=new float[DATA_SIZE*DATA_SIZE];
b=new float[DATA_SIZE*DATA_SIZE];
c=new float[DATA_SIZE*DATA_SIZE];
for(int j=0;j<DATA_SIZE;j++)
{
	for(int i=0;i<DATA_SIZE;i++)
	{
		a[i+j*DATA_SIZE]=b[i+j*DATA_SIZE]=float(1.0);


	}
}
memset(c,0,sizeof(float)*DATA_SIZE*DATA_SIZE);
for(int j=0;j<DATA_SIZE;j++)
{
	for(int i=0;i<DATA_SIZE;i++)
	{
		for(int k=0;k<DATA_SIZE;k++)
		{
			c[i+j*DATA_SIZE]+=a[k+j*DATA_SIZE]*b[i+k*DATA_SIZE];
		}

	}
}
cutilCheckError( cutStopTimer( timer));
CString str;
str.Format(_T("Processing time:%f(ms)"),cutGetTimerValue( timer));
MessageBox(str);
cutilCheckError( cutDeleteTimer( timer));
FILE* cf;
cf=fopen("1.txt","w+");
for(int j=0;j<DATA_SIZE;j++)
{
	for(int i=0;i<DATA_SIZE;i++)
	{
		fprintf(cf,"%f  ",c[i+j*DATA_SIZE]);

	}
	fprintf(cf,"\n");

}
fclose(cf);
delete[]a;
delete[]b;
delete[]c;

OnOK();

[

错了,这个才是
unsigned int timer = 0;
cutilCheckError( cutCreateTimer( &timer));
cutilCheckError( cutStartTimer( timer));
floata;
float
b;
floatc;
a=new float[DATA_SIZE
DATA_SIZE];
b=new float[DATA_SIZEDATA_SIZE];
c=new float[DATA_SIZE
DATA_SIZE];
for(int j=0;j<DATA_SIZE;j++)
{
for(int i=0;i<DATA_SIZE;i++)
{
// a[i+j*DATA_SIZE]=b[i+j*DATA_SIZE]=float(rand()%10);
a[i+j*DATA_SIZE]=b[i+j*DATA_SIZE]=float(1.0);

}
}
float* dev_a;
float* dev_b;
float* dev_c;

cutilSafeCall(cudaMalloc((void**)&dev_a, sizeof(float)DATA_SIZEDATA_SIZE));
cudaMalloc((void**)&dev_b, sizeof(float)DATA_SIZEDATA_SIZE);
cudaMalloc((void**)&dev_c, sizeof(float)DATA_SIZEDATA_SIZE);
cudaMemcpy(dev_a,a,sizeof(float)DATA_SIZEDATA_SIZE,cudaMemcpyHostToDevice);
cudaMemcpy(dev_b,b,sizeof(float)DATA_SIZEDATA_SIZE,cudaMemcpyHostToDevice);
Sum(dev_a,dev_b,dev_c);
cutilSafeCall(cudaMemcpy(c,dev_c,sizeof(float)DATA_SIZEDATA_SIZE,cudaMemcpyDeviceToHost));
cudaFree(dev_a);
cudaFree(dev_b);
cudaFree(dev_c);
cutilCheckError( cutStopTimer( timer));
CString str;
str.Format(_T(“Processing time:%f(ms)”),cutGetTimerValue( timer));
MessageBox(str);
cutilCheckError( cutDeleteTimer( timer));
FILE* cf;
cf=fopen(“2.txt”,“w+”);
for(int j=0;j<DATA_SIZE;j++)
{
for(int i=0;i<DATA_SIZE;i++)
{
fprintf(cf,"%f ",c[i+j*DATA_SIZE]);

}
fprintf(cf,“\n”);

}
fclose(cf);
deletea;
deleteb;
deletec;

//下面是sum函数
#include “CUDA_Guest.cu”
extern “C”
void Sum(float *Ad, float Bd, floatCd)
{
dim3 dimGrid((DATA_SIZE+BLOCK_SIZE-1)/ BLOCK_SIZE, (DATA_SIZE+BLOCK_SIZE-1)/ BLOCK_SIZE);
dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE);
Kernel<<<dimGrid,dimBlock>>>(Ad,Bd,Cd);
}

//下面是kerne函数

#include <cutil_inline.h>
#define BLOCK_SIZE 16
#define DATA_SIZE 512
global void Kernel(float Ad, float Bd, floatCd)
{
int bx=blockIdx.x;
int by=blockIdx.y;
int tx=threadIdx.x;
int ty=threadIdx.y;
int aBegin=DATA_SIZE
BLOCK_SIZEby;
int aEnd=aBegin+DATA_SIZE-1;
int bBegin=BLOCK_SIZE
bx;
float sub=0;
for(int a=aBegin,b=bBegin;a<=aEnd;a+=BLOCK_SIZE,b+=BLOCK_SIZEDATA_SIZE)
{
shared float A[BLOCK_SIZE][BLOCK_SIZE];
shared float B[BLOCK_SIZE][BLOCK_SIZE];
A[tx][ty]=Ad[a+DATA_SIZE
ty+tx];
B[tx][ty]=Bd[b+DATA_SIZE*ty+tx];
__syncthreads();
for(int k=0;k<BLOCK_SIZE;k++)
{
sub+=A[k][ty]B[tx][k];
}
__syncthreads();
}
int c=DATA_SIZE
BLOCK_SIZEbyBLOCK_SIZEbx;
Cd[c+DATA_SIZE
ty+tx]=sub;
}

//就是矩阵相乘

你家断点试试。我光看看不出来。。呀,这个太费眼了,我觉得,调试完全靠运气,要是你的环境是正确的话。

[

就是设断点到这句就会直接退出,其实kernel应该没什么,主要是无法从显存向主机拷贝数据

:(这种问题真没遇到过呀。呵呵,帮不上忙。。

无法拷贝时,通常的问题是,显存调用有问题,你可以看看程序是不是哪里可能越界。