求高手看看我这个矢量加法有什么问题。

我是新手,刚开始学习。现在学着编写了一个矢量加法,不知道为什么当N大于80000就出错了。但是我在matlab平台下用cuda尝试80000个元素的矩阵相加是可以。我的显存有1G,应该是够的吧。

求高手指导一下

我用的是VS2010,CUDA 5.5.

#include “cuda_runtime.h”
#include “device_launch_parameters.h”
#include
using namespace std;
#define N 10000
global void add( int *a, int b, int c)
{
int tid=threadIdx.x+blockIdx.x
blockDim.x;
while (tid<N)
{
c[tid]=b[tid]+a[tid];
tid+=blockDim.x
gridDim.x;
}
}
int test( int *a, int *b, int *c)
{
for(int i=0;i<N;i++)
{
if (a[i]+b[i]!=c[i])
return 0;

}
return 1;
}
int main(void)
{
int i=0;
int a[N],b[N],c[N];
int dev_a,dev_b,dev_c;
for(i=0;i<N;i++)
{
a[i]=i,b[i]=i
i;
}
cudaMalloc((void
)&dev_a,Nsizeof(int));
cudaMalloc((void**)&dev_c,N
sizeof(int));
cudaMalloc((void**)&dev_b,N*sizeof(int));

cudaMemcpy(dev_a,a,Nsizeof(int),cudaMemcpyHostToDevice);
cudaMemcpy(dev_b,b,N
sizeof(int),cudaMemcpyHostToDevice);

add<<<128,128>>>(dev_a,dev_b,dev_c);

cudaMemcpy(c,dev_c,N*sizeof(int),cudaMemcpyDeviceToHost);

cudaFree(dev_a);
cudaFree(dev_b);
cudaFree(dev_c);

if (test(a,b,c))
cout<<“successful”<<endl;
else
cout<<“failed”<<endl;

system(“pause”);
return 0;
}

大于8W的时候你把int a[N]等相应换成 int *a = new int[N]试试

。。。。。无语中。。。

你默认的host thread只有1MB的stack,谁让你分配这么大的数组了?还分配了三个!

请改用堆分配(malloc之类),以及2#的建议也很不错。

以及,此问题实际上和CUDA无关(这个是host code的问题),但考虑到今天天气挺冷,就不移动到灌水专区了。

感谢来访。

看来我的c语言还是学的不够好啊。以前编的都是些书上的题目,小程序,没有多练习。看来还要学的还有很多啊。感谢版主的指导。