Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 使用GPU的程序(程序集)看起来像什么?_Assembly_Gpu - Fatal编程技术网

Assembly 使用GPU的程序(程序集)看起来像什么?

Assembly 使用GPU的程序(程序集)看起来像什么?,assembly,gpu,Assembly,Gpu,从一开始,GPU制造商似乎只是为特定的GPU API提供了一个驱动程序,而且没有GPU组装之类的东西,或者至少,不会有一本GPU组装编程手册像 然而,据我所知,所有进程都是通过CPU运行的,并且可以被分解 我的问题是:使用GPU的程序集是什么样子的?我的假设是,它将使用系统调用来操作表示GPU的设备文件。这个假设正确吗 使用GPU的代码看起来像什么? 阅读更多关于(或者,仅针对Nvidia硬件,关于)。还要注意!请参阅,并阅读一些OpenCL书籍。读一些 实际上,您永远不会看到您的系统的“汇编代

从一开始,GPU制造商似乎只是为特定的GPU API提供了一个驱动程序,而且没有GPU组装之类的东西,或者至少,不会有一本GPU组装编程手册像

然而,据我所知,所有进程都是通过CPU运行的,并且可以被分解

我的问题是:使用GPU的程序集是什么样子的?我的假设是,它将使用系统调用来操作表示GPU的设备文件。这个假设正确吗

使用GPU的代码看起来像什么? 阅读更多关于(或者,仅针对Nvidia硬件,关于)。还要注意!请参阅,并阅读一些OpenCL书籍。读一些

实际上,您永远不会看到您的系统的“汇编代码”。但您将使用OpenCL编写代码(这是非常低级的,而且将代码调整到特定硬件很困难,而且容易出错)

AFAIK,AMD倾向于发布其大多数GPU的“机器代码规范”(如)。英伟达更为隐秘。请注意,它是“类似于汇编的”(实际上是基于汇编的),但仍然不完全是汇编程序

我的问题是:使用GPU的程序集是什么样子的?我的假设是,它将使用系统调用来操作表示GPU的设备文件。这个假设正确吗

系统调用(非常特定于硬件)将SPIR或等效字节码(通常是特定于GPGPU的机器代码)从CPU(和虚拟内存)传输到GPU,也将数据从GPGPU传输到CPU(&内存)并返回。细节非常复杂,通常是硬件制造商专有的。您更喜欢使用OpenCL(或CUDA)API和方言。你的假设是错误的,或者至少被过分简化到毫无意义的地步

还可以查看wiki

实际上,几个数字库(例如,,…)都有OpenCL后端。因此,花几个月的时间研究他们的源代码。

了解所有细节将使你获得博士学位。(和许多其他专家)可能是你的顾问

还可以阅读更多关于和他们的信息。例如,查看规范

然而,据我所知,所有进程都是通过CPU运行的,并且可以被分解

这是一个非常幼稚的说法,我认为这是错误的(至少对于我喜欢编写的程序来说,它们都会在运行时生成代码)。在实践中,您将无法理解反汇编代码(这就是为什么如此困难的原因)。例如,对于生成机器代码的程序,(在Linux上)查看(它在每次用户交互时都会发出机器代码),或者查看使用技术的任何或大多数程序(实际上,大多数Java JVM都在进行JIT翻译)。我的Linux程序在运行时生成C代码,将其编译成一个i.e.a,可以,然后使用该插件(可以重复数十万次)。有关有助于生成机器代码的库的示例,请参阅


您还应该阅读更多有关操作系统的一般信息。我强烈推荐(可免费下载)。

如果您使用的是Nvidia GPU,则可以查看汇编代码。PTX只是一个伪汇编,介于OpenCL和实际在GPU上运行的二进制代码之间。 以下是您从OpenCL获得它的方式:

上下文(设备);
queue=CommandQueue(上下文、设备);//队列以推送设备的命令
程序::源代码;
字符串kernel_code=opencl_code_设置(N,M)+opencl_code();
push_back({kernel_code.c_str(),kernel_code.length()});
程序(上下文、源);
if(program.build(“-cl快速松弛数学”))返回false;//编译OpenCL代码,如果有错误,则返回false
常量字符串ptx_code=program.getInfo()[0];//为OpenCL代码生成程序集(ptx)
字符串
ptx\u code
就是您要查找的内容。下面是一个小型内核示例:

