Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CUDAHosterRegister在计算能力为1.1的GPU上返回cudaErrorInvalidValue_C_Cuda - Fatal编程技术网

CUDAHosterRegister在计算能力为1.1的GPU上返回cudaErrorInvalidValue

CUDAHosterRegister在计算能力为1.1的GPU上返回cudaErrorInvalidValue,c,cuda,C,Cuda,我有一个简单的程序,它分配一个无符号的\uuu int64(堆栈上的8字节),然后尝试使用cudahosterregister在GPU上注册该内存。进行此调用的程序部分如下所示: unsigned __int64 mem; unsigned __int64 *pMem = &mem; cudaError_t result; result = cudaHostRegister(pMem, sizeof(unsigned __int64), cudaHostRegisterMapped);

我有一个简单的程序,它分配一个
无符号的\uuu int64
(堆栈上的8字节),然后尝试使用cudahosterregister在GPU上注册该内存。进行此调用的程序部分如下所示:

unsigned __int64 mem;
unsigned __int64 *pMem = &mem;
cudaError_t result;

result = cudaHostRegister(pMem, sizeof(unsigned __int64), cudaHostRegisterMapped);
if(result != cudaSuccess) {
    printf("Error in cudaHostRegister: %s.\n", cudaGetErrorString(result));
    return -1;
}
unsigned __int64 mem;
unsigned __int64 *pMem = &mem;
unsigned __int64 memAddr = (unsigned __int64)pMem;
cudaError_t result;

pMem = (unsigned __int64 *)(memAddr & 0xFFFFFFFFFFFFF000);

result = cudaHostRegister(pMem, 4096, cudaHostRegisterMapped);
if(result != cudaSuccess) {
    printf("Error in cudaHostRegister: %s.\n", cudaGetErrorString(result));
    return -1;
}
我在Visual Studio 2010 Premium中使用nvcc标志compute_11和sm_11进行编译,并且在运行Quadro K1000m和cuda功能版本3.0的笔记本电脑上,一切都正常工作

我最近切换到我的桌面,在那里我试着运行GeForce 8600 GT和GeForce 9500 GT,这两款都有cuda功能版本1.1

根据NVIDIA关于cudaHostRegister的文档,cuda能力为1.1及以上的卡应允许使用CUDAHOSTREGISTERMAPTED:

CUDAHOsterRegisterMapped:将分配映射到CUDA地址空间。可通过调用cudaHostGetDevicePointer()获取指向内存的设备指针。此功能仅在计算能力大于或等于1.1的GPU上可用

经过一些搜索,CudaHosterRegisterMapping似乎需要页对齐内存。我认为这可能是我的3.0卡和1.1卡之间的区别,因此我屏蔽了地址以获得页面对齐的地址,并在大小字段中使用页面大小(4096字节),如下所示:

unsigned __int64 mem;
unsigned __int64 *pMem = &mem;
cudaError_t result;

result = cudaHostRegister(pMem, sizeof(unsigned __int64), cudaHostRegisterMapped);
if(result != cudaSuccess) {
    printf("Error in cudaHostRegister: %s.\n", cudaGetErrorString(result));
    return -1;
}
unsigned __int64 mem;
unsigned __int64 *pMem = &mem;
unsigned __int64 memAddr = (unsigned __int64)pMem;
cudaError_t result;

pMem = (unsigned __int64 *)(memAddr & 0xFFFFFFFFFFFFF000);

result = cudaHostRegister(pMem, 4096, cudaHostRegisterMapped);
if(result != cudaSuccess) {
    printf("Error in cudaHostRegister: %s.\n", cudaGetErrorString(result));
    return -1;
}
此代码也适用于我的3.0卡,但失败的结果与我的1.1卡相同。cudahosterRegister函数返回错误
cudaErrorInvalidValue
,表示:

传递给API调用的一个或多个参数不在可接受的值范围内

我还没有找到更多关于为什么这个函数会这样失败的信息。谢谢任何人能提供的帮助

