Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions include/camp/resource.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -109,15 +109,15 @@ namespace resources
}

template <typename T>
T* allocate(size_t size, MemoryAccess ma = MemoryAccess::Device)
T* allocate(size_t n, MemoryAccess ma = MemoryAccess::Device)
{
if (size == 0) {
if (n == 0) {
return nullptr;
}
if (!m_value) {
::camp::throw_re("Empty Resource type allocate call.");
}
return (T*)m_value->allocate(size * sizeof(T), ma);
return (T*)m_value->allocate(n * sizeof(T), ma);
}

void* calloc(size_t size, MemoryAccess ma = MemoryAccess::Device)
Expand Down
83 changes: 48 additions & 35 deletions include/camp/resource/cuda.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -184,14 +184,14 @@ namespace resources
cudaError_t status = cudaPointerGetAttributes(&a, p);
if (status == cudaSuccess) {
switch (a.type) {
case cudaMemoryTypeUnregistered:
return MemoryAccess::Unknown;
case cudaMemoryTypeHost:
return MemoryAccess::Pinned;
case cudaMemoryTypeDevice:
return MemoryAccess::Device;
case cudaMemoryTypeManaged:
return MemoryAccess::Managed;
default:
return MemoryAccess::Unknown;
}
}
::camp::throw_re("invalid pointer detected");
Expand Down Expand Up @@ -272,44 +272,55 @@ namespace resources

// Memory
template <typename T>
T* allocate(size_t size, MemoryAccess ma = MemoryAccess::Device)
T* allocate(size_t n, MemoryAccess ma = MemoryAccess::Device)
{
if (n == 0) {
return nullptr;
}
T* ret = nullptr;
if (size > 0) {
auto d{device_guard(device)};
switch (ma) {
case MemoryAccess::Unknown:
case MemoryAccess::Device:
CAMP_CUDA_API_INVOKE_AND_CHECK(cudaMalloc,
(void**)&ret,
sizeof(T) * size);
break;
case MemoryAccess::Pinned:
// TODO: do a test here for whether managed is *actually* shared
// so we can use the better performing memory
CAMP_CUDA_API_INVOKE_AND_CHECK(cudaMallocHost,
(void**)&ret,
sizeof(T) * size);
break;
case MemoryAccess::Managed:
CAMP_CUDA_API_INVOKE_AND_CHECK(cudaMallocManaged,
(void**)&ret,
sizeof(T) * size);
break;
}
auto d{device_guard(device)};
switch (ma) {
case MemoryAccess::Device:
CAMP_CUDA_API_INVOKE_AND_CHECK(cudaMalloc,
(void**)&ret,
sizeof(T) * n);
break;
case MemoryAccess::Pinned:
// TODO: do a test here for whether managed is *actually* shared
// so we can use the better performing memory
CAMP_CUDA_API_INVOKE_AND_CHECK(cudaMallocHost,
(void**)&ret,
sizeof(T) * n);
break;
case MemoryAccess::Managed:
CAMP_CUDA_API_INVOKE_AND_CHECK(cudaMallocManaged,
(void**)&ret,
sizeof(T) * n);
break;
case MemoryAccess::Unknown:
::camp::throw_re("Unknown memory access type, cannot allocate");
break;
}
return ret;
}

void* calloc(size_t size, MemoryAccess ma = MemoryAccess::Device)
{
void* p = allocate<char>(size, ma);
this->memset(p, 0, size);
return p;
if (size == 0) {
return nullptr;
}
void* ret = allocate<char>(size, ma);
if (ret != nullptr) {
this->memset(ret, 0, size);
}
return ret;
}

void deallocate(void* p, MemoryAccess ma = MemoryAccess::Unknown)
{
if (p == nullptr) {
return;
}
auto d{device_guard(device)};
if (ma == MemoryAccess::Unknown) {
ma = get_access_type(p);
Expand All @@ -334,19 +345,21 @@ namespace resources

void memcpy(void* dst, const void* src, size_t size)
{
if (size > 0) {
auto d{device_guard(device)};
CAMP_CUDA_API_INVOKE_AND_CHECK(
cudaMemcpyAsync, dst, src, size, cudaMemcpyDefault, stream);
if (size == 0) {
return;
}
auto d{device_guard(device)};
CAMP_CUDA_API_INVOKE_AND_CHECK(
cudaMemcpyAsync, dst, src, size, cudaMemcpyDefault, stream);
}

void memset(void* p, int val, size_t size)
{
if (size > 0) {
auto d{device_guard(device)};
CAMP_CUDA_API_INVOKE_AND_CHECK(cudaMemsetAsync, p, val, size, stream);
if (size == 0) {
return;
}
auto d{device_guard(device)};
CAMP_CUDA_API_INVOKE_AND_CHECK(cudaMemsetAsync, p, val, size, stream);
}

cudaStream_t get_stream() const { return stream; }
Expand Down
85 changes: 47 additions & 38 deletions include/camp/resource/hip.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -184,16 +184,12 @@ namespace resources
hipPointerAttribute_t a;
hipError_t status = hipPointerGetAttributes(&a, p);
if (status == hipSuccess) {
#if (HIP_VERSION_MAJOR >= 6)
switch (a.type) {
#else
switch (a.memoryType) {
#endif
case hipMemoryTypeHost:
return MemoryAccess::Pinned;
case hipMemoryTypeDevice:
return MemoryAccess::Device;
case hipMemoryTypeUnified:
case hipMemoryTypeManaged:
return MemoryAccess::Managed;
default:
return MemoryAccess::Unknown;
Expand Down Expand Up @@ -274,44 +270,55 @@ namespace resources

// Memory
template <typename T>
T* allocate(size_t size, MemoryAccess ma = MemoryAccess::Device)
T* allocate(size_t n, MemoryAccess ma = MemoryAccess::Device)
{
if (n == 0) {
return nullptr;
}
T* ret = nullptr;
if (size > 0) {
auto d{device_guard(device)};
switch (ma) {
case MemoryAccess::Unknown:
case MemoryAccess::Device:
CAMP_HIP_API_INVOKE_AND_CHECK(hipMalloc,
(void**)&ret,
sizeof(T) * size);
break;
case MemoryAccess::Pinned:
// TODO: do a test here for whether managed is *actually* shared
// so we can use the better performing memory
CAMP_HIP_API_INVOKE_AND_CHECK(hipHostMalloc,
(void**)&ret,
sizeof(T) * size);
break;
case MemoryAccess::Managed:
CAMP_HIP_API_INVOKE_AND_CHECK(hipMallocManaged,
(void**)&ret,
sizeof(T) * size);
break;
}
auto d{device_guard(device)};
switch (ma) {
case MemoryAccess::Device:
CAMP_HIP_API_INVOKE_AND_CHECK(hipMalloc,
(void**)&ret,
sizeof(T) * n);
break;
case MemoryAccess::Pinned:
// TODO: do a test here for whether managed is *actually* shared
// so we can use the better performing memory
CAMP_HIP_API_INVOKE_AND_CHECK(hipHostMalloc,
(void**)&ret,
sizeof(T) * n);
break;
case MemoryAccess::Managed:
CAMP_HIP_API_INVOKE_AND_CHECK(hipMallocManaged,
(void**)&ret,
sizeof(T) * n);
break;
case MemoryAccess::Unknown:
::camp::throw_re("Unknown memory access type, cannot allocate");
break;
}
return ret;
}

void* calloc(size_t size, MemoryAccess ma)
{
void* p = allocate<char>(size, ma);
this->memset(p, 0, size);
return p;
if (size == 0) {
return nullptr;
}
void* ret = allocate<char>(size, ma);
if (ret != nullptr) {
this->memset(ret, 0, size);
}
return ret;
}

void deallocate(void* p, MemoryAccess ma = MemoryAccess::Unknown)
{
if (p == nullptr) {
return;
}
auto d{device_guard(device)};
if (ma == MemoryAccess::Unknown) {
ma = get_access_type(p);
Expand All @@ -336,19 +343,21 @@ namespace resources

void memcpy(void* dst, const void* src, size_t size)
{
if (size > 0) {
auto d{device_guard(device)};
CAMP_HIP_API_INVOKE_AND_CHECK(
hipMemcpyAsync, dst, src, size, hipMemcpyDefault, stream);
if (size == 0) {
return;
}
auto d{device_guard(device)};
CAMP_HIP_API_INVOKE_AND_CHECK(
hipMemcpyAsync, dst, src, size, hipMemcpyDefault, stream);
}

void memset(void* p, int val, size_t size)
{
if (size > 0) {
auto d{device_guard(device)};
CAMP_HIP_API_INVOKE_AND_CHECK(hipMemsetAsync, p, val, size, stream);
if (size == 0) {
return;
}
auto d{device_guard(device)};
CAMP_HIP_API_INVOKE_AND_CHECK(hipMemsetAsync, p, val, size, stream);
}

hipStream_t get_stream() const { return stream; }
Expand Down
28 changes: 24 additions & 4 deletions include/camp/resource/host.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -114,27 +114,47 @@ namespace resources
template <typename T>
T* allocate(size_t n, MemoryAccess = MemoryAccess::Device)
{
if (n == 0) {
return nullptr;
}
return (T*)std::malloc(sizeof(T) * n);
}

void* calloc(size_t size, MemoryAccess = MemoryAccess::Device)
{
void* p = allocate<char>(size);
this->memset(p, 0, size);
return p;
if (size == 0) {
return nullptr;
}
void* ret = allocate<char>(size);
if (ret != nullptr) {
this->memset(ret, 0, size);
}
return ret;
}

void deallocate(void* p, MemoryAccess = MemoryAccess::Device)
{
if (p == nullptr) {
return;
}
std::free(p);
}

void memcpy(void* dst, const void* src, size_t size)
{
if (size == 0) {
return;
}
std::memcpy(dst, src, size);
}

void memset(void* p, int val, size_t size) { std::memset(p, val, size); }
void memset(void* p, int val, size_t size)
{
if (size == 0) {
return;
}
std::memset(p, val, size);
}

/*
* \brief Compares two (Host) resources to see if they are equal
Expand Down
Loading
Loading