#include <stdio.h>
#include <cuda_runtime.h>
int LoadPatterns(char fname,int M)
{
errno_t err;
int i,j,x;
FILE* InFilePtr;
if(fopen(“D:\Amatrix.txt”,“r”))
{
printf(“can not open\n”);
}
InFilePtr=fopen(“D:\Amatrix.txt”,“r”);
for (i=0; i<20482048; i++) { // For each vector
fscanf(InFilePtr,“%d”,&x); // consisting of all elements
M[i] = x;
}
fclose(InFilePtr);
return 1;
}
int main()
{
int a=0;
int* b=0;
int pass=1;
cudaMallocHost((void**)&a,20482048sizeof(int));
cudaMallocHost((void**)&b,sizeof(int));
if(LoadPatterns(“D:\Cmatrix.txt”,a)!=SUCCESS)
{
printf(“A matrix is error\n”);
system(“pause”);
exit(0);
}
}
我的编程环境是VS2010,为什么每次都卡在M[i]=x这里,不能进行赋值,报错reduction.exe 中的 0x0031623a 处最可能的异常: 0xC0000005: 写入位置 0x00000000 时发生访问冲突
reduction.exe 中的 0x0031623a 处有未经处理的异常: 0xC0000005: 写入位置 0x00000000 时发生访问冲突;但是在VS2012的环境下就可以通过,求教各位大牛!
host端提示无效指针(您这里是使用了NULL指针),您需要解决是为何您的指针是NULL.
回到您的问题,如果您在运行的时候提示Access Violation,并自动中断到调试器的话,
请您查看当前出错的行(您说了是M[i] = x;), 看看当前的指针M是否有效,如果发现无效,您需要一步一步的回溯,看看它为何无效(例如,是否分配的时候失败?)
我建议您#include <assert.h>,同时在每次分配完毕的时候总是assert指针不是NULL, 这样可以在调试状态立刻发现某步分配失败。而此assert()调用将在Release的时候自动去除。
这是您在没有自己引入自己的分配结果检查的时候,最方便的形式了。
请考虑手工回溯或者加入assert检查。
谢谢。
老是停在M的赋值语句这里,说是 CXX0030: 错误: 无法计算表达式的值
,我也不知道是怎么回事!回溯回去我还是看不出来原因,不过谢了!
我刚才说的很清楚,
既然提示你Access Violation, 不能写入地址0x00000000, 同时break在您的m行处。
您直接观察下您的m的值。(debug->windows->immediate, 在立即窗口里输入M,然后按下您键盘上的M键)。
如果感到为难,请尝试建议2.
(在每次的内存分配返回的指针,都加上assert进行检查,这将会让你在debug配置下尽快中断到调试器,及早发现问题)