Skip to content

Commit 29676d2

Browse files
author
KolKir
committed
Change system dependent aligned alloc to std
1 parent e7449ef commit 29676d2

13 files changed

Lines changed: 43 additions & 288 deletions

‎include/cpptask/Unix/alignedalloc.h‎

Lines changed: 0 additions & 78 deletions
This file was deleted.

‎include/cpptask/Win/alignedalloc.h‎

Lines changed: 2 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -28,117 +28,12 @@
2828
#ifndef _ALIGNED_ALLOC_H_
2929
#define _ALIGNED_ALLOC_H_
3030

31-
#include <stdlib.h>
3231
#include <malloc.h>
33-
#include <windows.h>
34-
#include "winerrmsg.h"
35-
3632

3733
namespace cpptask
3834
{
39-
#ifdef __GNUC__
40-
#ifndef HAVE_PROCESSOR_CACHE_TYPE
41-
typedef enum _PROCESSOR_CACHE_TYPE
42-
{
43-
CacheUnified,
44-
CacheInstruction,
45-
CacheData,
46-
CacheTrace
47-
} PROCESSOR_CACHE_TYPE;
48-
#endif
49-
50-
#ifndef HAVE_CACHE_DESCRIPTOR
51-
typedef struct _CACHE_DESCRIPTOR
52-
{
53-
BYTE Level;
54-
BYTE Associativity;
55-
WORD LineSize;
56-
DWORD Size;
57-
PROCESSOR_CACHE_TYPE Type;
58-
} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR;
59-
#endif
60-
61-
#ifndef HAVE_LOGICAL_PROCESSOR_RELATIONSHIP
62-
typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP
63-
{
64-
RelationProcessorCore,
65-
RelationNumaNode,
66-
RelationCache,
67-
RelationProcessorPackage,
68-
RelationGroup,
69-
RelationAll = 0xffff,
70-
} LOGICAL_PROCESSOR_RELATIONSHIP;
71-
#endif
72-
73-
#ifndef HAVE_SYSTEM_LOGICAL_PROCESSOR_INFORMATION
74-
typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION
75-
{
76-
ULONG_PTR ProcessorMask;
77-
LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
78-
_ANONYMOUS_UNION
79-
union
80-
{
81-
struct
82-
{
83-
BYTE flags;
84-
} ProcessorCore;
85-
struct
86-
{
87-
DWORD NodeNumber;
88-
} NumaNode;
89-
CACHE_DESCRIPTOR Cache;
90-
ULONGLONG Reserved[2];
91-
} DUMMYUNIONNAME;
92-
} SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION;
93-
#endif
94-
#endif
95-
96-
typedef BOOL (WINAPI *LPFN_GLPI)(
97-
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION,
98-
PDWORD);
99-
100-
inline size_t GetCacheLineSize()
101-
{
102-
static size_t line_size = 0;
103-
if (line_size == 0)
104-
{
105-
auto mHandle = GetModuleHandle(TEXT("kernel32"));
106-
if (mHandle == 0)
107-
{
108-
throw Exception("Can't get handle to kernel32 module - " + GetLastWinErrMsg());
109-
}
110-
111-
LPFN_GLPI glpi = (LPFN_GLPI) GetProcAddress(mHandle, "GetLogicalProcessorInformation");
112-
if (glpi == 0)
113-
{
114-
throw Exception("Can't get address of GetLogicalProcessorInformation function - " + GetLastWinErrMsg());
115-
}
116-
117-
DWORD buffer_size = 0;
118-
glpi(0, &buffer_size);
119-
120-
if (buffer_size > 0)
121-
{
122-
std::vector<char> bufferData(buffer_size, 0);
123-
SYSTEM_LOGICAL_PROCESSOR_INFORMATION* buffer = reinterpret_cast<SYSTEM_LOGICAL_PROCESSOR_INFORMATION*>(bufferData.data());
124-
125-
glpi(&buffer[0], &buffer_size);
126-
127-
for (int i = 0; i != buffer_size / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); ++i)
128-
{
129-
if (buffer[i].Relationship == RelationCache && buffer[i].Cache.Level == 1)
130-
{
131-
line_size = buffer[i].Cache.LineSize;
132-
break;
133-
}
134-
}
135-
}
136-
}
137-
assert(line_size != 0);
138-
return line_size;
139-
}
14035

141-
inline void* AlignedAlloc(size_t size, size_t align_size)
36+
inline void* aligned_alloc(size_t size, size_t align_size)
14237
{
14338
#ifdef __GNUC__
14439
return __mingw_aligned_malloc(size, align_size);
@@ -147,7 +42,7 @@ inline void* AlignedAlloc(size_t size, size_t align_size)
14742
#endif
14843
}
14944

