numa的内存按节点分配和线程绑定
来源:互联网 发布:isql 连接数据库 编辑:程序博客网 时间:2024/06/05 18:50
前段时间在做1.5亿条数据的比对, 需要多线程和内存的访问问题, 由于内存的访问与numa节点的分配有关,即:cpu访问本地节点的内存速度要快。
现将numa的几个库函数做一下说明:
int main(){if(numa_available()<0){printf("your system does not support numa api \n");return -3;}int numcpus=numa_num_task_cpus();//returns the number of cpus that the calling task is allowed to usenuma_set_localalloc();//sets the memory allocation policy for the calling task to local allocation.bitmask* bm = numa_bitmask_alloc(numcpus);int NodeNumber=numa_max_node();for(int numnuma=0;numnuma<=NodeNumber;numnuma++){numa_node_to_cpus(numnuma, bm);//converts a node number to a bitmask of CPUsstd::cout<< "numa node " << numnuma << " " << "bm->size "<<bm->size <<" *bm->maskp "<< std::hex <<*bm->maskp<< " " <<std::dec<< numa_node_size(numnuma, 0) << std::endl; float *m_FeaBuf1 = (float*)numa_alloc_onnode(100,numnuma); } numa_free(m_FeaBuf1,100); }
numa_available(): 判断你电脑支持不支持numa, 不过貌似linux 2.4以后的都支持;numa_num_task_cpus(): 得到电脑可用的cpu数量;numa_bitmask_alloc(): 创建cpu的bitmask;numa_max_node(): 得到最大节点的numa的id;numa_node_to_cpus(): 得到每个节点的cpu的bitmask, 每一位代表一个cpu;numa_node_size():返回节点占用内存的大小。numa_alloc_onnode(): 在指定节点上分配内存,主要要用numa_free()来释放内存;
运行上面代码后, 我自己电脑得到的结果如下, 我电脑是只有一个numa节点,8cpu, 16G内存。
numa node 0 bm->size 8 *bm->maskp ff 16760360960
8个cpu用ff来表示, 每一位表示一个cpu 从0---7;
如此得到每个cpu在哪个节点上的信息, 便可以将创建的线程,绑定到指定的cpu上, 从而实现cpu访问本地节点的内存, 达到性能的提升。cpu_set_t mask;CPU_ZERO(&mask);CPU_SET(cpuIndex,&mask);if(pthread_setaffinity_np(pthread_self(),sizeof(mask),&mask)<0){perror("pthread_setaffinity_np failed");}
阅读全文
0 0
- numa的内存按节点分配和线程绑定
- numa,numa node 和物理内存
- 申请和device不再同一个numa节点的memory
- 线程安全和内存分配
- NUMA节点的使用顺序配置
- Linux NUMA memory policy(内存分配策略)
- 嵌入式操作系统内核原理和开发(基于链表节点的内存分配算法)
- 内存学习1 UMA和NUMA
- 内存的堆分配和栈分配
- 内存的堆分配和栈分配
- 内存的堆分配和栈分配
- 内存的堆分配和栈分配
- 内存的堆分配和栈分配
- 内存的分配和回收
- 内存池(节点分配)
- UltraWebTree的递归绑定和节点拖动
- 堆内存和栈内存的分配
- JVM 的内存结构和内存分配
- cocos2dx项目在XCode9下ntfw代替system
- 差分隐私及其在位置隐私保护的应用
- C++ memset() 只能初始化为0或-1
- iptables简单一些的用法
- 文件系统操作命令(打包,压缩,传输)
- numa的内存按节点分配和线程绑定
- Http协议详解
- Linux/CentOS环境下如何安装和配置PhantomJS工作环境
- java中Scanner类nextLine()和next()的区别和使用方法
- hihocoder 1142(三分)
- eclipse查看一个方法被谁引用(调用)的快捷键四种方式
- rvm use 经常报错,找不到命令
- android studio 性能分析工具总结
- Android Anim动画