bnuoj_24430 Tiling

本文介绍了一种通过递推算法解决2xn矩形使用2x1或2x2瓷砖进行铺砌的方法。针对输入的不同宽度n(0<=n<=250),程序计算并输出所有可能的铺砌方式数量。通过C语言实现的大数相加处理,确保了计算结果的准确性。

n how many ways can you tile a 2xn rectangle by 2x1 or 2x2 tiles?

Here is a sample tiling of a 2x17 rectangle.


Input

Input is a sequence of lines, each line containing an integer number 0 <= n <= 250.

Output

For each line of input, output one integer number in a separate line giving the number of possible tilings of a 2xn rectangle.

Sample Input

2
8
12

Sample Output

3
171
2731
//递推加大数(正数)相加
#include<stdio.h>
#include<string.h>
int a1[100],b1[100];char c[120];
int f(int x,int y){return x>y?x:y;}
void add(char *a,char *b){
	int lena,lenb,i,j,k,flag;
		lena=strlen(a);lenb=strlen(b);
		memset(a1,0,sizeof(a));memset(b1,0,sizeof(b));memset(c,0,sizeof(c));
		for(i=0;i<lena;i++) a1[i]=a[i]-'0';
		for(j=0;j<lenb;j++) b1[j]=b[j]-'0'; 
		if(lenb>=lena){  //判断长度
		                 for(i=lena-1,j=lenb-1;i>=0&&j>=0;i--,j--) {b1[j]+=a1[i];} //从低位到高位计算
		  for(i=lenb-1;i>=1;i--)  //从低位到高位进位
		  {
		  	if(b1[i]>=10) {
			   b1[i-1]+=b1[i]/10;
			   b1[i]%=10;
			  }
		  } 
		  flag=0;    //判断是否有前置 1
		 if(b1[0]>=10) {flag=1;b1[0]%=10;}
		 
		 if(flag) {j=1;c[0]='1';}
		 else {j=0;}
	   	 
		for(i=j,k=0;k<lenb;k++,i++)  //赋值到全局变量
			c[i]=b1[k]+'0';
			c[i]='\0';
		               }
	    else{
	    		for(i=lena-1,j=lenb-1;i>=0&&j>=0;i--,j--) {a1[i]+=b1[j];} 
		for(i=lena-1;i>=1;i--)
		  {
		  	if(a1[i]>=10) {
			   a1[i-1]+=a1[i]/10;
			   a1[i]%=10;
			  }
		  } 
		 flag=0;
		 if(a1[0]>=10) {flag=1;a1[0]%=10;}
		 
		 if(flag) {j=1;c[0]='1';}
		 else {j=0;}
	   	 
		for(i=j,k=0;k<lena;k++,i++)
			c[i]=a1[k]+'0';
			c[i]='\0';
		}				                      
	}
int main(){
	 char c1[251][120];
	 int n,i;	  
	strcpy(c1[0],"1"); 
    strcpy(c1[1],"1");
    strcpy(c1[2],"3");
 for(i=3;i<=250;i++)
 {
 	  add(c1[i-2],c1[i-1]);strcpy(c1[i],c);
	  add(c1[i],c1[i-2]);strcpy(c1[i],c);
 }
	while(~scanf("%d",&n)){printf("%s\n",c1[n]);}
return 0;
}




