cubin文件如何查看我的程序使用了多少资源

各位大侠。我使用visual studio2010编写cuda程序,想知道我的资源使用情况。但是我的那个cubin文件打开是乱码。这个怎么办哪?
还有,有没有一种方法可以根据自己的程序来计算我的程序使用了多少资源(例如寄存器,shared memory等),就是说我的变量怎么知道他将分配到那种存储器上。
万分感谢!!

如果只有一个编译好的cubin,那么查看寄存器用量、shared memory、constant等用量比较麻烦。

但是如果按照您的描述,程序是您自己开发的,那么您可以如下查看:
右键点击您的.cu文件,在属性的CUDA C/C++里,选择command line, 填入:
–ptxas-options=-v

然后重新编译。(您可能需要将您的项目的build log设置为详细才能看到。)

直接观察cubin, 因为cubin的格式没有公布,直接看出寄存器用量,shared memory用量,以及kernel中的多少常数自动被放入了constant cache需要非常麻烦的过程。

因为前者将自动给出数据,后者一切格式都没有公布…
建议您使用上文的编译过程中观察,而不是在编译结束后直接观察cubin。

请尝试建议并反馈结果。

以及,shared memory, 这个是您自己指定的,您在敲击出来代码的过程中您应该自己知道。
或者如果代码是自己写的,但是不知道用了多少__shared__,您也可以跑下profiler,里面将会报告。

以及,关于变量在寄存器里还是在local memory上,这个您也可以考虑经验,只要您不使用在编译时刻无法确定下标数组访问,同时寄存器数目没超出一定数目,那么是在寄存器上的,否则可能产生local memory traffic.

也就是说,无外乎您自己、ptxas、以及profiler, 这三种途径可以报告各种资源的使用量。

十分感谢您的回复!
编译时显示信息如下:
1> ptxas : info : 132 bytes gmem, 368 bytes cmem[0], 28 bytes cmem[14] (任务 ID: 19)
1> ptxas : info : Compiling entry function ‘_Z4echoPdS_S_S_S_S_P11gpu_Complex’ for ‘sm_13’ (任务 ID: 19)
1> ptxas : info : Used 126 registers, 44 bytes smem, 120 bytes cmem[1], 180 bytes lmem (任务 ID: 19)

gmem 表示global memory,cmem 表示shared memory ,cmem表示constant memory 对吗?
另外,在程序中还没有自己指定shared memory,怎么显示信息就已经有了呢?
菜鸟刚上手,还很多不懂,麻烦您解答,谢谢!
刚才回错贴了,已经看到版主的回答

写这个类 应该没有用到shared memory 吧
struct gpu_Complex {

double   r;
double   i;

__device__ __host__ gpu_Complex( double a, double b ) : r(a), i(b)  {}
__device__ __host__ gpu_Complex( ) : r(0.0), i(0.0)  {}
__device__ __host__  double magnitude2( void ) {
	return r * r + i * i;
}
__device__ __host__  gpu_Complex operator*(const gpu_Complex& a) {
	return gpu_Complex(r*a.r - i*a.i, i*a.r + r*a.i);
}
__device__ __host__  gpu_Complex operator*(const double& a) {
	return gpu_Complex(r*a ,i*a);
}
__device__ __host__  gpu_Complex operator+(const gpu_Complex& a) {
	return gpu_Complex(r+a.r, i+a.i);
}

__device__ __host__  gpu_Complex operator-(const gpu_Complex& a) {
	return gpu_Complex(r-a.r, i-a.i);
}	
friend istream & operator >> (istream& is,gpu_Complex& a)
{
	char t;
	is >>a.r>>a.i>>t;
	return is;
}

friend ostream & operator << (ostream& os,gpu_Complex& c2)
{
	os<<c2.r<<(c2.i>=0?"+":"")<<c2.i<<"i";
	return os;
}

};

楼主您好,看上去是没有使用的。

但是我不懂C++, 不知道上述说法是否真的成立。
(例如您的friend ostream部分,无法看懂,这里不知道是否是在device上,更不知道是否会使用shared memory)

建议其他会员、版主、NVIDIA技术支持、总版主为您看到您这段C++代码。

楼主您这个4#帖子已经回复了,您这是重复发帖(一模一样的回帖的),将不再重复回复。

谢谢您的解答,另外,通过查看设备属性中的,sharedMemPerBlock 一个线程块中的最大共享内存数量,是不是也是一个SM中的最大共享内存数量,如果一个Block使用了这个最大共享内存数量,那么一个SM只能有一个active block了。

LZ您好:

是的,以及实际上如果一个block使用了这个数量的一半以上的时候,一个SM上就只能resident一个block了。

祝您好运~

谢谢您耐心细致的解答!:smiley:

LZ您好:

不客气的,欢迎您常来论坛。

其实我只回了一帖,其他大头都是横扫斑竹回复的。

祝您好运~

您好,谢谢您的解答,对于程序中没有指定用register的变量,在编译结果中出现了register,这个是编译器优化的结果,是属于不确定因素对吗?

LZ您好:

kernel中直接定义的变量,默认是使用寄存器的。
kernel中直接定义的数组,如果下标访问规律在编译时是可知的并被编译器成功识别以及这个数组不是太大,那么也会直接使用寄存器。

寄存器是最快的存储单元,也是kernel中最常用的存储单元。
这个是编译器的一般做法,算不上优化,以及基本上是确定的,尽量使用寄存器,寄存器不够用的话会使用local memory。

这里的概念和CPU上有所不同,请注意理解。

祝您编码顺利~

楼主您好,一些“中古”的C语言教科书告诉你需要用register int a;这样才能放入寄存器。

这已经不符合现在的情况了,
现在的编译器,无论你是否指定register, 只要可能,就将变量往编译器里放(因为它快)。

所以哪怕您不写register float dog;之类的,dog也很可能在寄存器里。

以及,突然发现你刚才的是1.3的计算能力(这个刚才忽略了),
1.x上给__global__的参数(你没有写出你的__global__实现),会使用shared memory传递的。

所以在1.x上,莫名的占用shared memory很正常(刚才没注意到您是使用的老卡,特此更正)。

呃,我的计算能力是2.1的呀。。。

无论您的卡是否是2.1, 编译过程中将只根据您的实际参数配置进行。

而您配置的是sm_13, 此时将为1.3的卡编译(kernel参数将使用shared memory)

(这个将会导致编译如此,在实际运行的时候将不占用shared, 因为您实际是2.1上跑的,您也可以改回sm_21)

甚至极端的说,您在一个无卡的机器上编译,同样指定sm_13, 依然会导致同样的编译行为的(使用shared memory)。

您觉得呢?

设备属性显示 计算能力是2.1 的,我在VS设备属性中 coda generation 中 改为compute_21,sm_21,会报错错误 1 error : Unsupported gpu architecture ‘compute_21’ 这是怎么回事啊,麻烦您了~

哦,原来如此,太感谢您了!

这个问题也解决了,谢谢您!

compute_20,sm_21即可。

不过您似乎已经解决了,祝您好运~