[编辑]
根据talonmies的响应,我验证了我的至少一张卡(9500 GT,我没有在8600 GT上运行它)是否支持内存映射,根据SDK附带的NVIDIA deviceQuery可执行文件。一些compute capability 1.1设备支持映射内存,但并非所有设备都支持。MCP79系列集成芯片组(so-Ion和9300M/9400M)确实支持映射内存。但是,旧的compute capability 1.1设备(如8600GT和9500GT)不支持映射内存


您可以使用
cudaGetDeviceProperties
API调用以编程方式检查这一点
canMapHostMemory
将告诉您给定设备是否支持映射内存。

某些compute capability 1.1设备支持映射内存,但并非所有设备都支持。MCP79系列集成芯片组(so-Ion和9300M/9400M)确实支持映射内存。但是,旧的compute capability 1.1设备(如8600GT和9500GT)不支持映射内存


您可以使用
cudaGetDeviceProperties
API调用以编程方式检查这一点
canMapHostMemory
将告诉您给定设备是否支持映射内存。

使用SDK提供的deviceQuery可执行文件,9500GT的结果显示:
Support host page locked memory mapping:Yes
这不是
canMapHostMemory
字段吗?我刚刚在设备源代码中验证了查询
Support host page locked memory mapping
显示的字段是
canHostMemory
设备属性。因此cudaHostRegister()在返回canMapHostMemory=true的同一9500GT上失败?如果是这样,听起来像是一个你应该报告的bug。(1) 转到(2)如果您有一个现有的NVdeveloper帐户(例如通过partners.nvidia.com),请单击屏幕右半部分的绿色“登录NVdeveloper”链接(否则,请单击“加入NVdeveloper”以申请新帐户)(3)在提示下使用您的电子邮件地址和密码登录(4)在左侧的侧栏中,单击顶部标题中的第三个链接“缺陷报告”(5)填写缺陷报告表并submit@talonmies:所有SM 1.1.及更高版本的硬件,包括8600GT和9500GT,都支持映射固定内存。唯一不支持映射固定内存的支持CUDA的GPU是G80。@Archeasoftware:pinted+mapped=“零拷贝“是吗?Pre-Ion/GT200设备绝对不支持零拷贝。使用SDK提供的deviceQuery可执行文件,9500GT的结果显示:
Support host page locked memory mapping:Yes
这不是
canMapHostMemory
字段吗?我刚刚在设备源代码中验证了查询
Support host page locked memory mapping
显示的字段是
canHostMemory
设备属性。因此cudaHostRegister()在返回canMapHostMemory=true的同一9500GT上失败?如果是这样,听起来像是一个你应该报告的bug。(1) 转到(2)如果您有一个现有的NVdeveloper帐户(例如通过partners.nvidia.com),请单击屏幕右半部分的绿色“登录NVdeveloper”链接(否则,请单击“加入NVdeveloper”以申请新帐户)(3)在提示下使用您的电子邮件地址和密码登录(4)在左侧的侧栏中,单击顶部标题中的第三个链接“缺陷报告”(5)填写缺陷报告表并submit@talonmies:所有SM 1.1.及更高版本的硬件,包括8600GT和9500GT,都支持映射固定内存。唯一不支持映射固定内存的支持CUDA的GPU是G80。@Archeasoftware:pinted+mapped=“零拷贝“是吗?Pre-Ion/GT200设备绝对不支持零拷贝。我觉得你的校准码很危险。确定生成的地址始终是您的?在我看来,您至少需要
mem[128]
才能安全。SM 1.1和更高版本的硬件可以使用映射固定内存,因此映射标志对除原始G80(GeForce GTX 8800)之外的所有GPU都有效。如果删除该标志时调用通过,请将其作为错误报告给NVIDIA。两台机器之间的平台差异(如有)是什么?如果mem在堆栈上,则某些平台不支持页锁定该内存。@arche