内核无效基准_1(全局浮点*数据){
consuint n=获取全局id(0);
#布拉格展开

对于(uint i=0;好的。我查看了OpenCL上的页面。页面上写着“OpenCL将计算系统视为由许多计算设备组成,这些设备可能是中央处理器(CPU)或“加速器”,如图形处理单元(GPU),连接到主处理器(CPU)”对。所以程序最终必须在主机处理器上运行。这个程序的汇编是什么样子的?顺便说一句,编辑我的帖子是为了更清楚。我不是问GPU汇编,而是问使用GPU的程序的CPU汇编。例如,假设program
matmul
使用GPU。在
mat的反汇编中mul
,是否使用了GPU?但你真的很困惑,我不明白为什么OpenCL不足以you@extremeaxe5,当你剥开洋葱的层层时,你最终会达到一个专有的水平,在这个水平上你将无法剥开那一层。这是有意的,也是巴兹尔在他的回答中解释的总是转储CPU的寄存器,但如果没有专有的API代码/引用,它将毫无意义。(尽管存在多核、多线程调度问题)像OpenCL这样的软件包,让你尽可能地接近它。不,不…不是GPGPU,不管它与GPGPU发生什么相互作用,它都是普通的旧CPU。这就是为什么它基本上是没有意义的。我同意你的观点,并不打算表明你总是能够转储GPGPU,特别是在Propriestar的情况下y hardware,如果你能做到,我会很惊讶。那是你无法触及的洋葱层。你为什么要问?是好奇,还是更多。好奇。我从事的是技术导向的职业,但这与工作无关。ins上有公开发布的文档
//
// Generated by NVIDIA NVVM Compiler
//
// Compiler Build ID: UNKNOWN
// Driver 
// Based on LLVM 3.4svn
//

.version 6.2
.target sm_61, texmode_independent
.address_size 64

    // .globl   benchmark_1

.entry benchmark_1(
    .param .u64 .ptr .global .align 4 benchmark_1_param_0
)
{
    .reg .b32   %r<23>;
    .reg .b64   %rd<34>;


    ld.param.u64    %rd1, [benchmark_1_param_0];
    mov.b32 %r1, %envreg3;
    mov.u32     %r2, %ntid.x;
    mov.u32     %r3, %ctaid.x;
    mad.lo.s32  %r4, %r3, %r2, %r1;
    mov.u32     %r5, %tid.x;
    add.s32     %r6, %r4, %r5;
    mul.wide.u32    %rd2, %r6, 4;
    add.s64     %rd3, %rd1, %rd2;
    mov.u32     %r7, 0;
    st.global.u32   [%rd3], %r7;
    add.s32     %r8, %r6, 15728640;
    mul.wide.u32    %rd4, %r8, 4;
    add.s64     %rd5, %rd1, %rd4;
    st.global.u32   [%rd5], %r7;
    add.s32     %r9, %r6, 31457280;
    mul.wide.u32    %rd6, %r9, 4;
    add.s64     %rd7, %rd1, %rd6;
    st.global.u32   [%rd7], %r7;
    add.s32     %r10, %r6, 47185920;
    mul.wide.u32    %rd8, %r10, 4;
    add.s64     %rd9, %rd1, %rd8;
    st.global.u32   [%rd9], %r7;
    add.s32     %r11, %r6, 62914560;
    mul.wide.u32    %rd10, %r11, 4;
    add.s64     %rd11, %rd1, %rd10;
    st.global.u32   [%rd11], %r7;
    add.s32     %r12, %r6, 78643200;
    mul.wide.u32    %rd12, %r12, 4;
    add.s64     %rd13, %rd1, %rd12;
    st.global.u32   [%rd13], %r7;
    add.s32     %r13, %r6, 94371840;
    mul.wide.u32    %rd14, %r13, 4;
    add.s64     %rd15, %rd1, %rd14;
    st.global.u32   [%rd15], %r7;
    add.s32     %r14, %r6, 110100480;
    mul.wide.u32    %rd16, %r14, 4;
    add.s64     %rd17, %rd1, %rd16;
    st.global.u32   [%rd17], %r7;
    add.s32     %r15, %r6, 125829120;
    mul.wide.u32    %rd18, %r15, 4;
    add.s64     %rd19, %rd1, %rd18;
    st.global.u32   [%rd19], %r7;
    add.s32     %r16, %r6, 141557760;
    mul.wide.u32    %rd20, %r16, 4;
    add.s64     %rd21, %rd1, %rd20;
    st.global.u32   [%rd21], %r7;
    add.s32     %r17, %r6, 157286400;
    mul.wide.u32    %rd22, %r17, 4;
    add.s64     %rd23, %rd1, %rd22;
    st.global.u32   [%rd23], %r7;
    add.s32     %r18, %r6, 173015040;
    mul.wide.u32    %rd24, %r18, 4;
    add.s64     %rd25, %rd1, %rd24;
    st.global.u32   [%rd25], %r7;
    add.s32     %r19, %r6, 188743680;
    mul.wide.u32    %rd26, %r19, 4;
    add.s64     %rd27, %rd1, %rd26;
    st.global.u32   [%rd27], %r7;
    add.s32     %r20, %r6, 204472320;
    mul.wide.u32    %rd28, %r20, 4;
    add.s64     %rd29, %rd1, %rd28;
    st.global.u32   [%rd29], %r7;
    add.s32     %r21, %r6, 220200960;
    mul.wide.u32    %rd30, %r21, 4;
    add.s64     %rd31, %rd1, %rd30;
    st.global.u32   [%rd31], %r7;
    add.s32     %r22, %r6, 235929600;
    mul.wide.u32    %rd32, %r22, 4;
    add.s64     %rd33, %rd1, %rd32;
    st.global.u32   [%rd33], %r7;
    ret;
}