Update ll_latency_test and add CUDA version (#873)
This commit is contained in:
@@ -14,15 +14,11 @@
|
||||
#include <iostream> //cerr
|
||||
#include <cstring>
|
||||
|
||||
#define HIP_IPC_MEM_MIN_SIZE 2097152UL
|
||||
|
||||
#define NUM_LOOPS_WARMUP 2000
|
||||
#define NUM_LOOPS_RUN 10000
|
||||
|
||||
#define PING_MODE 0
|
||||
#define PONG_MODE 1
|
||||
|
||||
#define LL_MAX_THREAD 256
|
||||
#define LL_MAX_THREADS 256
|
||||
#define LL_MAX_LINES 1000
|
||||
|
||||
union LLFifoLine {
|
||||
/* Flags have to be *after* data, because otherwise, an incomplete receive
|
||||
@@ -39,6 +35,8 @@ union LLFifoLine {
|
||||
int4 i4;
|
||||
};
|
||||
|
||||
#define HIP_IPC_MEM_MIN_SIZE (LL_MAX_THREADS*LL_MAX_LINES*sizeof(LLFifoLine))
|
||||
|
||||
__device__ void storeLL(union LLFifoLine* dst, uint64_t val, uint32_t flag) {
|
||||
union LLFifoLine i4;
|
||||
i4.data1 = val & 0xffffffff;
|
||||
@@ -81,15 +79,15 @@ __global__ void PingKernel(LLFifoLine* local_flag, LLFifoLine* remote_flag, uint
|
||||
int tid = threadIdx.x;
|
||||
#pragma unroll
|
||||
for (uint32_t i = 1; i < NUM_LOOPS_WARMUP; i++) {
|
||||
storeLL(remote_flag+tid, i, i);
|
||||
while (readLL(local_flag+tid, i, abortFlag) != i);
|
||||
storeLL(remote_flag+tid+(i%LL_MAX_LINES)*LL_MAX_THREADS, i, i);
|
||||
while (readLL(local_flag+tid+(i%LL_MAX_LINES)*LL_MAX_THREADS, i, abortFlag) != i);
|
||||
}
|
||||
uint64_t start_time, end_time;
|
||||
if (tid == 0) start_time = wall_clock64();
|
||||
#pragma unroll
|
||||
for (uint32_t i = NUM_LOOPS_WARMUP; i <= NUM_LOOPS_WARMUP + NUM_LOOPS_RUN; i++) {
|
||||
storeLL(remote_flag+tid, i, i);
|
||||
while (readLL(local_flag+tid, i, abortFlag) != i);
|
||||
storeLL(remote_flag+tid+(i%LL_MAX_LINES)*LL_MAX_THREADS, i, i);
|
||||
while (readLL(local_flag+tid+(i%LL_MAX_LINES)*LL_MAX_THREADS, i, abortFlag) != i);
|
||||
}
|
||||
__syncthreads();
|
||||
if (tid == 0) end_time = wall_clock64();
|
||||
@@ -100,15 +98,15 @@ __global__ void PongKernel(LLFifoLine* local_flag, LLFifoLine* remote_flag, uint
|
||||
int tid = threadIdx.x;
|
||||
#pragma unroll
|
||||
for (uint32_t i = 1; i < NUM_LOOPS_WARMUP; i++) {
|
||||
while (readLL(local_flag+tid, i, abortFlag) != i);
|
||||
storeLL(remote_flag+tid, i, i);
|
||||
while (readLL(local_flag+tid+(i%LL_MAX_LINES)*LL_MAX_THREADS, i, abortFlag) != i);
|
||||
storeLL(remote_flag+tid+(i%LL_MAX_LINES)*LL_MAX_THREADS, i, i);
|
||||
}
|
||||
uint64_t start_time, end_time;
|
||||
if (tid == 0) start_time = wall_clock64();
|
||||
#pragma unroll
|
||||
for (uint32_t i = NUM_LOOPS_WARMUP; i <= NUM_LOOPS_WARMUP + NUM_LOOPS_RUN; i++) {
|
||||
while (readLL(local_flag+tid, i, abortFlag) != i);
|
||||
storeLL(remote_flag+tid, i, i);
|
||||
while (readLL(local_flag+tid+(i%LL_MAX_LINES)*LL_MAX_THREADS, i, abortFlag) != i);
|
||||
storeLL(remote_flag+tid+(i%LL_MAX_LINES)*LL_MAX_THREADS, i, i);
|
||||
}
|
||||
__syncthreads();
|
||||
if (tid == 0) end_time = wall_clock64();
|
||||
@@ -150,7 +148,7 @@ int main(int argc, char** argv) {
|
||||
HIPCHECK(hipDeviceEnablePeerAccess(device_id[1], 0));
|
||||
HIPCHECK(hipGetDeviceProperties(&prop[0], device_id[0]));
|
||||
HIPCHECK(hipExtMallocWithFlags((void**)&flag[0], HIP_IPC_MEM_MIN_SIZE, prop[0].gcnArch / 10 == 94 ? hipDeviceMallocUncached : hipDeviceMallocFinegrained));
|
||||
HIPCHECK(hipMalloc((void**)&time_delta[0], HIP_IPC_MEM_MIN_SIZE));
|
||||
HIPCHECK(hipHostMalloc ((void**)&time_delta[0], sizeof(uint64_t), hipHostMallocDefault));
|
||||
HIPCHECK(hipMalloc((void**)&abortFlag[0], sizeof(uint32_t)));
|
||||
HIPCHECK(hipMemsetAsync(flag[0], 0, HIP_IPC_MEM_MIN_SIZE, stream[0]));
|
||||
HIPCHECK(hipMemsetAsync(abortFlag[0], 0, sizeof(uint32_t), stream[0]));
|
||||
@@ -161,17 +159,17 @@ int main(int argc, char** argv) {
|
||||
HIPCHECK(hipDeviceEnablePeerAccess(device_id[0], 0));
|
||||
HIPCHECK(hipGetDeviceProperties(&prop[1], device_id[1]));
|
||||
HIPCHECK(hipExtMallocWithFlags((void**)&flag[1], HIP_IPC_MEM_MIN_SIZE, prop[1].gcnArch / 10 == 94 ? hipDeviceMallocUncached : hipDeviceMallocFinegrained));
|
||||
HIPCHECK(hipMalloc((void**)&time_delta[1], HIP_IPC_MEM_MIN_SIZE));
|
||||
HIPCHECK(hipHostMalloc((void**)&time_delta[1], sizeof(uint64_t), hipHostMallocDefault));
|
||||
HIPCHECK(hipMalloc((void**)&abortFlag[1], sizeof(uint32_t)));
|
||||
HIPCHECK(hipMemsetAsync(flag[1], 0, HIP_IPC_MEM_MIN_SIZE, stream[1]));
|
||||
HIPCHECK(hipMemsetAsync(abortFlag[1], 0, sizeof(uint32_t), stream[0]));
|
||||
HIPCHECK(hipStreamSynchronize(stream[1]));
|
||||
|
||||
HIPCHECK(hipSetDevice(device_id[0]));
|
||||
PingKernel<<<1, LL_MAX_THREAD, 0, stream[0]>>>(flag[0], flag[1], time_delta[0], abortFlag[0]);
|
||||
PingKernel<<<1, LL_MAX_THREADS, 0, stream[0]>>>(flag[0], flag[1], time_delta[0], abortFlag[0]);
|
||||
|
||||
HIPCHECK(hipSetDevice(device_id[1]));
|
||||
PongKernel<<<1, LL_MAX_THREAD, 0, stream[1]>>>(flag[1], flag[0], time_delta[1], abortFlag[1]);
|
||||
PongKernel<<<1, LL_MAX_THREADS, 0, stream[1]>>>(flag[1], flag[0], time_delta[1], abortFlag[1]);
|
||||
|
||||
double vega_gpu_rtc_freq;
|
||||
|
||||
|
||||
Fai riferimento in un nuovo problema
Block a user