- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试找到一种从CUDA C调用ptx函数(.func)的方法。
说我有一个这样的ptx函数:
.func (.reg .s32 %res) inc_ptr ( .reg .s32 %ptr, .reg .s32 %inc )
{
add.s32 %res, %ptr, %inc;
ret;
}
call (%d), inc_ptr, (%s, %d);
最佳答案
可以使用CUDA 5.0引入的独立编译工具来完成此操作。我不认为有办法在“整体”程序编译模式下或CUDA 5.0之前的工具包版本中或在3.1之前的PTX版本中执行此操作。
用一个可行的例子来说明如何做到这一点可能是最容易的。让我们从一个简单的PTX函数开始,该函数用于增加指针,类似于您的示例:
.version 3.1
.target sm_30
.address_size 32
.visible .func inc_ptr(.param .b32 ptr, .param .b32 inc)
{
.reg .s32 %r<6>;
ld.param.u32 %r1, [ptr];
ld.param.u32 %r2, [inc];
ld.u32 %r3, [%r1];
ld.u32 %r4, [%r3];
add.s32 %r5, %r4, %r2;
st.u32 [%r3], %r5;
ret;
}
ptxas
将其编译为可重定位的设备对象,然后打包到胖容器文件中。后面的步骤似乎很关键。默认的
ptxas
输出仅是可重定位的
elf
对象,不生成任何胖容器。看来nvcc运行的设备代码链接阶段(至少在CUDA 5中)期望所有设备代码都存在于胖容器中。否则链接将失败。结果看起来像这样:
$ ptxas -arch=sm_30 -c -o inc_ptr.gpu.o inc_ptr.ptx
$ fatbinary -arch=sm_30 -create inc_ptr.fatbin -elf inc_ptr.gpu.o
$ cuobjdump -sass inc_ptr.fatbin
Fatbin elf code:
================
arch = sm_30
code version = [1,6]
producer = <unknown>
host = mac
compile_size = 32bit
code for sm_30
Function : inc_ptr
/*0008*/ /*0x0040dc8580000000*/ LD R3, [R4];
/*0010*/ /*0x00301c8580000000*/ LD R0, [R3];
/*0018*/ /*0x14001c0348000000*/ IADD R0, R0, R5;
/*0020*/ /*0x00301c8590000000*/ ST [R3], R0;
/*0028*/ /*0x00001de790000000*/ RET;
/*0030*/ /*0x00001de440000000*/ NOP CC.T;
/*0038*/ /*0x00001de440000000*/ NOP CC.T;
/*0040*/ /*0xe0001de74003ffff*/ BRA 0x40;
/*0048*/ /*0x00001de440000000*/ NOP CC.T;
/*0050*/ /*0x00001de440000000*/ NOP CC.T;
/*0058*/ /*0x00001de440000000*/ NOP CC.T;
/*0060*/ /*0x00001de440000000*/ NOP CC.T;
/*0068*/ /*0x00001de440000000*/ NOP CC.T;
/*0070*/ /*0x00001de440000000*/ NOP CC.T;
/*0078*/ /*0x00001de440000000*/ NOP CC.T;
........................
extern "C" __device__ void inc_ptr(int* &ptr, const int inc);
__global__
void memsetkernel(int *inout, const int val, const int N)
{
int stride = blockDim.x * gridDim.x;
int *p = inout;
inc_ptr(p, threadIdx.x + blockDim.x*blockIdx.x);
for(; p < inout+N; inc_ptr(p, stride)) *p = val;
}
int main(void)
{
const int n=10;
int *p;
cudaMalloc((void**)&p, sizeof(int)*size_t(n));
memsetkernel<<<1,32>>>(p, 5, n);
return 0;
}
extern
声明,并且(只要您在控制下进行符号处理),设备函数fatbinary可以与其他设备和主机代码链接以产生最终对象:
$ nvcc -arch=sm_30 -Xptxas="-v" -dlink -o memset.out inc_ptr.fatbin memset_kernel.cu
ptxas info : 0 bytes gmem
ptxas info : Compiling entry function '_Z12memsetkernelPiii' for 'sm_30'
ptxas info : Function properties for _Z12memsetkernelPiii
8 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 20 registers, 332 bytes cmem[0]
$ cuobjdump -sass memset.out
Fatbin elf code:
================
arch = sm_30
code version = [1,6]
producer = <unknown>
host = mac
compile_size = 32bit
identifier = inc_ptr.fatbin memset_kernel.cu
code for sm_30
Function : _Z12memsetkernelPiii
/*0008*/ /*0x10005de428004001*/ MOV R1, c [0x0] [0x44];
/*0010*/ /*0x20105d034800c000*/ IADD R1, R1, -0x8;
/*0018*/ /*0x00019de428004005*/ MOV R6, c [0x0] [0x140];
/*0020*/ /*0x10101c034800c000*/ IADD R0, R1, 0x4;
/*0028*/ /*0x8400dc042c000000*/ S2R R3, SR_Tid_X;
/*0030*/ /*0x90041c0348004000*/ IADD R16, R0, c [0x0] [0x24];
/*0038*/ /*0x94001c042c000000*/ S2R R0, SR_CTAid_X;
/*0048*/ /*0xd0009de428004000*/ MOV R2, c [0x0] [0x34];
/*0050*/ /*0x91045d0348004000*/ IADD R17, R16, -c [0x0] [0x24];
/*0058*/ /*0x40011de428000000*/ MOV R4, R16;
/*0060*/ /*0xa0015ca320064000*/ IMAD R5, R0, c [0x0] [0x28], R3;
/*0068*/ /*0x01119c85c8000000*/ STL [R17], R6;
/*0070*/ /*0xa0209ca350004000*/ IMUL R2, R2, c [0x0] [0x28];
/*0078*/ /*0x0001000710000000*/ JCAL 0x0;
/*0088*/ /*0x0110dc85c0000000*/ LDL R3, [R17];
/*0090*/ /*0x20001de428004005*/ MOV R0, c [0x0] [0x148];
/*0098*/ /*0x00049c4340004005*/ ISCADD R18, R0, c [0x0] [0x140], 0x2;
/*00a0*/ /*0x4831dc031b0e0000*/ ISETP.GE.U32.AND P0, pt, R3, R18, pt;
/*00a8*/ /*0x000001e780000000*/ @P0 EXIT;
/*00b0*/ /*0x1004dde428004005*/ MOV R19, c [0x0] [0x144];
/*00b8*/ /*0x0034dc8590000000*/ ST [R3], R19;
/*00c8*/ /*0x40011de428000000*/ MOV R4, R16;
/*00d0*/ /*0x08015de428000000*/ MOV R5, R2;
/*00d8*/ /*0x0001000710000000*/ JCAL 0x0;
/*00e0*/ /*0x0110dc85c0000000*/ LDL R3, [R17];
/*00e8*/ /*0x4831dc03188e0000*/ ISETP.LT.U32.AND P0, pt, R3, R18, pt;
/*00f0*/ /*0x000001e74003ffff*/ @P0 BRA 0xb8;
/*00f8*/ /*0x00001de780000000*/ EXIT;
/*0100*/ /*0xe0001de74003ffff*/ BRA 0x100;
/*0108*/ /*0x00001de440000000*/ NOP CC.T;
/*0110*/ /*0x00001de440000000*/ NOP CC.T;
/*0118*/ /*0x00001de440000000*/ NOP CC.T;
/*0120*/ /*0x00001de440000000*/ NOP CC.T;
/*0128*/ /*0x00001de440000000*/ NOP CC.T;
/*0130*/ /*0x00001de440000000*/ NOP CC.T;
/*0138*/ /*0x00001de440000000*/ NOP CC.T;
.....................................
Function : inc_ptr
/*0008*/ /*0x0040dc8580000000*/ LD R3, [R4];
/*0010*/ /*0x00301c8580000000*/ LD R0, [R3];
/*0018*/ /*0x14001c0348000000*/ IADD R0, R0, R5;
/*0020*/ /*0x00301c8590000000*/ ST [R3], R0;
/*0028*/ /*0x00001de790000000*/ RET;
/*0030*/ /*0x00001de440000000*/ NOP CC.T;
/*0038*/ /*0x00001de440000000*/ NOP CC.T;
/*0040*/ /*0xe0001de74003ffff*/ BRA 0x40;
/*0048*/ /*0x00001de440000000*/ NOP CC.T;
/*0050*/ /*0x00001de440000000*/ NOP CC.T;
/*0058*/ /*0x00001de440000000*/ NOP CC.T;
/*0060*/ /*0x00001de440000000*/ NOP CC.T;
/*0068*/ /*0x00001de440000000*/ NOP CC.T;
/*0070*/ /*0x00001de440000000*/ NOP CC.T;
/*0078*/ /*0x00001de440000000*/ NOP CC.T;
........................
关于assembly - 如何从CUDA C调用ptx函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11116722/
我正在使用 Capabilities 3.5、CUDA 5 和 VS 2010(当然还有 Windows)。 我有兴趣阅读编译后的代码,以更好地了解我的 C 代码更改的含义。 我需要在 VS 中进行什
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 7年前关闭。 Improve this qu
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
:)当我尝试管理内核资源时,我决定研究一下 PTX,但有一些事情我不明白。这是我编写的一个非常简单的内核: __global__ void foo(float* out, float* in, uin
我已经为其他应用程序执行了此操作,但由于某种原因,它在我当前的应用程序中不起作用。 这里是一个代码片段,在 VS2010 中工作,使用 Cuda 4.2。我在VS内部和VS外部都编译了ptx文件,但没
我看到了一些代码示例,其中人们在 C 代码中使用内联 PTX 汇编代码。 CUDA toolkit中的Doc提到PTX很强大,为什么会这样?如果我们在 C 代码中使用这样的代码,我们会得到什么好处?
我能否将 PTX 文件中包含的 PTX 函数用作外部设备函数,以将其链接到另一个应调用该函数的 .cu 文件? 这是CUDA - link kernels together的另一个问题其中函数本身不包
我试图减少内核中使用寄存器的数量,所以我决定尝试内联 PTX。 这个内核: #define Feedback(a, b, c, d, e) d^e^(a&c)^(a&e)^(b&c)^(b&e)^(c
...刚刚在 PTX manual 中提到.没有关于它们有什么好处或如何使用它们的提示。 有人知道更多吗?我只是缺少一个共同的概念吗? 最佳答案 巴特的评论基本正确。更详细地,如 PTX ISA 3.
为了查看 CUDA 生成的代码类型,除了目标文件外,我还喜欢编译为 ptx。由于我的一些循环展开可能需要相当长的时间,所以我希望能够编译 *.cu→*.ptx→*。 o 而不是在 *.cu→*.ptx
在 OpenCL 中,“PTX(如 Java 中的字节码)到目标转换器”是解释器(如 Java 中的字节码)还是提前汇编器? 最佳答案 Java 是即时编译的,而不是解释的。 PTX 也在加载时编译。
我正在通过 c++filt 过滤我编译的 PTX,但它只删除了一些名称/标签并保留了一些原样。例如,这个: func (.param .b32 func_retval0) _ZN41_INTERNA
我希望能够使用 PTX 1.3 中尚未在 C 接口(interface)中实现的功能。有没有办法在 PTX 中编写我自己的函数并注入(inject)到现有的二进制文件中? 我正在寻找的功能是获得 %s
我想将 cuda 编译为 ptx 进行嵌入。为此,我将 CMAKE 3.18.5 与 Visual Studio 16(2019) 生成器一起使用,这是项目的要求。我遇到的问题是目标标志重复 comp
CUDA PTX 类似于汇编,因此会显示源代码。我已阅读 CUDA 编程指南的第 3.1 节和 Section 3.2.7 from the online CUDA compiler document
CUDA 编译器可以选择生成 32 位或 64 位 PTX。这些有什么区别?和 x86 一样,NVidia GPU 实际上有 32 位和 64 位 ISA 吗?还是仅与主机代码有关? 最佳答案 指针肯
只是为了看看 CUDA 正在生成什么样的代码,除了目标文件之外,我还喜欢编译为 ptx。由于我的一些循环展开可能需要相当长的时间,因此我希望能够编译 *.cu→*.ptx→*。 o 而不是浪费时间使用
随着gcc 7.1的发布,我们现在可以为openmp 4.5配置gcc,将其卸载到Nvidia PTX GPGPU。这就是他们在发行说明中所说的(大约)。 所以我的问题是,在将openmp 4.5编译
Here在文档中,指出 prefetch 和 prefetchu ptx 指令“预取行包含指定状态空间中指定内存层次结构级别的通用地址”。还提到语法是 prefetch{.space}.level [
我尝试使用 CUDA 驱动程序 API 运行由 .cl 内核生成的 PTX 汇编代码。我采取的步骤是这些(标准的opencl程序): 1) 加载 .cl 内核 2) JIT 编译 3) 获取编译好的p
我是一名优秀的程序员,十分优秀!