Optane非易失性内存代码实测:
使用PMDK中的obj封装好的库进行:
#include <stdio.h>
#include <string.h>
#include <libpmemobj.h>
#include <fstream>
#include <iostream>
#include <math.h>
#include <mutex>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <vector>
#include <libpmem.h>
using namespace std;
POBJ_LAYOUT_BEGIN(lastfm_dataset);
POBJ_LAYOUT_ROOT(lastfm_dataset, struct MY_ROOT); //必须要定义才能够使用
// POBJ_LAYOUT_TOID(lastfm_dataset, LN) // 如何需要用其他结构体,需要在这里定义好
POBJ_LAYOUT_END(lastfm_dataset);
#define MAX_BUF_LEN 10
struct MY_ROOT {
int a;
int buf[MAX_BUF_LEN];
};
static inline int file_exists(char const *file) { return access(file, F_OK); }
int main(int argc, char *argv[])
{
char* persistent_path = "/mnt/pmem/recNVM/data/lastfm";
PMEMobjpool *pop; // 预先分配好空间
if (file_exists(persistent_path) != 0) {
pop = pmemobj_create(persistent_path, "lastfm_dataset", 8000000000,
0666); // 创建NVM的池子
if (pop == NULL)
{
perror("pmemobj_create failed\n");
exit(0);
}
} else {
pop = pmemobj_open(persistent_path, "lastfm_dataset"); //如果已经创建则直接打开
}
TOID(struct MY_ROOT) root = POBJ_ROOT(pop, struct MY_ROOT); // 创建胖指针
int buf[10];
for(int i=0; i<10; i++)
buf[i] = (i);
TX_BEGIN(pop) {
TX_MEMCPY(D_RW(root)->buf, buf, sizeof(float) * 10); //调用事务,原子性地将数据写入,其中D_RW将胖指针root转成常用瘦指针,不然不能操作
} TX_END
for(int i=0; i<10; i++){
cout<<D_RO(root)->buf[i]<<" "; // D_RO表示读数据
}
pmemobj_close(pop);
return 0;
}
网友评论