Skip to content

Commit 319a87a

Browse files
Vedant2005goyalvgvassilev
authored andcommitted
Add CUDA_HOST_DEVICE to Tape::destroy_element() allowing the function to be called from device code too
Fixes #1624
1 parent 83f17f2 commit 319a87a

2 files changed

Lines changed: 43 additions & 9 deletions

File tree

include/clad/Differentiator/Tape.h

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -457,12 +457,12 @@ class tape_impl {
457457
#endif
458458
}
459459

460-
DiskInfo& getDiskInfo() {
460+
CUDA_HOST_DEVICE DiskInfo& getDiskInfo() {
461461
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
462462
return *reinterpret_cast<DiskInfo*>(&m_state);
463463
}
464464

465-
void check_and_evict_impl(std::true_type) {
465+
CUDA_HOST_DEVICE void check_and_evict_impl(std::true_type) {
466466
DiskInfo& info = getDiskInfo();
467467
if (GpuOffload && info.m_ActiveVramSlabs >= info.m_MaxVramSlabs) {
468468
Slab* candidate = m_head;
@@ -539,9 +539,9 @@ class tape_impl {
539539
}
540540
}
541541
}
542-
void check_and_evict_impl(std::false_type) {}
542+
CUDA_HOST_DEVICE void check_and_evict_impl(std::false_type) {}
543543

544-
void ensure_loaded_impl(Slab* slab, std::true_type) {
544+
CUDA_HOST_DEVICE void ensure_loaded_impl(Slab* slab, std::true_type) {
545545
DiskInfo& info = getDiskInfo();
546546
if (GpuOffload) {
547547
// Already in host RAM — return immediately
@@ -604,14 +604,14 @@ class tape_impl {
604604
}
605605
}
606606

607-
void ensure_loaded_impl(Slab* slab, std::false_type) {}
607+
CUDA_HOST_DEVICE void ensure_loaded_impl(Slab* slab, std::false_type) {}
608608

609-
void check_and_evict() {
609+
CUDA_HOST_DEVICE void check_and_evict() {
610610
check_and_evict_impl(std::integral_constant < bool,
611611
DiskOffload || GpuOffload > {});
612612
}
613613

614-
void ensure_loaded(Slab* slab) {
614+
CUDA_HOST_DEVICE void ensure_loaded(Slab* slab) {
615615
ensure_loaded_impl(slab, std::integral_constant < bool,
616616
DiskOffload || GpuOffload > {});
617617
}
@@ -923,8 +923,11 @@ class tape_impl {
923923
m_capacity = SBO_SIZE;
924924
}
925925

926-
template <typename ElTy> void destroy_element(ElTy* elem) { elem->~ElTy(); }
927-
template <typename ElTy, size_t N> void destroy_element(ElTy (*arr)[N]) {
926+
template <typename ElTy> CUDA_HOST_DEVICE void destroy_element(ElTy* elem) {
927+
elem->~ElTy();
928+
}
929+
template <typename ElTy, size_t N>
930+
CUDA_HOST_DEVICE void destroy_element(ElTy (*arr)[N]) {
928931
for (size_t i = 0; i < N; ++i)
929932
(*arr)[i].~ElTy();
930933
}

test/Regressions/issue-1624.cu

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// RUN: %cladclang_cuda -fsyntax-only -I%S/../../include --cuda-path=%cudapath \
2+
// RUN: --cuda-gpu-arch=%cudaarch -Xclang -verify %s
3+
//
4+
// REQUIRES: cuda-runtime
5+
// expected-no-diagnostics
6+
7+
#include "clad/Differentiator/Tape.h"
8+
9+
struct TrackedValue {
10+
double val;
11+
__host__ __device__ TrackedValue() : val(0.0) {}
12+
13+
__host__ __device__ ~TrackedValue() {}
14+
};
15+
16+
template <class T>
17+
__device__ void exercise_tape(clad::tape_impl<T>& t) {
18+
t.emplace_back();
19+
20+
auto& back = t.back();
21+
(void)back;
22+
23+
// This explicitly triggers the `destroy_element` template
24+
// via `pop_back()`.
25+
t.pop_back();
26+
}
27+
28+
__global__ void my_kernel() {
29+
clad::tape_impl<TrackedValue> t;
30+
exercise_tape(t);
31+
}

0 commit comments

Comments
 (0)