炼数成金 门户 CUDA 查看内容

CUDA编程接口:虚拟地址空间与错误检查

2015-9-8 16:01| 发布者: 炼数成金_小数| 查看: 1412| 评论: 0|来自: IT168

摘要: 本文将CUDA编程接口三方面的内容:同意虚拟地址空间、错误检查和调用栈。统一虚拟地址空间对于计算能力2.0或以上的设备,当应用以64位进程运行时,以TCC模式在win7/Vista(只支持Tesla系列设备)、在win XP或者在Linux ...

存储 Linux 编程 内核 CUDA

本文将CUDA编程接口三方面的内容:同意虚拟地址空间、错误检查和调用栈。

统一虚拟地址空间
对于计算能力2.0或以上的设备,当应用以64位进程运行时,以TCC模式在win7/Vista(只支持Tesla系列设备)、在win XP或者在Linux上,主机通过cudaHostAlloc()分配的存储器和使用cudaMalloc*()分配的设备存储器使用单个虚拟地址空间;指针指向那个存储器空间(主机存储器或任意一个设备存储器)可以通过cudaPointerGetAttributes()确定。结果:

①当在使用统一地址空间的设备间复制存储器时,cudaMemcpy*()中的cudaMemcpyKind参数没有作用,可用设置成cudaMemcpyDefault;
②通过cudaHostAlloc()分配的存储器默认在使用统一地址空间的设备间是可分享的(参见3.2.4.1节),cudaHostAlloc()返回的指针可被在这些设备上的内核直接使用(如,无需使用cudaHostGetDevicePointer()获得设备指针)。
应用可以使用unifiedAddressing设备属性(见前文,可阅读“相关阅读”中的文章)查询某个设备是否使用统一地址空间,如果返回1,即支持。

错误检查
所有的运行时函数都返回错误码,但对于异步函数(见前文,可阅读“相关阅读”中的文章),由于会在任务结束前返回,因此错误码不能报告异步调用的错误;错误码只报告在任务执行之前的错误,典型的错误有关参数有效性;如果异步调用出错,错误将会在后面某个无关的函数调用中出现。 能够检查异步调用出错的方式是通过在异步调用函数后面使用cudaDeviceSynchronize()同步(或使用前文介绍的其它同步机制),然后检查cudaDeviceSynchronize()的返回值。

运行时为每个主机线程维护着一个初始化为cudaSuccess的错误变量,每次错误发生(可以是参数不正确或异步错误)时,该变量会被错误码重写。cudaPeekAtLastError()返回这个变量,cudaGetLastError()会返回这个变量,并将它重新设置为cudaSuccess。 内核发射不返回任何错误码,所以应当在内核发射后立刻调用cudaGetLastError()或cudaPeekAtLastError()检测发射前错误。为保证cudaGetLastError()返回的错误值不是由于内核发射前错误导致的,必须保证运行时错误变量在内核发射前被设置为cudaSuccess,可以通过在内核发射前调用cudaGetLastError()实现。内核发射是异步的,因此为了检测异步错误,应用必须在内核发射和cudaGetLastError()或cudaPeekAtLastError()之间同步。

注意cudaStreamQuery()可能返回cudaErrorNotReady,而由于cudaEventQuery()没有考虑错误,因此不会被cudaPeekAtLastError()或cudaGetLastError()报告。

调用栈
在计算能力2.x的设备上,调用栈的长度可以使用cudaDeviceGetLimit()查询,使用cudaDeviceSetLimit()设置。 当调用栈上溢时,如果通过CUDA调试器(cuda-gdb, Parallel Nsight)运行,内核会因为栈上溢失败,否则会出现无法确定的启动(unspecified launch)错误。

鲜花

握手

雷人

路过

鸡蛋

最新评论

热门频道

  • 大数据
  • 商业智能
  • 量化投资
  • 科学探索
  • 创业

即将开课

热门文章

     

    GMT+8, 2020-1-25 00:17 , Processed in 0.213896 second(s), 23 queries .