<think>我们正在处理华为ATC工具中关于'set_tiling_param'的问题。用户可能在使用ATC工具进行模型转换时遇到了需要设置分块参数的情况。分块(Tiling)是一种优化技术,用于将大尺寸的张量分割成小块,以便在硬件上高效处理。在华为的昇腾(Ascend)AI处理器上,设置合适的分块参数对于充分发挥硬件性能至关重要。 根据华为官方文档,`set_tiling_param`是ATC工具中用于设置分块参数的一个选项。它通常用于解决在模型转换过程中出现的错误,例如当模型中的算子输入形状过大而无法在硬件上直接处理时。通过分块,可以将大算子拆分成多个小算子,从而适应硬件的限制。 ### 如何设置分块参数 分块参数通常以JSON格式的字符串提供,其中包含需要分块的算子名称以及分块策略。常见的分块策略包括: 1. **按维度分块**:指定在某个维度上分割成多少块。 2. **固定分块大小**:指定每个分块的大小。 具体设置步骤如下: 1. **识别需要分块的算子**:首先,需要确定模型中哪些算子需要分块。通常,ATC工具在转换过程中会给出错误提示,指出哪些算子的输入形状过大。例如,如果错误信息提示“Op[Conv2D] shape[1024,1024,224,224] is too large”,则说明Conv2D算子需要分块。 2. **创建分块配置文件**:创建一个JSON文件(例如tiling.json),内容为分块参数。格式如下: ```json { "op_name": { "tiling_para": "tiling_parameter_string" } } ``` 其中: - `op_name`:算子的名称(在模型中唯一标识该算子)。 - `tiling_parameter_string`:分块参数字符串,其格式为`dims:dim_index;dim_size,dim_index;dim_size,...`,表示在指定维度(dim_index)上按照dim_size大小进行分块。也可以使用`axis:n,split:num`表示在第n维上分成num块。 示例:假设我们有一个名为`conv2d_1`的卷积算子,我们想在第0维(通常为batch维度)上分成2块,在第2维(高度)上分成3块,则可以这样写: ```json { "conv2d_1": { "tiling_para": "dims:0;2,2;3" } } ``` 或者,如果使用另一种格式(指定轴和分块数): ```json { "conv2d_1": { "tiling_para": "axis:0,split:2;axis:2,split:3" } } ``` 3. **在ATC命令中指定分块参数文件**:使用`--set_tiling_param`选项指定分块配置文件。例如: ```bash atc --model=model.onnx --output=model.om --framework=5 --soc_version=Ascend310 --set_tiling_param=./tiling.json ``` ### 注意事项 - 分块参数需要根据具体的算子类型和硬件限制进行设置。不同的算子支持的分块方式可能不同,建议参考华为官方文档中关于算子分块的说明。 - 分块不当可能导致性能下降或错误,因此需要谨慎设置。通常,分块应尽量保持连续内存访问,避免跨块依赖。 - 可以使用华为提供的调试工具(如msprof)来分析算子性能,从而调整分块参数。 如果用户没有提供具体的错误信息,建议先运行ATC工具,根据错误提示来确定需要分块的算子以及分块策略。 ### 示例场景 假设在转换一个包含大尺寸卷积的ONNX模型时,ATC报错: ``` [ERROR] OP[Conv_1] shape[1,3,4096,4096] is too large, please set tiling parameters. ``` 我们可以创建一个tiling.json文件,内容如下: ```json { "Conv_1": { "tiling_para": "dims:2;4,3;4" } } ``` 这表示在Conv_1算子的第2维(高度)上分成4块,第3维(宽度)上分成4块。然后重新运行ATC命令并指定该文件。 ### 引用说明 在昇腾处理器的架构中,分块技术是优化大张量计算的重要手段[^1]。通过合理设置分块参数,可以显著提升模型在昇腾芯片上的运行效率。 §§相关问题§§ 1. 如何确定哪些算子需要设置分块参数? 2. 分块参数设置不当会导致什么问题? 3. 除了分块参数,ATC工具还有哪些常用的优化选项? 4. 如何验证分块参数设置后的性能提升? [^1]: 华为昇腾官方文档 - 模型转换与优化指南</think>### 华为ATC工具中`set_tiling_param`分块参数设置指南 在华为昇腾(Ascend)AI处理器模型转换过程中,`set_tiling_param`用于解决大尺寸张量计算问题。当模型包含超大输入尺寸(如图像分辨率过高)或复杂算子时,需通过分块(Tiling)将计算拆分成硬件可处理的子块。 #### 核心设置步骤 1. **识别需分块的算子** ATC工具报错时会明确提示需分块的算子名称(如`Conv2D_1`)和原始张量尺寸(如`[1,3,4096,4096]`)。记录这些信息。 2. **创建JSON配置文件** 新建`tiling.json`文件,格式如下: ```json { "op_name": { "tiling_para": "dims:dim_index;tile_size,..." } } ``` - `op_name`:ATC报错中的算子名称 - `tiling_para`:分块规则,格式为`dims:维度序号;分块大小` 3. **配置分块参数示例** ```json // 将高度(第2维)分4块,宽度(第3维)分4块 { "Conv2D_1": { "tiling_para": "dims:2;4,3;4" } } ``` 4. **在ATC命令中载配置** ```bash atc --model=model.onnx \ --output=model_om \ --soc_version=Ascend310 \ --set_tiling_param=./tiling.json # 关键参数 ``` #### 分块策略设计原则 1. **硬件限制对齐** - 分块后单块尺寸需满足昇腾核心计算单元限制(如Cube Unit的`16x16x16`) - 总块数不超过硬件并行上限(通常≤4096块) 2. **内存优化** $$ \text{分块大小} = \frac{\text{张量总尺寸}}{\text{分块数}} $$ 建议分块大小接近L1缓存(如256KB)以减少访存延迟 3. **典型场景配置** | 算子类型 | 推荐分块维度 | 示例配置 | |------------|--------------|-------------------| | 卷积Conv2D | H,W维度 | `dims:2;4,3;4` | | 全连接FC | 输入/输出通道| `dims:1;8,0;16` | | 池化Pooling| H,W维度 | `dims:2;8,3;8` | #### 验证与调试 1. **检查日志** 成功分块后,ATC日志会显示: ```log [INFO] Tiling OP[Conv2D_1] with tile dims: [1024,1024] ``` 2. **性能分析** 使用`msprof`工具验证分块后性能: ```bash msprof --model=model_om --output=perf_data ``` 3. **常见错误处理** - `Invalid tiling dim` → 检查维度序号是否在张量范围内 - `Tile size mismatch` → 确保分块后总尺寸等于原尺寸 > **关键提示**:复杂模型建议先用`--op_debug_level=2`生成算子列表,再针对性设置分块[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值