cudamemcpy使用有什么错误?

//分配tick的空间
tick * tick_list_today_dev, * tick_list_today_host;
cudaHostAlloc(&tick_list_today_host,_data_full_lengthsizeof(tick),cudaHostAllocMapped);//分配页锁定内存
cudaHostGetDevicePointer(&tick_list_today_dev,tick_list_today_host,0);//取得虚拟显存的指针
tick
temp=(tick*)malloc(_data_full_length*sizeof(tick));//读取数据

//当日数据拷贝到tick上
reading_data_from_file(current_file,temp);
cudaMemcpy(tick_list_today_host,temp,_data_full_length*sizeof(tick),cudaMemcpyHostToHost);
//验证代码
for (int ii=0;ii<_data_full_length;++ii)
{tick_list_today_host[ii].showtick();
printf(“%d\n”,tick_list_today_host[ii].count);
temp[ii].showtick();
printf(“%d\n”,temp[ii].count);
if (ii%200==0)
{system(“pause”);}
}
free(temp);
[attach]2807[/attach]
结果就显示这样……malloc分配出来的地址上数据就是对的,cudahostalloc的数据showtick就不对了。
tick是我写的一个结构,里面有若干数据,tick::showtick()就是显示这个结构体里面的数据,正常的结果就应该像2011-6-15那一行那样显示出来
我分配的内存地址都是1维的,拷贝的过程也没有pitch,我之前显示过地址,malloc分配的内存和cuda分配的内存间距也是一样的
sizeof(tick)是44字节

楼主您好,看到您的帖子了。

对于您的cudaMemcpy进行host->host复制的行为,在您给出的代码不存在其他被您刻意隐藏的cuda api的调用情况下,我表示如下的猜测:
(1)您没有设置您的设备参数,而默认参数是不允许进行host memory映射到device空间上的。
(2)在(1)的情况下,您直接进行了cudaHostGetDevicePointer(), 此操作注定会失败,而您没有检查返回值。
(3)cudaMemcpy(…, cudaMemcpyHostToHost)和memcpy()不是等价的,前者会额外考虑之间的cuda error是否存在,从而决定是否执行复制操作。

根据如上猜测对您给出的建议:
(a)将cudaMemcpy改为普通memcpy, 以规避上文3款, 即无视前文可能存在的获取设备指针时候的失败。
或者(我建议您优先考虑此条):
(b)在代码前步加上cudaSetDeviceFlags(cudaDeviceMapHost); 以便GetDevicePointer的时候可以成功。

当您解决了此段条时候,我额外对您给出一般性建议:
每次cuda api调用后,立刻检查返回值。

如果我的假设/猜测不正确,或者我的建议您认为是不对的,或者您有其他情况需要讨论,欢迎楼主继续跟帖。
祝您调试愉快!

我在整个程序的开头已经使用了cudaSetDeviceFlags

而且我之前就在这块显卡上使用过mapped memory

如果使用memcpy,调试时出现错误提示:

my_real_katana.exe 中的 0x00c604c8 处有未经处理的异常: 0xC0000005: 写入位置 0x00c7abcd 时发生访问冲突

我的能力不足以帮助您,建议另请高明。

建议您继续往前检查是否内存分配成功。

具体你可以检查一下您的cudaHostAlloc的返回值,看看是否成功。
谢谢。

最近一次调试:[attach]2808[/attach]
vs2010的错误提示:
my_real_katana.exe 中的 0x01240458 (程序线程的句柄)处有未经处理的异常: 0xC0000005: 写入位置 0x0125ac3d 时发生访问冲突

(就是上面程序运行时截图中页锁定内存区段的第一个地址)——第一个地址就写入不能了。

既然用了mapped memory何必还要分配temp去读取文件?直接在tick_list_today_host上操作不就好了?

我建议您仔细阅读我上文的多个回复,并按照其中内容进行测试,您的不配合会给您带来时间上和精力上的损失。

因为您直接memcpy即可失败,而且windows报错access violation, 那么您最大的可能cudaHostAlloc没有成功。

鉴于您的汇报结果,我们多少可以缩小下问题所在的范围了。
我在这里重申上文,给您详细的测试建议:
(1)确定自己正确设置了标志(您已经确定)
(2)在进行所有的cuda api调用的时候,建议检查返回值。如果您不愿意检查,请至少减少cudaHostAlloc的返回值。

如果您的(2)测试返回失败,我建议您接一步考虑下
(a)是否您真的做过(1);
(b)您是否之前的操作都是成功的。

如果您到此能确定(a), 因为cuda runtime具有“一步错,步步错"的特性,我建议您仔细考虑下(b),
我提供您下一步的测试建议:
(α)您可以选择逆序对上文的每一步都进行检查
或(β)根据错误的类型直接定位到您的错误所在。

因为您的代码是节选,所以目前只能根据您给的信息提供如上建议。
祝您调试愉快!

谢谢,我发现什么问题了:no CUDA-capable devices were detected by the installed CUDA driver

擦!

我回想起来……之前升级过一次最新版的nv驱动……

居然旧版的可以cuda,新版的反而不行……

什么道理啊

貌似得装develop版驱动。。。

正式版的驱动一般都是可以的,并非必须develop版,除非有另外的声明,当然下载toolkit页面上的驱动肯定没问题。