我正在研究Windows中的gpu跟踪仿真工具,这是我在研究生院的研究工作的一部分。我正在研究cuda运行时跟踪仿真是否具体。
我使用MS Detours进行简单的DLL注入,以便拦截cuda运行时API。我将API调用及其参数存储在跟踪文件中。尝试从我的跟踪文件中模拟API时遇到一些问题(我使用单词“回放”来表示此操作)
典型的跟踪文件首先调用__cudaRegisterFatBinary和__cudaRegisterFunction。接下来是对cudaMalloc的调用。
我做了什么?
1)我遇到了着名的GPUOcelot,我找到了Nvidia正在使用的Cubin结构。我正在使用它在拦截模式下保存cudaRegisterFatBinary的地址参数,我通过重新填充内存中的结构在_cudaRegisterFatBinary的回放中使用指针。
2)在_cudaRegisterFunction中我不确定hostFunction,Device Function和Device Name所引用的参数。我的意思是我不明白如何在从我的跟踪文件回放时填充它。我只是保存指针从原始执行中并使用它来模仿调用。但是没有办法知道函数是否正常,因为它没有返回值。
3)cudaMalloc跟随这两个入口点函数返回cuda错误代码11.根据Nvidia文档,它是cuda无效值。我不知道为什么会这样。我假设前两个函数调用出错了。我也有一种感觉,cuda运行时隐式主要上下文创建出了问题。有人能给我一些关于cuda运行时执行的见解,并指出我可能会遗漏的内容吗?
我知道它的大量信息没有任何有用的代码。我不知道在这里发布的代码的哪一部分。当人们开始对我的问题感兴趣并问我关于我的项目的具体事情时,我会这样做。最初我只是希望我错过了你们中的一个人可以发现的高级别的东西。
我非常感谢您的时间和兴趣!
答案 0 :(得分:1)
听起来非常有趣。您的“错误:Cuda无效值”可能与_cudaRegisterFunction的参数有关。参数'DeviceName'听起来像是在识别要使用的GPU(卡?)。检查CUDA SDK,有许多演示枚举系统上的GPU,也许这些值对'DeviceName'有效。至于'hostFunction'和'deviceFunction',这些听起来像是函数ID,或者可能是函数指针。此外,您可以调用'cudaGetLastError()'来测试函数调用是否成功(如果一切正常,则返回'cudaSuccess'...看一下sdk中的错误记录宏)。祝你好运!