前段时间在做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 use
numa_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 CPUs
std::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");
}
本文介绍如何使用NUMA技术优化大规模数据处理任务,通过合理分配内存资源提高CPU访问效率。文中详细解释了核心函数如numa_available()、numa_num_task_cpus()等的功能,并展示了实际代码示例。

3210

被折叠的 条评论
为什么被折叠?



