我有以下代表性代码:
__global__ void func()
{
register ushort4 result = make_ushort4(__float2half_rn(0.5), __float2half_rn(0.5), __float2half_rn(0.5), __float2half_rn(1.0));
}
编译时,result
存储在本地内存中。是否有可能将其强制注册?本地内存对于预期的应用程序而言太慢。
此外,此结果必须存储到var4元素的数组中。我希望将这些结果存储为合并,例如((ushort4*)(output))[x + y * width] = result;
。没有var4的另一种解决方案也是一种选择。
答案 0 :(得分:4)
如果有可用的寄存器,则应将矢量类型编译到寄存器中。将您的代码段转换为可以在代码删除过程中存活的内容:
__global__ void func(ushort4 *out)
{
ushort4 result = make_ushort4(__float2half_rn(0.5), __float2half_rn(0.5),
__float2half_rn(0.5), __float2half_rn(1.0));
out[threadIdx.x+blockDim.x*blockIdx.x] = result;
}
并编译它:
>nvcc -cubin -arch=sm_20 -Xptxas="-v" ushort4.cu
ushort4.cu
ushort4.cu
tmpxft_000010b8_00000000-3_ushort4.cudafe1.gpu
tmpxft_000010b8_00000000-10_ushort4.cudafe2.gpu
ptxas info : Compiling entry function '_Z4funcP7ushort4' for 'sm_20'
ptxas info : Function properties for _Z4funcP7ushort4
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 8 registers, 36 bytes cmem[0]
显示没有溢出(即本地内存)。此外,反汇编生成的cubin文件显示:
>cuobjdump --dump-sass ushort4.cubin
code for sm_20
Function : _Z4funcP7ushort4
/*0000*/ /*0x00005de428004404*/ MOV R1, c [0x1] [0x100];
/*0008*/ /*0x01101c041000cfc0*/ F2F.F16.F32 R0, 0x3f000;
/*0010*/ /*0x94009c042c000000*/ S2R R2, SR_CTAid_X;
/*0018*/ /*0x8400dc042c000000*/ S2R R3, SR_Tid_X;
/*0020*/ /*0x01111c041000cfe0*/ F2F.F16.F32 R4, 0x3f800;
/*0028*/ /*0x00915c041c000000*/ I2I.U16.U16 R5, R0;
/*0030*/ /*0x20209c0320064000*/ IMAD.U32.U32 R2, R2, c [0x0] [0x8], R3;
/*0038*/ /*0x40019c03280ac040*/ BFI R6, R0, 0x1010, R5;
/*0040*/ /*0x4041dc03280ac040*/ BFI R7, R4, 0x1010, R5;
/*0048*/ /*0x80201c6340004000*/ ISCADD R0, R2, c [0x0] [0x20], 0x3;
/*0050*/ /*0x00019ca590000000*/ ST.64 [R0], R6;
/*0058*/ /*0x00001de780000000*/ EXIT;
.................................
即。 ushort4
被填充到寄存器中,然后使用64位存储将打包的向量写入全局存储器。无法看到本地内存访问。
因此,如果你已经确信自己有一个向量值编译到本地内存中,那要么是因为你的内核有很多寄存器压力,要么就是要求编译器(volatile
关键字会这样做的,或者你误解了编译器/汇编器在编译时告诉你的内容。
编辑:在Visual Studio Express 2008中使用CUDA 4.0版本,在32位Windows 7上编译计算1.1设备,提供:
>nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2011 NVIDIA Corporation
Built on Fri_May_13_02:42:40_PDT_2011
Cuda compilation tools, release 4.0, V0.2.1221
>cl.exe
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
usage: cl [ option... ] filename... [ /link linkoption... ]
>nvcc -cubin -arch=sm_11 -Xptxas=-v ushort4.cu
ushort4.cu
ushort4.cu
tmpxft_00001788_00000000-3_ushort4.cudafe1.gpu
tmpxft_00001788_00000000-10_ushort4.cudafe2.gpu
ptxas info : Compiling entry function '_Z4funcP7ushort4' for 'sm_11'
ptxas info : Used 4 registers, 4+16 bytes smem
与计算2.0目标的原始版本完全相同。