Add IPC and/or/xor/swap amos, reenable functional tests (#184)
Tento commit je obsažen v:
@@ -85,49 +85,59 @@ __device__ void IPCContext::amo_set(void *dest, T value, int pe) {
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ T IPCContext::amo_swap(void *dst, T value, int pe) {
|
||||
printf("IPC amo_swap not implemented\n");
|
||||
abort();
|
||||
return 0;
|
||||
__device__ T IPCContext::amo_swap(void *dest, T value, int pe) {
|
||||
uint64_t L_offset =
|
||||
reinterpret_cast<char *>(dest) - ipcImpl_.ipc_bases[my_pe];
|
||||
return ipcImpl_.ipcAMOSwap(
|
||||
reinterpret_cast<T *>(ipcImpl_.ipc_bases[pe] + L_offset), value);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ T IPCContext::amo_fetch_and(void *dst, T value, int pe) {
|
||||
printf("IPC amo_fetch_and not implemented\n");
|
||||
abort();
|
||||
return 0;
|
||||
__device__ T IPCContext::amo_fetch_and(void *dest, T value, int pe) {
|
||||
uint64_t L_offset =
|
||||
reinterpret_cast<char *>(dest) - ipcImpl_.ipc_bases[my_pe];
|
||||
return ipcImpl_.ipcAMOFetchAnd(
|
||||
reinterpret_cast<T *>(ipcImpl_.ipc_bases[pe] + L_offset), value);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ void IPCContext::amo_and(void *dst, T value, int pe) {
|
||||
printf("IPC amo_and not implemented\n");
|
||||
abort();
|
||||
__device__ void IPCContext::amo_and(void *dest, T value, int pe) {
|
||||
uint64_t L_offset =
|
||||
reinterpret_cast<char *>(dest) - ipcImpl_.ipc_bases[my_pe];
|
||||
ipcImpl_.ipcAMOAnd(
|
||||
reinterpret_cast<T *>(ipcImpl_.ipc_bases[pe] + L_offset), value);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ T IPCContext::amo_fetch_or(void *dst, T value, int pe) {
|
||||
printf("IPC amo_fetch_or not implemented\n");
|
||||
abort();
|
||||
return 0;
|
||||
__device__ T IPCContext::amo_fetch_or(void *dest, T value, int pe) {
|
||||
uint64_t L_offset =
|
||||
reinterpret_cast<char *>(dest) - ipcImpl_.ipc_bases[my_pe];
|
||||
return ipcImpl_.ipcAMOFetchOr(
|
||||
reinterpret_cast<T *>(ipcImpl_.ipc_bases[pe] + L_offset), value);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ void IPCContext::amo_or(void *dst, T value, int pe) {
|
||||
printf("IPC amo_or not implemented\n");
|
||||
abort();
|
||||
__device__ void IPCContext::amo_or(void *dest, T value, int pe) {
|
||||
uint64_t L_offset =
|
||||
reinterpret_cast<char *>(dest) - ipcImpl_.ipc_bases[my_pe];
|
||||
ipcImpl_.ipcAMOOr(
|
||||
reinterpret_cast<T *>(ipcImpl_.ipc_bases[pe] + L_offset), value);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ T IPCContext::amo_fetch_xor(void *dst, T value, int pe) {
|
||||
printf("IPC amo_fetch_xor not implemented\n");
|
||||
abort();
|
||||
return 0;
|
||||
__device__ T IPCContext::amo_fetch_xor(void *dest, T value, int pe) {
|
||||
uint64_t L_offset =
|
||||
reinterpret_cast<char *>(dest) - ipcImpl_.ipc_bases[my_pe];
|
||||
return ipcImpl_.ipcAMOFetchXor(
|
||||
reinterpret_cast<T *>(ipcImpl_.ipc_bases[pe] + L_offset), value);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ void IPCContext::amo_xor(void *dst, T value, int pe) {
|
||||
printf("IPC amo_xor not implemented\n");
|
||||
abort();
|
||||
__device__ void IPCContext::amo_xor(void *dest, T value, int pe) {
|
||||
uint64_t L_offset =
|
||||
reinterpret_cast<char *>(dest) - ipcImpl_.ipc_bases[my_pe];
|
||||
ipcImpl_.ipcAMOXor(
|
||||
reinterpret_cast<T *>(ipcImpl_.ipc_bases[pe] + L_offset), value);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
|
||||
+48
-13
@@ -84,12 +84,25 @@ class IpcOnImpl {
|
||||
|
||||
__device__ void ipcFence() { __threadfence_system(); }
|
||||
|
||||
template <typename T>
|
||||
__device__ void ipcAMOAdd(T *val, T value) {
|
||||
__hip_atomic_fetch_add(val, value, __ATOMIC_SEQ_CST,
|
||||
__HIP_MEMORY_SCOPE_SYSTEM);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ T ipcAMOFetchAdd(T *val, T value) {
|
||||
return __hip_atomic_fetch_add(val, value, __ATOMIC_SEQ_CST,
|
||||
__HIP_MEMORY_SCOPE_SYSTEM);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ void ipcAMOCas(T *val, T cond, T value) {
|
||||
__hip_atomic_compare_exchange_strong(val, &cond, value, __ATOMIC_SEQ_CST,
|
||||
__ATOMIC_SEQ_CST,
|
||||
__HIP_MEMORY_SCOPE_SYSTEM);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ T ipcAMOFetchCas(T *val, T cond, T value) {
|
||||
__hip_atomic_compare_exchange_strong(val, &cond, value, __ATOMIC_SEQ_CST,
|
||||
@@ -98,24 +111,46 @@ class IpcOnImpl {
|
||||
return cond;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ void ipcAMOAdd(T *val, T value) {
|
||||
__hip_atomic_fetch_add(val, value, __ATOMIC_SEQ_CST,
|
||||
__HIP_MEMORY_SCOPE_SYSTEM);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ void ipcAMOCas(T *val, T cond, T value) {
|
||||
__hip_atomic_compare_exchange_strong(val, &cond, value, __ATOMIC_SEQ_CST,
|
||||
__ATOMIC_SEQ_CST,
|
||||
__HIP_MEMORY_SCOPE_SYSTEM);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ void ipcAMOSet(T *val, T value) {
|
||||
__hip_atomic_store(val, value, __ATOMIC_SEQ_CST, __HIP_MEMORY_SCOPE_SYSTEM);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ T ipcAMOSwap(T *val, T value) {
|
||||
return __hip_atomic_exchange(val, value, __ATOMIC_SEQ_CST, __HIP_MEMORY_SCOPE_SYSTEM);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ void ipcAMOAnd(T *val, T value) {
|
||||
__hip_atomic_fetch_and(val, value, __ATOMIC_SEQ_CST, __HIP_MEMORY_SCOPE_SYSTEM);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ T ipcAMOFetchAnd(T *val, T value) {
|
||||
return __hip_atomic_fetch_and(val, value, __ATOMIC_SEQ_CST, __HIP_MEMORY_SCOPE_SYSTEM);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ void ipcAMOOr(T *val, T value) {
|
||||
__hip_atomic_fetch_or(val, value, __ATOMIC_SEQ_CST, __HIP_MEMORY_SCOPE_SYSTEM);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ T ipcAMOFetchOr(T *val, T value) {
|
||||
return __hip_atomic_fetch_or(val, value, __ATOMIC_SEQ_CST, __HIP_MEMORY_SCOPE_SYSTEM);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ void ipcAMOXor(T *val, T value) {
|
||||
__hip_atomic_fetch_xor(val, value, __ATOMIC_SEQ_CST, __HIP_MEMORY_SCOPE_SYSTEM);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
__device__ T ipcAMOFetchXor(T *val, T value) {
|
||||
return __hip_atomic_fetch_xor(val, value, __ATOMIC_SEQ_CST, __HIP_MEMORY_SCOPE_SYSTEM);
|
||||
}
|
||||
|
||||
__device__ void zero_byte_read(int pe) {
|
||||
int local_pe = pe % shm_size;
|
||||
uint32_t *pe_ipc_base = reinterpret_cast<uint32_t *>(ipc_bases[local_pe]);
|
||||
|
||||
Odkázat v novém úkolu
Zablokovat Uživatele