Tag: numa

如何获取指针指向的内存大小?

我目前正在研究NUMA机器。 我正在使用numa_free来释放我分配的内存。 但是,与free不同, numa_free需要知道要释放多少字节。 有没有办法知道指针指向多少字节而不追踪它?

通过延迟/性能测量确定NUMA布局

最近我一直在观察内存密集型工作负载中的性能影响,我无法解释。 试图找到底部我开始运行几个微基准测试,以确定常见的性能参数,如缓存行大小和L1 / L2 / L3缓存大小(我已经知道了,我只是想看看我的测量是否反映了实际值)。 对于缓存行测试,我的代码大致如下(Linux C,但这个概念当然与Windows等相似): char *array = malloc (ARRAY_SIZE); int count = ARRAY_SIZE / STEP; clock_gettime(CLOCK_REALTIME, &start_time); for (int i = 0; i < ARRAY_SIZE; i += STEP) { array[i]++; } clock_gettime(CLOCK_REALTIME, &end_time); // calculate time per element here: [..] 从1到128改变STEP表明从STEP=64开始,我看到每个元素的时间没有进一步增加,即每次迭代都需要获取一个主导运行时的新缓存行。 改变ARRAY_SIZE从1K到16384K保持STEP=64我能够创建一个很好的绘图,展示一个大致对应于L1,L2和L3延迟的步骤模式。 为了获得可靠的数字,有必要多次重复for循环,对于非常小的arrays大小甚至100,000次。 然后,在我的IvyBridge笔记本上,我可以清楚地看到L1结束于64K,L2处于256K,甚至L3处于6M。 现在谈谈我的真正问题:在NUMA系统中,任何一个核心都将获得远程主内存甚至共享缓存,这些缓存不一定与其本地缓存和内存一样接近。 我希望看到延迟/性能的差异,从而确定在保持快速缓存/部分内存时我可以分配多少内存。 为此,我改进了我的测试,以1/10 MB块的forms遍历内存,分别测量延迟,然后收集最快的块,大致如下: for (int chunk_start […]