* Add atomic_add, atomic_set, atomic_cas, atomic_fetch_add and atomic_fetch_cas to IPC backend
Этот коммит содержится в:
avinashkethineedi
2024-08-28 08:30:46 -07:00
родитель 45a8cb3354
Коммит e1e1ac6df6
+32 -12
Просмотреть файл
@@ -70,13 +70,21 @@ __device__ void IPCContext::get_nbi(T *dest, const T *source, size_t nelems,
// Atomics
template <typename T>
__device__ void IPCContext::amo_add(void *dst, T value, int pe) {
assert(false);
__device__ void IPCContext::amo_add(void *dest, T value, int pe) {
int local_pe = pe % ipcImpl_.shm_size;
uint64_t L_offset =
reinterpret_cast<char *>(dest) - ipcImpl_.ipc_bases[my_pe];
ipcImpl_.ipcAMOAdd(
reinterpret_cast<T *>(ipcImpl_.ipc_bases[local_pe] + L_offset), value);
}
template <typename T>
__device__ void IPCContext::amo_set(void *dst, T value, int pe) {
assert(false);
__device__ void IPCContext::amo_set(void *dest, T value, int pe) {
int local_pe = pe % ipcImpl_.shm_size;
uint64_t L_offset =
reinterpret_cast<char *>(dest) - ipcImpl_.ipc_bases[my_pe];
ipcImpl_.ipcAMOSet(
reinterpret_cast<T *>(ipcImpl_.ipc_bases[local_pe] + L_offset), value);
}
template <typename T>
@@ -119,20 +127,32 @@ __device__ void IPCContext::amo_xor(void *dst, T value, int pe) {
}
template <typename T>
__device__ void IPCContext::amo_cas(void *dst, T value, T cond, int pe) {
assert(false);
__device__ void IPCContext::amo_cas(void *dest, T value, T cond, int pe) {
int local_pe = pe % ipcImpl_.shm_size;
uint64_t L_offset =
reinterpret_cast<char *>(dest) - ipcImpl_.ipc_bases[my_pe];
ipcImpl_.ipcAMOCas(
reinterpret_cast<T *>(ipcImpl_.ipc_bases[local_pe] + L_offset), cond,
value);
}
template <typename T>
__device__ T IPCContext::amo_fetch_add(void *dst, T value, int pe) {
assert(false);
return 0;
__device__ T IPCContext::amo_fetch_add(void *dest, T value, int pe) {
int local_pe = pe % ipcImpl_.shm_size;
uint64_t L_offset =
reinterpret_cast<char *>(dest) - ipcImpl_.ipc_bases[my_pe];
return ipcImpl_.ipcAMOFetchAdd(
reinterpret_cast<T *>(ipcImpl_.ipc_bases[local_pe] + L_offset), value);
}
template <typename T>
__device__ T IPCContext::amo_fetch_cas(void *dst, T value, T cond, int pe) {
assert(false);
return 0;
__device__ T IPCContext::amo_fetch_cas(void *dest, T value, T cond, int pe) {
int local_pe = pe % ipcImpl_.shm_size;
uint64_t L_offset =
reinterpret_cast<char *>(dest) - ipcImpl_.ipc_bases[my_pe];
return ipcImpl_.ipcAMOFetchCas(
reinterpret_cast<T *>(ipcImpl_.ipc_bases[local_pe] + L_offset), cond,
value);
}
// Collectives