numa的内存按节点分配和线程绑定

前段时间在做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 "<size <<" *bm->maskp  "<< std::hex <<*bm->maskp<< " " <
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");
			}







你可能感兴趣的:(C++程序)