// Step 1978: CUDALibraryProfile // // t1: buildLedger has cublas at 0.99 for compute.matrix // t2: cufft/compute.fft = 0.99 // t3: thrust/compute.parallel = 0.97 // t4: cudnn/compute.ml.inference = 0.99 // t5: cublas/compute.statistics is not applicable (score 0 / notApplicable) #include "CUDALibraryProfile.h" #include namespace ws = whetstone; static int p = 0, f = 0; #define T(n) { std::cout << " " << #n << "... "; } #define P() { std::cout << "PASS\n"; ++p; } #define F(m) { std::cout << "FAIL: " << m << "\n"; ++f; } #define C(c, m) if (!(c)) { F(m); return; } void t1() { T(cublas_compute_matrix_0_99); auto ledger = ws::CUDALibraryProfile::buildLedger(); C(ledger.score("cublas", "compute.matrix") == 0.99f, "cublas/compute.matrix = 0.99"); auto rec = ledger.get("cublas", "compute.matrix"); C(rec.has_value(), "record present"); C(!rec->preferredAPIs.empty(), "preferredAPIs non-empty"); bool hasSgemm = false; for (const auto& api : rec->preferredAPIs) if (api.find("cublasSgemm") != std::string::npos) hasSgemm = true; C(hasSgemm, "cublasSgemm in preferredAPIs"); P(); } void t2() { T(cufft_compute_fft_0_99); auto ledger = ws::CUDALibraryProfile::buildLedger(); C(ledger.score("cufft", "compute.fft") == 0.99f, "cufft/compute.fft = 0.99"); auto rec = ledger.get("cufft", "compute.fft"); C(rec.has_value(), "cufft record present"); C(!rec->preferredAPIs.empty(), "cufft preferredAPIs non-empty"); P(); } void t3() { T(thrust_compute_parallel_0_97); auto ledger = ws::CUDALibraryProfile::buildLedger(); C(ledger.score("thrust", "compute.parallel") == 0.97f, "thrust/compute.parallel = 0.97"); C(ledger.score("thrust", "compute.sort") == 0.97f, "thrust/compute.sort = 0.97"); P(); } void t4() { T(cudnn_ml_inference_0_99); auto ledger = ws::CUDALibraryProfile::buildLedger(); C(ledger.score("cudnn", "compute.ml.inference") == 0.99f, "cudnn/ml.inference = 0.99"); C(ledger.score("cudnn", "compute.ml.training") == 0.97f, "cudnn/ml.training = 0.97"); P(); } void t5() { T(cublas_statistics_not_applicable); auto ledger = ws::CUDALibraryProfile::buildLedger(); // cublas/compute.statistics has notApplicable=true, score=0 C(ledger.score("cublas", "compute.statistics") == 0.0f, "cublas/compute.statistics = 0"); auto rec = ledger.get("cublas", "compute.statistics"); C(rec.has_value(), "record exists"); C(rec->notApplicable, "notApplicable = true"); P(); } int main() { std::cout << "Step 1978: CUDALibraryProfile\n"; t1(); t2(); t3(); t4(); t5(); std::cout << "\n" << p << "/" << (p + f) << " passed\n"; return f > 0 ? 1 : 0; }