如何解决我可以将“静态”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 不会尝试任何有趣的事情或做错任何事情。)
注意事项:
-
这个问题是一个变体:
How can I create an executable to run a kernel in a given PTX file?
除此之外,在那个问题中,发帖人愿意使用驱动程序 API 来动态加载和编译使用驱动程序 API 的 PTX 文件。在这里,这不是一个选项:C++ 代码使用三重 V 形 CUDA 运行时启动,并且这不能改变。
解决方法
- 在调用者可见的标头中将您的函数定义为
__ global __ void vectorAdd(void* d_A,void* d_B,void* d_C,int numElements);
- 创建一个带有空声明
__ global __ void vectorAdd(void* d_A,int numElements) {}
的文件 vectorAdd.cu
- 使用合适的选项调用
nvcc --keep vectorAdd.cu
- 用您的版本替换 vectorAdd.ptx
- 调用
nvcc -fatbin -dlink
创建 fatbin 和 cubin 文件 - 调用 nvcc -link 来链接 .cubin 文件和 .cudafe1.cpp 或 cudafe1.c(取决于语言)文件。它们还依次包含 .cudafe1.stub.c 和 .fatbin.c 文件
- 在您的项目中使用生成的 .obj 或 .o 文件(Windows/Linux)
- 以CUDA运行时方式调用vectorAdd>>
(作为高级 DIY 人员,您将来会想要编写 SASS 代码,这是特定于设备的低级汇编语言。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。