Re: numa_alloc_onnode does not allocate on node passed as argument
Andres Nötzli <[email protected]> Wed, 22 Oct 2014 09:40:37 -0700
| Newsgroups | org.kernel.vger.linux-numa |
|---|---|
| Message-ID | <[email protected]> |
Hi Elena, Thank you very much for your quick reply! numa_set_strict(1) and numa_s= et_strict(0) both result in the wrong output. I did not change the defa= ult policy. numa_get_membind returns 1 for all nodes before and after numa_run_on_n= ode. numa_get_interleave_mask returns 0 for all nodes. numa_get_run_node_mask is all 1s before and 0010 after numa_run_on_node= =2E The machine config (the CPUs are all Intel(R) Xeon(R) CPU E5-4657L v2 @= 2.40GHz): $ numactl --hardware available: 4 nodes (0-3) node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 48 49 50 51 52 53 54 55 56 57 58= 59 node 0 size: 262093 MB node 0 free: 966 MB node 1 cpus: 12 13 14 15 16 17 18 19 20 21 22 23 60 61 62 63 64 65 66 6= 7 68 69 70 71 node 1 size: 262144 MB node 1 free: 82 MB node 2 cpus: 24 25 26 27 28 29 30 31 32 33 34 35 72 73 74 75 76 77 78 7= 9 80 81 82 83 node 2 size: 262144 MB node 2 free: 102 MB node 3 cpus: 36 37 38 39 40 41 42 43 44 45 46 47 84 85 86 87 88 89 90 9= 1 92 93 94 95 node 3 size: 262144 MB node 3 free: 113 MB node distances: node 0 1 2 3=20 0: 10 20 30 20=20 1: 20 10 20 30=20 2: 30 20 10 20=20 3: 20 30 20 10=20 Thanks again, Andres > On 22 Oct 2014, at 06:12, Elena Ufimtseva <[email protected]> wrote= : >=20 > On Tue, Oct 21, 2014 at 11:47 PM, Andres N=C3=B6tzli <noetzli@stanfor= d.edu> wrote: >> Hi everyone, >>=20 >> I am experiencing a weird problem. When using numa_alloc_onnode repe= atedly to allocate memory, it does not allocate memory on the node pass= ed as an argument. >>=20 >> Sample code: >> #include <numa.h> >> #include <numaif.h> >> #include <iostream> >> using namespace std; >>=20 >> void find_memory_node_for_addr(void* ptr) { >> int numa_node =3D -1; >> if(get_mempolicy(&numa_node, NULL, 0, ptr, MPOL_F_NODE | MPOL_F_AD= DR) < 0) >> cout << "WARNING: get_mempolicy failed" << endl; >> cout << numa_node << endl; >> } >>=20 >> int main() { >> int64_t* x; >> int64_t n =3D 5000; >> //numa_set_preferred(1); >>=20 >> numa_run_on_node(2); >> for(int i =3D 0; i < 20; i++) { >> size_t s =3D n * sizeof(int64_t); >> x =3D (int64_t*)numa_alloc_onnode(s, 1); >> for(int j =3D 0; j < n; j++) >> x[j] =3D j + i; >> find_memory_node_for_addr(x); >> } >>=20 >> return 0; >> } >>=20 >> Output: >> 1 >> 1 >> 1 >> 2 >> 1 >> 2 >> 1 >> 2 >> 1 >> 2 >> 1 >> 2 >> 1 >> 2 >> 1 >> 2 >> 1 >> 2 >> 1 >> 2 >>=20 >> When uncommenting the line "numa_set_preferred(1);=E2=80=9D, the out= put is all 1s as expected. Am I doing something wrong? Have you seen si= milar issues? >>=20 >> I am running Ubuntu 12.04.5 LTS: >> $ cat /proc/version >> Linux version 3.2.0-29-generic (buildd@allspice) (gcc version 4.6.3 = (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #46-Ubuntu SMP Fri Jul 27 17:03:23 UTC= 2012 >>=20 >> I am using libnuma 2.0.10 but I=E2=80=99ve had the same problem with= 2.0.8~rc3-1. >>=20 >> Thank you very much, >> Andres >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-numa= " in >> the body of a message to [email protected] >> More majordomo info at http://vger.kernel.org/majordomo-info.html >=20 > Hi Andres >=20 > Can you try to use strict policy by calling numa_set_strict? >=20 > If you comment out setting the preferred node, the default policy is > in action (I assume you did no change it, not for the process, not > system wide) which is preferred also. > But here you set preferred to a specific node and manual says, the > default for process is to allocate on the node it runs. > So I wonder what is the cpu affinity for this process looks like... > Also maybe just to confirm you can check the policy from within your > running code? >=20 > Can you also post the machine NUMA config? >=20 > --=20 > Elena