将页面预取到 RAM

如何解决将页面预取到 RAM

我正在编写一个高度优化的 AVL 树,现在我决定处理在插入过程中遇到的多个页面错误。原来,我只是试图访问另一个产生页面错误的页面。我尝试在插入代码的不同位置以多种组合使用 gcc 的内置预取函数,但没有成功摆脱它们。我还尝试通过执行 *ptr = *ptr 进行一些试验,看看它是否会产生任何影响(ptr 是我想要访问的指针,它每隔一段时间就会产生一个页面错误)。
更多背景:我使用 malloc 来获取 AVL 树的内存,然后在内存中“前进”(如“每个新插入都以线性顺序添加一个新节点”)。因此,很自然地,每次 x 插入我都试图访问一个新页面,从而产生一个页面错误。我尝试预取指针本身和指针后几个字节的指针(以确保它在新页面上),我尝试将预取的指针对齐到 64 字节。也许内置的预取指令只适用于缓存而不实际加载页面,我不知道。
目标是在访问该页面之前将该页面放入内存中,这样我就不会出现页面错误并减慢速度(每次测试进行数百万次插入,因此实际上每隔一段时间实际上变得非常频繁并且出现大量数字)。
GCC 9.2.0 目标 mingw32,Windows 10 64 位
代码:

struct net_avl_node {
  int sfd;
  int balance;
  void (*value)(int);
  struct net_avl_node* restrict parent;
  struct net_avl_node* restrict left;
  struct net_avl_node* restrict right;
};

struct net_avl_tree {
  struct net_avl_node** parts;
  struct net_avl_node* restrict head;
  struct net_avl_node* last;
  uint32_t count;
  uint32_t amount;
  uint32_t max_items_per_part;
};

int net_avl_insert(struct net_avl_tree* const tree,const int sfd,void (*callback)(int)) {
  void* restrict ptr;
  struct net_avl_node* restrict node = tree->head;
  struct net_avl_node* restrict temp;
  if(tree->amount == 0) { // first object becomes the head
    ptr = malloc(sizeof(struct net_avl_node*));
    if(ptr == NULL) {
      return ENOMEM;
    }
    tree->parts = ptr;
    ptr = malloc(sizeof(struct net_avl_node) * tree->max_items_per_part);
    if(ptr == NULL) {
      free(tree->parts);
      return ENOMEM;
    }
    //memset(ptr,sizeof(struct net_avl_node) * tree->max_items_per_part);
    // didn't change anything
    tree->parts[0] = ptr;
    tree->parts[0][0] = (struct net_avl_node) {
      .sfd = sfd,.balance = 0,.value = callback,.parent = NULL,.left = NULL,.right = NULL
    };
    tree->count = 1;
    tree->amount = 1;
    tree->head = tree->parts[0];
    tree->last = tree->parts[0];
    return 0;
  } else if(tree->count % tree->max_items_per_part == 0) { // make more space if lacking memory
    /* ... */
  }
  /*
  grab the next node (no gaps between them so going
  from the lowest address to the highest linearly,thus going to a new page once a while)
  */
  temp = ++tree->last;
  ++tree->count;
  while(1) {
    if(sfd > node->sfd) {
      if(node->right != NULL) {
        node = node->right;
      } else {
        *temp = (struct net_avl_node) { // a page fault
          .sfd = sfd,.parent = node,.right = NULL
        };
        node->right = temp;
        /* ... */
        break;
      }
    } else {
      if(node->left != NULL) {
        node = node->left;
      } else {
        *temp = (struct net_avl_node) { // a page fault
          .sfd = sfd,.right = NULL
        };
        node->left = temp;
        /* ... */
        break;
      }
    }
  }
  /* rebalancing */
  return 0;
}

我也在使用 -O3 -Wall -lpsapi -Wno-missing-braces -Wmissing-field-initializers -D_GNU_SOURCE 标志。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res