void tets(void) { StatisticsInfo *info = statistics_create(NULL); CU_ASSERT_NOT_EQUAL(info, NULL); CU_ASSERT_EQUAL(info->clock_counter, 0); CU_ASSERT_EQUAL(info->write_counter, 0); statistics_add_counter(info, 5); CU_ASSERT_EQUAL(info->clock_counter, 5); statistics_add_counter(info, 6); CU_ASSERT_EQUAL(info->clock_counter, 11); statistics_add_write(info); CU_ASSERT_EQUAL(info->write_counter, 1); CU_ASSERT_EQUAL(statistics_free(info), NULL); }
/*! Функция записи в кеш в случае отложенной записи */ static void direct_cache_wb_write(AbstractMemory *m, memaddr_t addr, int size, const MemoryCell *src) { DirectCache *c = (DirectCache*) m; memaddr_t aligned_addr = addr & -c->block_size; statistics_add_counter(c->b.info, c->cache_write_time); DirectCacheBlock *b = direct_cache_find(c, aligned_addr); if (!b) { b = direct_cache_place(c, aligned_addr); b->addr = aligned_addr; c->mem->ops->read(c->mem, aligned_addr, c->block_size, b->mem); } memcpy(b->mem + (addr - aligned_addr), src, size * sizeof(b->mem[0])); b->dirty = 1; }
/*! Функция записи в кеш в случае сквозной записи \param m Указатель на структуру описания модели полноассоциативного кеша (в виде указателя на базовую структуру) \param addr Адрес в полноассоциативном кеше \param size Количество записываемых ячеек \param src Указатель, откуда копировать ячейки в полноассоциативного кеша */ static void full_cache_wt_write( AbstractMemory *m, memaddr_t addr, int size, const MemoryCell *src) { FullCache *c = (FullCache*) m; memaddr_t aligned_addr = addr & -c->block_size; FullCacheBlock *b = full_cache_find(c, aligned_addr); statistics_add_counter(c->b.info, c->cache_write_time); if (b) { memcpy(b->mem + (addr - aligned_addr), src, size * sizeof(b->mem[0])); } c->mem->ops->write(c->mem, addr, size, src); }
/*! Функция записи в кеш в случае отложенной записи \param m Указатель на структуру описания модели полноассоциативного кеша (в виде указателя на базовую структуру) \param addr Адрес в полноассоциативном кеше \param size Количество записываемых ячеек \param src Указатель, откуда копировать ячейки в полноассоциативного кеша */ static void full_cache_wb_write( AbstractMemory *m, memaddr_t addr, int size, const MemoryCell *src) { FullCache *c = (FullCache*) m; memaddr_t aligned_addr = addr & -c->block_size; statistics_add_counter(c->b.info, c->cache_write_time); FullCacheBlock *b = full_cache_find(c, aligned_addr); if (!b) { b = c->full_ops.cache_place(c, aligned_addr); } memcpy(b->mem + (addr - aligned_addr), src, size * sizeof(b->mem[0])); b->dirty = 1; }
/*! Прочитать ячейки из полноассоциативного кеша \param m Указатель на структуру описания модели полноассоциативного кеша (в виде указателя на базовую структуру) \param addr Адрес в полноассоциативном кеше \param size Количество считываемых ячеек \param dst Указатель, куда копировать ячейки из полноассоциативного кеша */ static void full_cache_read( AbstractMemory *m, memaddr_t addr, int size, MemoryCell *dst) { FullCache *c = (FullCache*) m; memaddr_t aligned_addr = addr & -c->block_size; statistics_add_counter(c->b.info, c->cache_read_time); FullCacheBlock *b = full_cache_find(c, aligned_addr); if (b) { statistics_add_hit_counter(c->b.info); } else { b = c->full_ops.cache_place(c, aligned_addr); } if (dst) { // выполняем копирование данных: memcpy(dst, b->mem + (addr - aligned_addr), size * sizeof(b->mem[0])); } }