Tomasulo算法在循环中的性能分析:时钟周期与指令调度

需积分: 0 0 下载量 152 浏览量 更新于2024-08-05 收藏 143KB PDF 举报
在这个关于Tomasulo算法的练习中,学生需要分析PB17000297罗晏宸在2020年4月的Homework4,具体是Exercise3.15。该任务涉及一个非流水化MIPS微处理器架构,采用Tomasulo算法的单发射变体来执行一个循环,用于处理连续的乘法和加法操作。循环的目标是计算数组a与数组X和Y的元素相乘并累加的结果。 循环的核心功能单元包括一个整数加法器(DADDIU),浮点乘法器(MUL.D),浮点加法器(ADD.D),以及数据加载和存储单元。由于存在共享数据总线(CDB)且没有流水线化,指令执行流程如下: 1. **功能单元类型和配置**: - EX:执行单元,负责有效地址计算和存储器访问。 - IF/ID/IS/EX/WB:流水线阶段,IF(指令解析)、ID(指令解码)、IS(指令发射)、EX(执行)、WB(写回)。 - 没有转发,数据通过CDB传递。 - 保留站数限制了流水线容量。 - 流水线延迟考虑:载入指令需1周期,发射和写回各需1周期。 2. **循环结构**: - 循环体内的指令依次执行,每轮迭代执行8个步骤。 - 需要注意的是,循环从第二个指令开始,因为第一条指令(DADDIU R4, R1, #800)被忽略了。 3. **指令执行分析**: - 指令执行顺序和时钟周期如下: - 第二条指令(L.D F2, 0(R1)):载入X(i),停顿周期=1,进入EX周期1。 - 第三条指令(MUL.D F4, F2, F0):乘法运算,停顿周期=2,进入EX周期2。 - 第四条指令(L.D F6, 0($2)):载入Y(i),停顿周期=3,进入EX周期3。 - 第五条指令(ADD.D F6, F4, F6):加法运算,停顿周期=4,进入EX周期4。 - 第六条指令(S.D 0(R2), F6):存储Y(i),停顿周期=5,进入EX周期5。 - 第七条指令(DADDIU R1, R1, #8):增加X索引,停顿周期=6,进入EX周期6。 - 第八条指令(DADDIU R2, R2, #8):增加Y索引,停顿周期=7,进入EX周期7。 - 第九条指令(SGTIU R3, R1, R4):条件测试,停顿周期=8,进入EX周期8。 - 第十条指令(BEQZ R3, foo):循环条件判断,停顿周期取决于测试结果。 4. **时钟周期计算**: - 第1次迭代:由于从第二条指令开始,实际执行时间为9个时钟周期(1-8,不包括发射阶段)。 - 后续两次迭代:每次循环增加一个乘法和两个加法指令的停顿时间,所以第二次迭代需要12个周期,第三次迭代需要15个周期。 5. **表格表示**: - 创建一个表格,包括迭代次数、指令名称、发射周期、执行周期、存储器访问周期、写入CDB周期以及注释(说明等待事件)。 通过以上分析,可以清晰地看到每个指令在不同阶段的延迟和执行情况,这对于理解Tomasulo算法在非流水化系统中的性能表现和优化至关重要。学生需要根据这些信息填充表格,并总结出整个循环的总时钟周期数。

Configure pins as * Analog * Input * Output * EVENT_OUT * EXTI */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ //__HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); //__HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(LEDR_OUT_PD3_GPIO_Port, LEDR_OUT_PD3_Pin, GPIO_PIN_SET); /*Configure GPIO pin Output Level */ //HAL_GPIO_WritePin(GPIOB, RS485_RE_OUT_PB8_Pin|RS485_SE_OUT_PB9_Pin, GPIO_PIN_RESET); /*Configure GPIO pin : LEDR_OUT_PD3_Pin */ GPIO_InitStruct.Pin = LEDR_OUT_PD3_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(LEDR_OUT_PD3_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pins : RS485_RE_OUT_PB8_Pin RS485_SE_OUT_PB9_Pin */ GPIO_InitStruct.Pin = RS485_RE_OUT_PB8_Pin|RS485_SE_OUT_PB9_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @param file: The file name as string. * @param line: The line in file as a number. * @retval None */ void _Error_Handler(char *file, int line) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ while(1) { } /* USER CODE END Error_Handler_Debug */

2023-07-14 上传