summaryrefslogtreecommitdiffstats
path: root/copy_experiments
diff options
context:
space:
mode:
Diffstat (limited to 'copy_experiments')
-rw-r--r--copy_experiments/mon_cross_ctx_copies.cu19
1 files changed, 12 insertions, 7 deletions
diff --git a/copy_experiments/mon_cross_ctx_copies.cu b/copy_experiments/mon_cross_ctx_copies.cu
index d9749e0..93d0e4c 100644
--- a/copy_experiments/mon_cross_ctx_copies.cu
+++ b/copy_experiments/mon_cross_ctx_copies.cu
@@ -92,7 +92,6 @@ void cpu_copy_mon(int loops, char* cpu_mem) {
92void* copy_thread(void* args_raw) { 92void* copy_thread(void* args_raw) {
93 CUcontext ctx; 93 CUcontext ctx;
94 int dev, i; 94 int dev, i;
95 cudaError_t err;
96 int *barrier; 95 int *barrier;
97 int *barrier_dev_ptr; // On Pascal+ this will be the same as *barrier 96 int *barrier_dev_ptr; // On Pascal+ this will be the same as *barrier
98 char *pinned_hostmem, *devmem; 97 char *pinned_hostmem, *devmem;
@@ -106,8 +105,8 @@ void* copy_thread(void* args_raw) {
106 // Explictly create a context (avoids creating a primary context implictly) 105 // Explictly create a context (avoids creating a primary context implictly)
107 // This has been verified on CUDA 11.1 to give each thread a different context 106 // This has been verified on CUDA 11.1 to give each thread a different context
108 // handle 107 // handle
109 cudaGetDevice(&dev); 108 SAFE(cudaGetDevice(&dev));
110 SAFE(cuCtxCreate(&ctx, 0, dev)); 109 SAFE_D(cuCtxCreate(&ctx, 0, dev));
111 110
112 uint64_t dev_ns, dev_ns2; 111 uint64_t dev_ns, dev_ns2;
113 double host_s, host_s2; 112 double host_s, host_s2;
@@ -249,21 +248,27 @@ static error_t arg_parser(int key, char* arg, struct argp_state *state) {
249} 248}
250 249
251int main(int argc, char**argv) { 250int main(int argc, char**argv) {
252 int tmp, dev; 251 int tmp, dev = 0;
252 CUdevice dev_itrl;
253 uint64_t *ctx_times[MAX_THREADS] = {0}; 253 uint64_t *ctx_times[MAX_THREADS] = {0};
254 pthread_t t[MAX_THREADS]; 254 pthread_t t[MAX_THREADS];
255 global_args_t g_args = {0}; 255 global_args_t g_args = {0};
256 256
257 // Temporarially initialize CUDA to query device attributes
258 SAFE_D(cuInit(0));
259 SAFE_D(cuDeviceGet(&dev_itrl, dev));
257 // Due to some laziness in how we handle barriers, this flag needs to be true 260 // Due to some laziness in how we handle barriers, this flag needs to be true
258 /// XXX: Still seems to work fine if it isn't??? 261 /// XXX: Still seems to work fine if it isn't???
259 cudaGetDevice(&dev); 262 SAFE_D(cuDeviceGetAttribute(&tmp, CU_DEVICE_ATTRIBUTE_CAN_MAP_HOST_MEMORY, dev_itrl));
260 cudaDeviceGetAttribute(&tmp, cudaDevAttrCanMapHostMemory, dev);
261 if (!tmp) { 263 if (!tmp) {
262 fprintf(stderr, "Unsupported platform. It must be possible to map host (CPU)" 264 fprintf(stderr, "Unsupported platform. It must be possible to map host (CPU)"
263 "DRAM into the GPU virtual address space for accurate clock" 265 " DRAM into the GPU virtual address space for accurate clock "
264 "synchronization. Exiting...\n"); 266 "synchronization. Exiting...\n");
265 return 1; 267 return 1;
266 } 268 }
269 // Terminate the context used for attrib check so it's not accidentially
270 // reused in subprocesses
271 SAFE_D(cuDevicePrimaryCtxRelease(dev_itrl));
267 272
268 struct argp argp = {opts, arg_parser, 0, desc}; 273 struct argp argp = {opts, arg_parser, 0, desc};
269 argp_parse(&argp, argc, argv, 0, 0, &g_args); 274 argp_parse(&argp, argc, argv, 0, 0, &g_args);