nju-projectn / am-kernels Goto Github PK
View Code? Open in Web Editor NEWAbstractMachine kernels
License: Other
AbstractMachine kernels
License: Other
WSL 版本: 2.1.5.0 ===》 Ubuntu22.04
内核版本: 5.15.146.1-2
WSLg 版本: 1.0.60
MSRDC 版本: 1.2.5105
Direct3D 版本: 1.611.1-81528511
DXCore 版本: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows 版本: 10.0.22621.3296
这是在提前make clean-all abstract-machine的情况
再一次执行,却没有重新编译,至少应该要重新编译一下trm.c
位置在am-kernels/benchmarks/microbench/src/bench.c
13 static char *format_time(uint64_t us) {
14 static char buf[32];
15 uint32_t ms = us / 1000;
16 us -= ms * 1000;
17 assert(us < 1000);
...
当us的值超过UINT32_MAX时,十六行的ms*1000
就可能发生整数溢出,导致17行的断言被触发
直接改成(uint64_t) ms*1000
即可
虽然说benchmark跑四千多秒好像没什么意义,但是这里有个大冤种跑超时了
#5 中提到了 PA2 中 nemu 实现声卡的问题。固然进程间加锁超出了 ICS 课程的范围,但是作为封装良好的开源库,SDL 在手册中给定了使用规范和约束:
SDL_OpenAudio
Description
desired->callback
... This function usually runs in a separate thread, and so you should protect data structures that it accesses by calling
SDL_LockAudio
andSDL_UnlockAudio
in your code. ...
是故学生不需要理解其原理,造成噪声等问题的原因是未按照手册要求使用 API。学生不需要使用朴素的进程锁,只需要严格按照要求调用 SDL 的 API LockAudio
和 UnlockAudio
即可。
这是一次很好的训练,告知学生使用库函数时不可凭空猜测其用法,而是应当仔细阅读文档。经过测试,在没有进行同步时,遇到噪音的可能性是不小的,学生大概率会遇到这个问题。可以在讲义中添加仔细阅读 SDL 文档的提示。任何认真阅读了 SDL_OpenAudio
文档的学生尽管可能不能理解问题的本质,但是应该有能力正确实现 API。如此一来,也不需要对框架代码进行修改(虽然似乎 am_native 也没有正确实现)。
添加的提示可以是:
!!! 在播放音乐的时候出现不明噪声
原因可能是没有严格遵守 SDL 的 API 规范。在 [SDL 库的文档](https://wiki.libsdl.org/SDL2/CategoryAPI)中提及了 SDL 库的 API 的使用规范和约束。使用库函数时,**任何未满足规范和约束的使用的结果是未知的**。请确保仔细阅读文档并严格满足 API 规范和约束。
test_data[]乘法结果似乎和ans[]对应不上,导致测试失败。
update
里的canvas[x][y] = p(init + step / 2);
,按照int x1 = x + dx[d], y1 = y + dy[d];
以及dx
, dy
数组的初始值,应该是canvas[y][x]
?
通过查阅手册得知,SDL 音频系统在一个单独的线程中运行,不时回调 NEMU audio.c 中我们自己定义的回调函数填充缓冲区。这个函数在读完缓冲区的时候应该会修改 reg_count。而与此同时,主线程中,如果 NEMU 中的 AM 程序刚好写完缓冲区,两个线程同时修改 reg_count,这会造成冲突。(这个分析可能有问题)
我在实现声卡时加了锁,但是有一位同学实现时没有加锁,仍然能够成功运行。
只是好奇,这样究竟会不会出现冲突的问题?
对于声卡缓冲区的实现(如果不改寄存器定义),理解是 AM 自己维护写指针,NEMU 维护读指针,两者共同维护 reg_count。AM 将写指针减去 reg_count 得读指针,NEMU 将读指针加上 reg_count 得写指针。
我去确认了一下,确实是可能多线程同时操作,理论上确实是需要加锁,因为可能出现并发冲突。
但是对于ICS来说锁超纲了所以框架默认没加,加上声卡这部分这个不加锁触发并发冲突问题这个几率不大,加上即使出现也只是偶发的声音失真,所以不加这部分功能实现也没事。
王慧妍
由于加锁涉及多个项目,而且需要更改讲义内容。我先提 Issue。如果可以,我也可以提 PR。
查看了针对 riscv32 指令集, cpu-tests下生成的反汇编结果, 缺少对以下 指令 的覆盖
slti
sltiu
ori
bgeu
lb
mulhsu
mulhu
divu
remu
感觉尤其要添加覆盖测试的是 mulhsu
,因为它的实现是 non trivial 的
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.