分类 technique 下的文章

之前做过劫持 cuda runtime 动态链接库的事情,在这里记录一下:

cudaError_t cudaMalloc ( void** devPtr, size_t size )
{
    if(!fp) {
        fp = fopen("/home/leenldk/sc/race/ASC2021-RACE/mem.out", "w");
    }
    cudaError_t (*lcudaMalloc) (void**, size_t) = (cudaError_t (*) (void**, size_t))dlsym(RTLD_NEXT, "cudaMalloc");
    cudaError_t ret = lcudaMalloc(devPtr, size);
    printf("cudaMalloc size : %#lx %#lx\n", size, (size_t)(*devPtr));
    fprintf(fp, "cudaMalloc size : %#lx %#lx\n", size, (size_t)(*devPtr));
    fflush(fp);
    return ret;
}

编译为动态链接库,使用 LD_PRELOAD 预加载


update 2022.11.2

C++ 动态库 加载,卸载 时调用函数 :

static void init() __attribute__((constructor));
void init() {}
static void fini() __attribute__((destructor));
void fini() {}

关于

论文: Linux Block IO: Introducing Multi-queue SSD Access on
Multi-core Systems

IO 块设备的吞吐发展迅速,2012 年 SSD 4K 随机读写速度达到 785K IOPS (是不是有点高?)
SSD 随机读写速度与顺序读写持平 (不太清楚)

传统 块设备 队列优点:

  • 统一接口

    缺点:

  • 效率低,导致一些应用跳过块数据管理层
  • 单队列,单锁,造成核间竞争
  • 只有一个核处理与块设备通信,其他核需要软中断与该核通信,并且对于不同 NUMA 下的内存不友好

解决方案:

两层队列
软件队列:每个 NUMA 上 或者每个核上 一个队列
硬件队列:每个块设备上 若干队列

tag : 指示 block IO 在 driver 提交队列中的位置,在 IO 完成时指示位置

代码

hctx : hardware context

每个 request_queue 包含若干 request,包含一个 percpu 的 blk_mq_ctx (queue_ctx) ,包含若干 blk_mq_hw_ctx

每个 request 有一个 blk_mq_ctx

每个 blk_mq_hw_ctx 中包含若干 blk_mq_ctx

目前维护了 hardcoding 的 per-cpu 软件队列

使用 sbitmap 维护 pending work

struct blk_mq_hw_ctx { // include/linux/blk-mq.h
    struct {
        spinlock_t        lock;
        struct list_head    dispatch;
        unsigned long        state;        /* BLK_MQ_S_* flags */
    }
    struct blk_mq_ctx    **ctxs;
    struct blk_mq_tags    *tags; // bitmap tag
}

struct blk_mq_ctx  { // block/blk-mq.h
    unsigned int        cpu; // ctx 对应的 cpu ?
}

struct blk_mq_tags { // block/blk-mq-tag.h
    struct request **rqs; // rqs[tag] 为下标 tag 对应的 request 
}

struct request_queue { //include/linux/blkdev.h
    struct percpu_ref q_usage_counter;
    struct blk_mq_ctx __percpu    *queue_ctx; // per cpu 的本队列 context
    struct blk_mq_hw_ctx    **queue_hw_ctx; // 所有 hardware dispatch queue context ? 
    unsigned int        *mq_map; // 每个 cpu 对应的 hw_ctx 编号 ?
}
struct request { //include/linux/blkdev.h
    struct request_queue *q;
}

主机 IP

WSL 2 中虚拟机不再和主机共享网络配置,而是和主机在同一子网中
WSL 2 中获取主机 IP 可通过以下方式:

export DNS= `ip route list default | awk '{print $3}'  ` 

export DNS= `cat /etc/resolv.conf | tail -1 | cut -d ' ' -f 2` 

X11 forwarding

X11 forwarding 可以做一些好玩的事情,最简单的是 xclock 显示时钟和 xcalc 图形计算器

在之前的电脑用的是 MobaXterm 里自带的 cygwin 的 X11 forwarding 功能,在 MobaXterm 里开一个 cygwin 窗口,在 WSL 里直接 export DISPLAY=$DNS:0

新电脑想尝试一下不用 MobaXterm 的解决方案:首先装一个 win 端的 X11 服务器 VcXrv。装好后打开 XLaunch,注意打开 disable access control。 WSL 端还是 export DISPLAY=$DNS:0,即可开启X11

通过 ssh -X 将本地端口转发到远程

一些奇妙X11应用:
https://cyber.dabamos.de/unix/x11/

嵌入视频

niconico :

<iframe width="312" height="176" src='http://embed.nicovideo.jp/watch/sm34871494?persistence=1&oldScript=1&referer=&from=0&allowProgrammaticFullScreen=1'  frameborder="0"></iframe>                

bilibili :

<iframe allowFullScreen={true} width="100%" height="450" scrolling="no"
sandbox="allow-top-navigation allow-same-origin allow-forms allow-scripts"
src={`//player.bilibili.com/player.html?aid=541205956&bvid=BV1tA411q7xi&cid=208099724&page=1&as_wide=1&high_quality=1&danmaku=1`}
frameBorder="0"></iframe>

youtube :

<iframe width="1038" height="584" src="https://www.youtube.com/embed/GBS07vBBWlA" title="和楽器バンド / ロキ from 8th Anniversary Japan Tour ∞ -Infinity-" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

之前就听说实验室可以给新生配台电脑,最近感觉手里用了三年半的拯救者Y7000P大限将至:初步感觉是机械硬盘或者固态上了年头,打算直接搞一台新电脑
甘Sir说买电脑的额度是2w左右,大喜过望得搞了一台1.8w 的 2022拯救者Y9000K,做了一把冤大头

个人比较喜欢拯救者工业化和商务的风格,以及内部的细节做工。之前拆Y7000P的时候就对内存屏蔽罩和散热布局好感拉满,对比我之前的暗影精灵4属实差别很大。暗影精灵4因为我之前拆机时候的静电搞坏了一个内存槽。然后电池还因为bios的问题鼓包过。导致我从此就成了惠普黑。

Y9000K 比隔壁同配置的枪神6贵了1k,不过枪神6过于电竞风格所以不太感冒

值得一提的是联想近几年在流氓软件的道路上越走越远,预装了一个辣鸡联想浏览器以及软件管家之类的流氓产品,电脑管家和傻逼百度串通改edge主页

CPU 是 i7-12800HX, 2.3GHz
12代 intel alder lake 架构
32GB内存,自带硬盘 1TB
后来自己加了一条 1TB 的 samsung 980 PRO

硬盘的 S.M.A.R.T. 数据显示电脑在买回来的时候通电时间就有一百多个小时,unsafe shutdowns 20次
作为对比,新买的 980 PRO 通电时间4小时,unsafe shutdowns 0次
emmm,不知道之前被用来干啥了。。。

用 samsung magican 跑了一发自带硬盘 benchmark :

对比一下 980 PRO 的 benchmark 结果:

emmmm,随机读写差了将近三倍。。。
搞得我都想把 980 PRO 弄成系统盘了
想想还是不折腾了