当我运行需要opencv和CUDA支持的“Gipuma”项目时,问题就出现了。我的视频卡是GTX 750Ti,带有CUDA 8.0。
通过主机函数访问“__managed__ int”变量时出现“访问冲突”。通常,“__managed __”变量可以通过设备和主机读取和写入。我很困惑,我想可能有配置有问题吗?
变量在“gipuma.cu”中声明:
#ifndef SHARED_HARDCODED
__managed__ int SHARED_SIZE_W_m;
__constant__ int SHARED_SIZE_W;
__managed__ int SHARED_SIZE_H;
__managed__ int SHARED_SIZE = 0;
__managed__ int WIN_RADIUS_W;
__managed__ int WIN_RADIUS_H;
__managed__ int TILE_W;
__managed__ int TILE_H;
#endif
和“gipuma.cu”中的主机功能:
int runcuda(GlobalState &gs)
{
WIN_RADIUS_W = 0;//it gets wrong here,access violation.
printf("test is %d\n", WIN_RADIUS_W);
printf("Run cuda\n");
if(gs.params->color_processing)
gipuma<float4>(gs);
else
gipuma<float>(gs);
return 0;
}
和错误消息:
0x000000013FA1DCBD has an unhandled exception (in gipuma.exe): 0xC0000005: An access violation occurred when writing to location 0x0000000000000000.
答案 0 :(得分:1)
在计算能力之前的设备上6.0主机和设备可能无法同时访问__managed__
内存,因为the driver needs an opportunity to programmatically copy the data between host and device。
所以,正如Robert Crovella在他的评论中已经指出的那样,你需要在内核调用之后插入对cudaDeviceSynchronize()
的调用,然后才能再次从主机访问__managed__
内存。