微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以将“静态”CUDA 内核启动与 PTX 代码结合起来并获得一个有效的二进制文件吗?

如何解决我可以将“静态”CUDA 内核启动与 PTX 代码结合起来并获得一个有效的二进制文件吗?

假设我采用了一个 CUDA 程序 - 例如 CUDA //rank is a capital letter (EX: "A") //nodeField is a div which only parents h1's. function addNode(rank) { var alphabet = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]; var nextRank = alphabet[alphabet.indexOf(rank) + 1]; if ($('#nodeField>h1[id^="${rank}"]').length) { var aI = alphabet.indexOf($('#nodeField>h1[id^="${rank}"]:last-child')[$('#nodeField>h1[id^="${rank}"]:last-child').length - 1]) + 1; } else { var aI = 0; } var newNode = document.createElement("h1"); newNode.innerHTML = 0; newNode.id = rank + alphabet[aI]; if ($(`#nodeField>h1[id^="${nextRank}"]`).length > 0) { //I need help with correcting the statement below! document.getElementById("nodeField").insertBefore(newNode,$("#" + nextRank + "A")); } else { document.getElementById("nodeField").appendChild(newNode); } } 示例,并删除了内核的实现,但仍然有启动命令:

vectorAdd

假设我编写了自己的 PTX,因为我是一个 DIY 类型的人,所以现在我有 vectorAdd<<<blocksPerGrid,threadsPerBlock>>>(d_A,d_B,d_C,numElements); 没有内核的 CUDA 代码vectorAdd.cu

我现在可以生成一个可执行文件,它可以像未修改的 vectorAdd 一样工作,但在 PTX 中运行代码吗?

(对于同样的讨论,假设 PTX 不会尝试任何有趣的事情或做错任何事情。)

注意事项:

解决方法

  1. 在调用者可见的标头中将您的函数定义为
    __ global __ void vectorAdd(void* d_A,void* d_B,void* d_C,int numElements);
  2. 创建一个带有空声明
    __ global __ void vectorAdd(void* d_A,int numElements) {}
  3. 的文件 vectorAdd.cu
  4. 使用合适的选项调用
    nvcc --keep vectorAdd.cu
  5. 用您的版本替换 vectorAdd.ptx
  6. 调用
    nvcc -fatbin -dlink
    创建 fatbin 和 cubin 文件
  7. 调用 nvcc -link 来链接 .cubin 文件和 .cudafe1.cpp 或 cudafe1.c(取决于语言)文件。它们还依次包含 .cudafe1.stub.c 和 .fatbin.c 文件
  8. 在您的项目中使用生成的 .obj 或 .o 文件(Windows/Linux)
  9. 以CUDA运行时方式调用vectorAdd>>

(作为高级 DIY 人员,您将来会想要编写 SASS 代码,这是特定于设备的低级汇编语言。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。