minor
[charm.git] / src / arch / pami-bluegeneq / memalloc.c
1
2 #include <converse.h>
3
4 #define ALIGNMENT        64
5 #define SMSG_SIZE        4096
6 #define N_SMSG_ELEM      512
7 #define LMSG_SIZE        16384
8 #define N_LMSG_ELEM      128
9
10 L2AtomicQueue *sL2MemallocVec;
11 L2AtomicQueue *bL2MemallocVec;
12
13 typedef struct CmiMemAllocHdr_bgq_t {
14   int rank;
15   int size;
16   //Align the application buffer to 32 bytes
17   char dummy[ALIGNMENT - sizeof(CmiChunkHeader) - 2*sizeof(int)];
18 } CmiMemAllocHdr_bgq;
19
20 static int _nodeStart;
21
22 void *CmiAlloc_bgq (int size) {
23   CmiMemAllocHdr_bgq *hdr = NULL;
24   char *buf;
25   
26   int myrank = Kernel_ProcessorID() - _nodeStart;
27
28   if (size <= SMSG_SIZE) {
29     hdr = L2AtomicDequeue (&sL2MemallocVec[myrank]);
30     if (hdr == NULL) 
31       hdr = (CmiMemAllocHdr_bgq *)
32         //malloc_nomigrate(SMSG_SIZE + sizeof(CmiMemAllocHdr_bgq));      
33         memalign(ALIGNMENT, SMSG_SIZE + sizeof(CmiMemAllocHdr_bgq));      
34
35     hdr->size = SMSG_SIZE;
36   }
37   else if (size <= LMSG_SIZE) {
38     hdr = L2AtomicDequeue (&bL2MemallocVec[myrank]);
39     if (hdr == NULL) 
40       hdr = (CmiMemAllocHdr_bgq *)
41         //malloc_nomigrate(LMSG_SIZE + sizeof(CmiMemAllocHdr_bgq));      
42         memalign(ALIGNMENT, LMSG_SIZE + sizeof(CmiMemAllocHdr_bgq));  
43     hdr->size = LMSG_SIZE;
44   }
45   else {
46     hdr = (CmiMemAllocHdr_bgq *)
47       //malloc_nomigrate(size + sizeof(CmiMemAllocHdr_bgq));      
48       memalign(ALIGNMENT, size + sizeof(CmiMemAllocHdr_bgq));
49     hdr->size = size;
50   }
51
52   hdr->rank = myrank;
53   buf = (char*)hdr + sizeof(CmiMemAllocHdr_bgq);
54
55   return buf;
56 }
57
58 void CmiFree_bgq (void *buf) {
59   CmiMemAllocHdr_bgq *hdr = (CmiMemAllocHdr_bgq *)((char*)buf - sizeof(CmiMemAllocHdr_bgq));  
60   int rc = L2A_EAGAIN;
61   
62   if (hdr->size == SMSG_SIZE) 
63     rc = L2AtomicEnqueue (&sL2MemallocVec[hdr->rank], hdr);
64   else if (hdr->size == LMSG_SIZE)
65     rc = L2AtomicEnqueue (&bL2MemallocVec[hdr->rank], hdr);
66
67   if (rc == L2A_EAGAIN)
68     //queues are full or large buf
69     free_nomigrate(hdr);
70 }
71
72
73 void CmiMemAllocInit_bgq (void   * l2mem,
74                           size_t   l2memsize) 
75 {
76   int i = 0;
77   int node_size = 64/Kernel_ProcessCount();
78   _nodeStart = node_size * Kernel_MyTcoord();
79   //We want to align headers to 32 bytes
80   CmiAssert(sizeof(CmiMemAllocHdr_bgq)+sizeof(CmiChunkHeader) == ALIGNMENT);
81
82   CmiAssert (l2memsize >= 2 * node_size * sizeof(L2AtomicState));
83   sL2MemallocVec = (L2AtomicQueue *)malloc_nomigrate(sizeof(L2AtomicQueue)*node_size);
84   bL2MemallocVec = (L2AtomicQueue *)malloc_nomigrate(sizeof(L2AtomicQueue)*node_size);
85
86   for (i = 0; i < node_size; ++i) {
87     L2AtomicQueueInit ((char *)l2mem + 2*i*sizeof(L2AtomicState),
88                        sizeof(L2AtomicState),
89                        &sL2MemallocVec[i],
90                        0, /*No Overflow*/
91                        N_SMSG_ELEM /*512 entries in short q*/);
92
93     L2AtomicQueueInit ((char *)l2mem + (2*i+1)*sizeof(L2AtomicState),
94                        sizeof(L2AtomicState),
95                        &bL2MemallocVec[i],
96                        0,
97                        N_LMSG_ELEM /*128 entries in long q*/);
98   }
99 }
100