150-
inline void AlignedFree(void* ptr)
45+
inline void free(void* ptr)
15146
{
15247
#ifdef __GNUC__
15348
return __mingw_aligned_free(ptr);

‎include/cpptask/alignedalloc.h‎

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -30,51 +30,6 @@
3030

3131
#ifdef _WIN32
3232
#include "Win/alignedalloc.h"
33-
#else
34-
#include "Unix/alignedalloc.h"
3533
#endif
3634

37-
namespace cpptask
38-
{
39-
40-
template<class T>
41-
class AlignedPointer
42-
{
43-
public:
44-
AlignedPointer()
45-
: p(0)
46-
, memory(0)
47-
{
48-
}
49-
~AlignedPointer()
50-
{
51-
if (p != 0)
52-
{
53-
p->~T();
54-
}
55-
if (memory != 0)
56-
{
57-
AlignedFree(memory);
58-
}
59-
}
60-
void SetPointer(T* p)
61-
{
62-
this->p = p;
63-
}
64-
void SetMemory(void* memoryPtr)
65-
{
66-
this->memory = memoryPtr;
67-
}
68-
void* GetMemory()
69-
{
70-
return memory;
71-
}
72-
private:
73-
AlignedPointer(const AlignedPointer&);
74-
AlignedPointer& operator=(const AlignedPointer&);
75-
private:
76-
T* p;
77-
void* memory;
78-
};
79-
}
8035
#endif

‎include/cpptask/cpptask.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
#ifndef _CPPTASK_H_
2929
#define _CPPTASK_H_
3030

31+
#define _CPP_TASK_CACHE_LINE_SIZE_ 64
32+
3133
#include "taskmanager.h"
3234
#include "taskthreadimpl.h"
3335
#include "taskmanagerlimpl.h"

‎include/cpptask/parallelfor.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ void ParallelForBase(RANGES ranges, Functor functor, TaskManager& manager)
100100
typename RANGES::iterator e = ranges.end();
101101
for (; i != e; ++i)
102102
{
103-
TaskType* ptr = new(manager.GetCacheLineSize()) TaskType(*i, functor);
103+
TaskType* ptr = new TaskType(*i, functor);
104104
TASKPtr task(ptr);
105105
tasks.push_back(task);
106106
manager.AddTask(*task);

‎include/cpptask/parallelinvoke.h‎

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -57,28 +57,26 @@ inline void ParallelInvoke(Functor1 func1, Functor2 func2)
5757
TaskManager* manager = TaskManager::GetCurrent();
5858
if (manager != 0)
5959
{
60-
typedef InvokeTask<Functor1> TASK1;
61-
typedef std::shared_ptr<TASK1> TASKPtr1;
60+
typedef InvokeTask<Functor1> TaskType1;
6261

63-
TASKPtr1 task1(new(manager->GetCacheLineSize()) TASK1(func1));
64-
manager->AddTask(*task1);
62+
TaskType1 task1(func1);
63+
manager->AddTask(task1);
6564

66-
typedef InvokeTask<Functor2> TASK2;
67-
typedef std::shared_ptr<TASK2> TASKPtr2;
65+
typedef InvokeTask<Functor2> TaskType2;
66+
67+
TaskType2 task2(func2);
68+
manager->AddTask(task2);
6869

69-
TASKPtr2 task2(new(manager->GetCacheLineSize()) TASK2(func2));
70-
manager->AddTask(*task2);
70+
manager->WaitTask(task1);
71+
manager->WaitTask(task2);
7172

72-
manager->WaitTask(*task1);
73-
manager->WaitTask(*task2);
74-
75-
if (task1->GetLastException() != 0)
73+
if (task1.GetLastException() != 0)
7674
{
77-
task1->GetLastException()->Throw();
75+
task1.GetLastException()->Throw();
7876
}
79-
if (task2->GetLastException() != 0)
77+
if (task2.GetLastException() != 0)
8078
{
81-
task2->GetLastException()->Throw();
79+
task2.GetLastException()->Throw();
8280
}
8381
}
8482
else

‎include/cpptask/parallelreduce.h‎

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
#include <algorithm>
3535
#include <vector>
36+
#include <type_traits>
3637

3738
namespace cpptask
3839
{
@@ -73,21 +74,18 @@ class ReduceTask : public Task
7374
typedef std::shared_ptr<TASK> TASKPtr;
7475
TASKPtr tasks[splitCount];
7576

76-
typedef Functor* FUNCPtr;
77-
FUNCPtr functors[splitCount];
78-
AlignedPointer<Functor> mems[splitCount];
77+
typename std::aligned_storage<sizeof(Functor), _CPP_TASK_CACHE_LINE_SIZE_>::type functors[splitCount];
7978

8079
TaskManager* manager = TaskManager::GetCurrent();
8180
if (manager != 0)
8281
{
8382
for (size_t i = 0; i != splitCount; ++i)
8483
{
85-
mems[i].SetMemory(AlignedAlloc(sizeof(Functor), manager->GetCacheLineSize()));
86-
functors[i] = new(mems[i].GetMemory()) Functor(functor, SplitMark());
84+
new(functors + i)Functor(functor, SplitMark());
8785

88-
TASK* ptr = new(manager->GetCacheLineSize()) TASK(ranges[i],
89-
*functors[i],
90-
myDepth - 1);
86+
TASK* ptr = new TASK(ranges[i],
87+
*reinterpret_cast<Functor*>(functors + i),
88+
myDepth - 1);
9189

9290
tasks[i].reset(ptr);
9391
manager->AddTask(*tasks[i]);
@@ -140,7 +138,7 @@ inline void ParallelReduce(Iterator start, Iterator end, Functor& functor, size_
140138
typedef Range<Iterator> RANGE;
141139
typedef ReduceTask<RANGE, Functor> TASK;
142140
typedef std::shared_ptr<TASK> TASKPtr;
143-
TASKPtr task(new(manager->GetCacheLineSize()) TASK(RANGE(start, end), functor, maxDepth));
141+
TASKPtr task(new TASK(RANGE(start, end), functor, maxDepth));
144142
manager->AddTask(*task);
145143
manager->WaitTask(*task);
146144
if (task->GetLastException() != 0)

‎include/cpptask/spscqueue.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ class SPSCQueue
157157

158158
// delimiter between consumer part and producer part,
159159
// so that they situated on different cache lines
160-
char cache_line_pad[64];
160+
char cache_line_pad[_CPP_TASK_CACHE_LINE_SIZE_];
161161

162162
// producer part
163163
// accessed only by producer

0 commit comments

Comments
 (0)