2011-09-08 114 views
13

我在问这个,因为我知道有一种方法可以使用二进制文件而不是源文件。CUDA是否有汇编语言?

另外,我猜测用汇编语言来模拟函数指针会更容易。除非GPU上的程序集与CPU上的程序集完全不同。

+0

C for CUDA出了什么问题? http://developer.download.nvidia.com/compute/cuda/2_1/toolkit/docs/NVIDIA_CUDA_Programming_Guide_2.1.pdf – 2011-09-08 19:05:51

+4

几周前回复[在“是否可以将指令放入CUDA代码中?” ](http://stackoverflow.com/questions/3677220/is-it-possible-to-put-instructions-into-cuda-code/7072079#7072079)。 *注意:*不是接受的答案,而是后来的答案。 – dmckee

+0

@dmckee +1。另外,由于CUDA 3.2(和2.0设备)函数指针在不干扰ptx的情况下得到支持。而较旧的设备根本没有设备函数这样的东西 - 所有对来自内核的'__device__'函数的调用都被内联了。 – aland

回答

29

您可能想看看PTX。 NVIDIA提供了一个文档在CUDA 4.0文档中描述它。

http://developer.nvidia.com/nvidia-gpu-computing-documentation

NVIDIA描述PTX为“钽低电平并行线程执行的虚拟机和指令集架构(ISA)。PTX暴露GPU作为数据并行计算设备”。不完全像x86汇编,但你可能会发现它有趣的阅读。

+10

值得指出的是,PTX是一个虚拟指令集。每个不同的NVIDIA架构都有自己的PTX物理ISA。可以将PTX指令内联到CUDA代码中,类似于内联x86 asm。 –

12

是的,GPU上的程序集与CPU完全不同。 其中一个差异在于GPU的指令集没有标准化。 NVidia(以及AMD和其他GPU供应商)可以并且确实将其指令集从一种GPU模型更改为下一种。

所以CUDA不公开汇编语言。没有意义。 (由于GPU硬件的限制,CUDA的C语言及其支持的任何其他语言都存在局限性,这不仅仅是因为Nvidia恨你并想惹恼你,所以即使你可以直接访问底层指令集和汇编语言,你将无法神奇地做你现在无法做到的事情。

(注意,NVidia确实定义了一个“虚拟”指令集,你可以在代码中使用和嵌入它,但它是不是指令集,它不直接映射到硬件指令,它只是一个简单的编程语言,它看起来像一个汇编语言

+1

哦!很高兴知道......如果我甚至不能指望代码在不同的GPU上工作......这绝对是错误的方法!谢谢 – widgg

+0

您的CUDA代码可以在不同的GPU上正常工作。 CUDA只是将它编译为每个GPU的合适目标。 – jalf

15

实际上有两种不同的CUDA汇编语言。

PTX是一种独立于机器的汇编语言,汇编到SASS,这是在特定GPU系列上执行的实际操作码。如果你建立.cubins,你正在处理SASS。大多数CUDA运行时应用程序使用PTX,因为这使它们能够在原始应用程序之后发布的GPU上运行。如果你的目标是sm_20(费米/ GTX 400系列),函数指针在CUDA中已经有一段时间了。