Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Florian Weik
waLBerla
Commits
a3ca9e4a
Commit
a3ca9e4a
authored
Nov 14, 2018
by
Martin Bauer
Browse files
CUDA Aligned Allocation - splitted in header and cpp
parent
e75398f3
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/cuda/AlignedAllocation.cpp
0 → 100644
View file @
a3ca9e4a
//======================================================================================================================
//
// This file is part of waLBerla. waLBerla is free software: you can
// redistribute it and/or modify it under the terms of the GNU General Public
// License as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// waLBerla is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
//
//! \file AlignedAllocation.cpp
//! \ingroup cuda
//! \author Martin Bauer <martin.bauer@fau.de>
//
//======================================================================================================================
#include
"AlignedAllocation.h"
#include
"cuda/ErrorChecking.h"
#include
"core/debug/CheckFunctions.h"
#include
"core/debug/Debug.h"
#include
"core/logging/Logging.h"
#include
<map>
namespace
walberla
{
namespace
cuda
{
static
std
::
map
<
void
*
,
void
*>
freePointers_
;
void
*
allocate_aligned_with_offset
(
uint_t
size
,
uint_t
alignment
,
uint_t
offset
)
{
// With 0 alignment this function makes no sense
// use normal malloc instead
WALBERLA_ASSERT_GREATER
(
alignment
,
0
);
// Tests if alignment is power of two (assuming alignment>0)
WALBERLA_ASSERT
(
!
(
alignment
&
(
alignment
-
1
))
);
WALBERLA_ASSERT_LESS
(
offset
,
alignment
);
if
(
offset
==
0
)
{
void
*
result
=
nullptr
;
WALBERLA_CUDA_CHECK
(
cudaMalloc
(
&
result
,
size
)
);
freePointers_
[
result
]
=
result
;
return
result
;
}
void
*
pa
;
// pointer to allocated memory
void
*
ptr
;
// pointer to usable aligned memory
WALBERLA_CUDA_CHECK
(
cudaMalloc
(
&
pa
,
size
+
alignment
));
WALBERLA_CHECK_EQUAL
(
size_t
(
pa
)
%
alignment
,
0
,
"CUDA malloc did not return memory with requested alignment"
);
ptr
=
(
void
*
)
((
char
*
)
(
pa
)
+
alignment
-
offset
);
freePointers_
[
ptr
]
=
pa
;
WALBERLA_ASSERT_EQUAL
(((
size_t
)
ptr
+
offset
)
%
alignment
,
0
);
return
ptr
;
}
void
free_aligned_with_offset
(
void
*
ptr
)
{
// assume that pointer to real allocated chunk is stored just before
// chunk that was given to user
WALBERLA_CUDA_CHECK
(
cudaFree
(
freePointers_
[
ptr
]
));
freePointers_
.
erase
(
ptr
);
}
void
*
allocate_pitched_with_offset
(
size_t
&
pitchOut
,
size_t
width
,
size_t
height
,
size_t
alignment
,
size_t
alignmentOffset
)
{
if
(
width
%
alignment
==
0
)
pitchOut
=
width
;
else
pitchOut
=
((
width
+
alignment
)
/
alignment
)
*
alignment
;
WALBERLA_ASSERT_GREATER_EQUAL
(
pitchOut
,
width
);
WALBERLA_ASSERT_EQUAL
(
pitchOut
%
alignment
,
0
);
return
allocate_aligned_with_offset
(
pitchOut
*
height
,
alignment
,
alignmentOffset
);
}
}
// namespace cuda
}
// namespace walberla
src/cuda/AlignedAllocation.h
View file @
a3ca9e4a
...
...
@@ -18,73 +18,22 @@
//! \author Martin Bauer <martin.bauer@fau.de>
//
//======================================================================================================================
#pragma once
#include
"core/DataTypes.h"
#include
"cuda/ErrorChecking.h"
#include
"core/debug/CheckFunctions.h"
#include
"core/debug/Debug.h"
#include
"core/logging/Logging.h"
namespace
walberla
{
namespace
cuda
{
static
std
::
map
<
void
*
,
void
*>
freePointers_
;
inline
void
*
allocate_aligned_with_offset
(
uint_t
size
,
uint_t
alignment
,
uint_t
offset
)
{
// With 0 alignment this function makes no sense
// use normal malloc instead
WALBERLA_ASSERT_GREATER
(
alignment
,
0
);
// Tests if alignment is power of two (assuming alignment>0)
WALBERLA_ASSERT
(
!
(
alignment
&
(
alignment
-
1
))
);
WALBERLA_ASSERT_LESS
(
offset
,
alignment
);
if
(
offset
==
0
)
{
void
*
result
=
nullptr
;
WALBERLA_CUDA_CHECK
(
cudaMalloc
(
&
result
,
size
)
);
freePointers_
[
result
]
=
result
;
return
result
;
}
void
*
pa
;
// pointer to allocated memory
void
*
ptr
;
// pointer to usable aligned memory
void
*
allocate_aligned_with_offset
(
uint_t
size
,
uint_t
alignment
,
uint_t
offset
);
WALBERLA_CUDA_CHECK
(
cudaMalloc
(
&
pa
,
size
+
alignment
));
WALBERLA_CHECK_EQUAL
(
size_t
(
pa
)
%
alignment
,
0
,
"CUDA malloc did not return memory with requested alignment"
);
ptr
=
(
void
*
)
((
char
*
)
(
pa
)
+
alignment
-
offset
);
freePointers_
[
ptr
]
=
pa
;
WALBERLA_ASSERT_EQUAL
(((
size_t
)
ptr
+
offset
)
%
alignment
,
0
);
return
ptr
;
}
void
free_aligned_with_offset
(
void
*
ptr
);
inline
void
free_aligned_with_offset
(
void
*
ptr
)
{
// assume that pointer to real allocated chunk is stored just before
// chunk that was given to user
WALBERLA_CUDA_CHECK
(
cudaFree
(
freePointers_
[
ptr
]
));
freePointers_
.
erase
(
ptr
);
}
inline
void
*
allocate_pitched_with_offset
(
size_t
&
pitchOut
,
size_t
width
,
size_t
height
,
size_t
alignment
,
size_t
alignmentOffset
)
{
if
(
width
%
alignment
==
0
)
pitchOut
=
width
;
else
pitchOut
=
((
width
+
alignment
)
/
alignment
)
*
alignment
;
WALBERLA_ASSERT_GREATER_EQUAL
(
pitchOut
,
width
);
WALBERLA_ASSERT_EQUAL
(
pitchOut
%
alignment
,
0
);
return
allocate_aligned_with_offset
(
pitchOut
*
height
,
alignment
,
alignmentOffset
);
}
void
*
allocate_pitched_with_offset
(
size_t
&
pitchOut
,
size_t
width
,
size_t
height
,
size_t
alignment
,
size_t
alignmentOffset
);
}
// namespace cuda
}
// namespace walberla
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment