-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatomic_cas.cpp
38 lines (28 loc) · 1002 Bytes
/
atomic_cas.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <cassert>
#include <atomic>
#include "hc.hpp"
#include "hc_am_internal.hpp"
int main() {
constexpr unsigned long long init_value = 0;
constexpr unsigned long long new_value = 1234;
char* mem = hc::internal::am_alloc_host_coherent(sizeof(std::atomic_ullong));
std::atomic_ullong* a = new(mem) std::atomic_ullong(init_value);
hc::array_view<unsigned long long,1> av_old(1);
av_old[0] = 0xFFFFFFFFFFFFFFFF;
hc::array_view<bool> av_success(1);
av_success[0] = false;
hc::array_view<unsigned long long,1> av_load_after_cas(1);
av_load_after_cas[0] = 0xFFFFFFFFFFFFFFFF;
hc::parallel_for_each(hc::extent<1>(1), [=](hc::index<1> i) [[hc]] {
auto old = a->load();
av_old[0] = old;
auto success = a->compare_exchange_weak(old, new_value);
av_success[0] = success;
av_load_after_cas[0] = a->load();
}).wait();
assert(init_value == av_old[0]);
assert(av_success[0]);
assert(new_value == av_load_after_cas[0]);
hc::am_free(mem);
return 0;
}