解析GPU cache 中读写操作及其事件

本文详细介绍了基于GPGPU-SIM代码实现的缓存管理技术,包括无写回策略及写回策略下的读请求处理流程,以及如何向更低层级的缓存或内存发送写请求。这些技术对于理解高性能计算中缓存的行为至关重要。

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

基于GPGPU-SIM代码,对读写操作进行解析

1.对于cache不应用写回策略的发送读请求

/// Read miss handler without writeback
void baseline_cache::send_read_request(new_addr_type addr, new_addr_type block_addr, unsigned cache_index, mem_fetch *mf,
        unsigned time, bool &do_miss, std::list<cache_event> &events, bool read_only, bool wa){

    bool wb=false;
    cache_block_t e;
    send_read_request(addr, block_addr, cache_index, mf, time, do_miss, wb, e, events, read_only, wa);
}

2.对于cache 应用写回策略的发送读请求

/// Read miss handler. Check MSHR hit or MSHR available
///检查MSHR是否命中,或者满

void baseline_cache::send_read_request(new_addr_type addr, new_addr_type block_addr, unsigned cache_index, mem_fetch *mf,
        unsigned time, bool &do_miss, bool &wb, cache_block_t &evicted, std::list<cache_event> &events, bool read_only, bool wa){

    bool mshr_hit = m_mshrs.probe(block_addr);
    bool mshr_avail = !m_mshrs.full(block_addr);
    if ( mshr_hit && mshr_avail ) {
        if(read_only)
            m_tag_array->access(block_addr,time,cache_index);
        else
            m_tag_array->access(block_addr,time,cache_index,wb,evicted);

        m_mshrs.add(block_addr,mf);
        do_miss = true;
    } else if ( !mshr_hit && mshr_avail && (m_miss_queue.size() < m_config.m_miss_queue_size) ) {
        if(read_only)
            m_tag_array->access(block_addr,time,cache_index);
        else
            m_tag_array->access(block_addr,time,cache_index,wb,evicted);

        m_mshrs.add(block_addr,mf);
        m_extra_mf_fields[mf] = extra_mf_fields(block_addr,cache_index, mf->get_data_size());
        mf->set_data_size( m_config.get_line_sz() );
        m_miss_queue.push_back(mf);
        mf->set_status(m_miss_queue_status,time);
        if(!wa)
            events.push_back(READ_REQUEST_SENT);
        do_miss = true;
    }
}

3.向下级 cache or memory 发送写请求

/// Sends write request to lower level memory (write or writeback)
void data_cache::send_write_request(mem_fetch *mf, cache_event request, unsigned time, std::list<cache_event> &events){
    events.push_back(request);
    m_miss_queue.push_back(mf);
    mf->set_status(m_miss_queue_status,time);
}

### Linux 缓冲区缓存机制及其性能优化 Linux 的缓冲区缓存(Buffer Cache)是一种用于提高文件 I/O 性能的内存管理技术。它通过将磁盘上的数据临时存储到内存中来减少频繁访问硬盘的需求,从而提升整体系统效率。 #### 缓冲区缓存的工作原理 缓冲区缓存主要用于处理块设备的数据读写操作。当应用程序请求从磁盘读取数据时,操作系统会先检查该数据是否已经存在于缓冲区缓存中。如果存在,则直接返回缓存中的数据而无需再次访问磁盘[^2]。这种行为显著减少了磁盘 I/O 开销并提高了响应速度。 对于写入操作而言,在某些情况下并不会立即将修改后的数据同步回磁盘;而是暂时保存于缓冲区内等待适当时间后再批量提交至永久储存介质上完成实际更新过程——这种方式被称为延迟写策略(deferred write strategy). #### 解决与缓冲区缓存相关的性能问题的方法 1. **合理利用缓存行大小** 考虑到 CPU 高速缓存是以固定长度 (通常是64字节) 作为基本单元进行加载和存储操作这一特性,在设计程序结构或者调整硬件配置参数时候应该尽量使连续访问地址范围内的有效信息量接近甚至刚好填满整个cache line以便充分利用有限资源降低miss rate进而达到加速目的. 2. **避免动态更改渲染目标** 移动端图形处理器(Mobile GPU) 对于render buffer的表现较差。因此不建议频繁地丢弃旧的目标然后再创建新的目标(discard old targets then create new ones),因为这可能会引起不必要的开销影响最终呈现效果的质量以及流畅度等方面表现不佳的情况发生 。相反有时候简单执行一次清除命令clear render buffers反而有助于改善状况因为它允许GPU快速标记这些区域为空闲状态同时还能更好地对其进行内部管理工作流程安排等等好处多多[^1]. 3. **代码层面的具体实践案例分析** 下面给出了一段来自linux kernel源码片段展示如何解析字符串形式表示的大整数值转换成相应类型的变量实例说明如下所示: ```c unsigned long long memparse(char *ptr, char **retptr); ``` 此函数接受两个指针类型参数分别为输入待解析字符序列起始位置以及输出剩余未匹配部分首址所在处所指向的位置经过一系列逻辑判断之后成功得到对应的结果值即以十进制数表达方式记录下来的物理内存容量大小单位通常为bytes等标准计量尺度之一[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值