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");}





原创粉丝点击