// SPDX-License-Identifier: BSD-3-Clause /* * common.h - shared conventions for the P2 "arbitrary CUDA kernels" suite. * * Line conventions (p2/run_guest.sh filters on these): * * compared (stable) RESULT / CHECK / ERR / STATUS / P2PRINT / PROBE / MAIL * informational DEVICE / INFO / TIMING / MEMINFO (ignored by compare) * * Every program accepts --emit-expected: it prints the deterministic * machine-checkable lines a correct GPU run must produce, computed on the * CPU only, without touching CUDA. p2/oracle.sh uses this fallback when the * host has no usable GPU (e.g. the device is owned by a running guest), so * the expected/ references are a documented deterministic computation * rather than a captured bare-metal run. * * All verification in this suite is exact (integers, or bit-identical * float/integer arithmetic and correctly-rounded fmaf), so `bad=0` is * meaningful and no tolerances are used. */ #ifndef P2_COMMON_H #define P2_COMMON_H #include #include #include #include #include #define P2_CHECK(call) \ do { \ cudaError_t e_ = (call); \ if (e_ != cudaSuccess) { \ printf("ERR cuda=%s code=%d line=%d\n", \ cudaGetErrorString(e_), (int)e_, __LINE__); \ printf("STATUS FAIL\n"); \ fflush(stdout); \ return 1; \ } \ } while (0) static inline int p2_emit_mode(int argc, char **argv) { return (argc > 1 && strcmp(argv[1], "--emit-expected") == 0) ? 1 : 0; } static inline void p2_device_info(void) { cudaDeviceProp prop; if (cudaGetDeviceProperties(&prop, 0) == cudaSuccess) printf("DEVICE %s cc=%d.%d sm=%d mem=%llu\n", prop.name, prop.major, prop.minor, prop.multiProcessorCount, (unsigned long long)prop.totalGlobalMem); else printf("DEVICE unavailable\n"); } static inline int p2_status(int bad) { printf("STATUS %s\n", bad == 0 ? "OK" : "FAIL"); fflush(stdout); return bad == 0 ? 0 : 1; } #endif /* P2_COMMON_H */