csapp实验6-perflab实验详解

文章讨论了一次关于优化C语言程序性能的perflab实验,重点在于cache优化(如分块)、代码结构调整和内存引用减少。作者提到rotate和smooth函数的优化措施及实验分数,虽然实验感觉较为基础,但强调了对缓存敏感性的认识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

6-perflab

首先,我要吐槽这个实验,在5-cachelab中part B其实把cache优化的很好了,而这个perflab其实主要优化点还是在cache这里,特别是分块,其他新增的无非就是一些代码移动,降低内存引用之类的小优化,其实做起来没有太大感觉,感觉学不到特别多知识,我写的也较粗糙

1 简要分析

实验目的:学会优化程序性能

工作空间:kernels.c

实验内容:优化C语言程序性能,具体有:

  1. 代码移动
  2. 减少内存引用
  3. 循环展开
  4. 分块

2 具体实现

1 rotate

我做了以下优化:

  1. 移动了一些循环体内的代码
  2. 进行了一个8×8的分块

最后分数是15.5左右(他这个分数每次测试的还不一样)

void rotate(int dim, pixel *src, pixel *dst) 
{
    for (int i = 0; i < dim; i += 8){
        for (int j = 0; j < dim; j += 8){
            for (int p = i; p < i+8; p++){
                int s = p*dim;
                for (int q = j; q < j+8; q++){
                    dst[RIDX(dim-1-q, p, dim)] = src[s+q];
                }
            }
        }
    }
}

2 smooth

我只做了8×8循环展开,其实还可以循环展开之类的,由于在cachelab里已经做过了,我没继续做。但我试过用多线程或者多进程来运行,但好像有点背离实验了,只能说这个实验有点粗糙

最后分数是16.5左右

void smooth(int dim, pixel *src, pixel *dst) 
{
    for (int i = 0; i < dim; i+=8)
    {
        for (int j = 0; j < dim; j+=8)
        {
            for (int p = i; p < i+8; p++)
            {
                for (int q = j; q < j+8; q++)
                {
                    dst[RIDX(p, q, dim)] = avg(dim, p, q, src);
                }
            }
        }
    }
}
### 头歌 PerfLab 中实现旋转功能的方法 在头歌 PerfLab 实验环境中,`rotate` 函数用于图像处理中的像素矩阵旋转操作。为了高效地完成这一任务并优化性能,可以遵循以下指导原则: #### 1. 理解 `rotate` 的基本逻辑 `rotate` 功能通常涉及将二维数组(代表图像)顺时针或逆时针旋转一定角度。最常见的是90度、180度和270度的旋转。 对于简单的90度顺时针旋转,可以通过逐层交换四个角上的元素来实现[^1]。具体来说,外层循环控制层数,而内层循环负责同一层内的元素移动。 #### 2. 关注内部循环优化 由于 `smooth` 是一个更计算密集型的操作,因此其优化策略可能不适合直接应用于 `rotate` 。然而,在 `rotate` 的情况下,仍然应该注意对频繁执行的部分进行优化。例如,减少不必要的内存访问次数,尽可能使用寄存器变量存储临时数据等[^3]。 #### 3. 使用适当的数据结构 选择合适的数据表示形式有助于简化算法设计并提高效率。比如采用一维数组模拟多维空间布局,这样可以在一定程度上降低地址计算复杂度。 #### 4. 边界条件处理 当处理非正方形图片或其他特殊情况时,务必考虑好边界情况下的行为定义。这不仅影响到最终结果的正确性,也可能成为潜在瓶颈所在之处[^2]。 下面给出一段 Python 版本的简单示例代码展示如何实现90度顺时针方向的图像旋转: ```python def rotate(matrix): n = len(matrix) # Transpose the matrix first. for i in range(n): for j in range(i, n): temp = matrix[i][j] matrix[i][j] = matrix[j][i] matrix[j][i] = temp # Reverse each row after transposition to achieve clockwise rotation. for i in range(n): matrix[i].reverse() ``` 此段代码首先转置给定方阵,接着反转每一行以达到整体右旋的效果。实际应用中可根据需求调整细节部分。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值