/* ************************************************************************ * Copyright (C) 2018-2025 Advanced Micro Devices, Inc. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell cop- * ies of the Software, and to permit persons to whom the Software is furnished * to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IM- * PLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNE- * CTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * ************************************************************************ */ #pragma once #include "logging.hpp" #include "testing_common.hpp" #include "type_dispatch.hpp" #include #include #include #include #ifdef WIN32 #include #define setenv(A, B, C) _putenv_s(A, B) #else #include #include #endif #if __has_include() #include namespace fs = std::filesystem; #elif __has_include() #include namespace fs = std::experimental::filesystem; #else #error no filesystem found #endif template inline constexpr auto precision_letter = "*"; template <> inline constexpr auto precision_letter = "h"; template <> inline constexpr auto precision_letter = "s"; template <> inline constexpr auto precision_letter = "d"; template <> inline constexpr auto precision_letter = "c"; template <> inline constexpr auto precision_letter = "z"; #ifdef WIN32 int diff_files(std::string path1, std::string path2) { std::replace(path1.begin(), path1.end(), '/', '\\'); std::replace(path2.begin(), path2.end(), '/', '\\'); std::ifstream actual(path1); std::ifstream expected(path2); std::string test((std::istreambuf_iterator(actual)), std::istreambuf_iterator()); std::string gold((std::istreambuf_iterator(expected)), std::istreambuf_iterator()); actual.close(); expected.close(); int cmp = test != gold; return cmp; } #endif void erase_letter(std::string& str, char letter) { size_t pos = str.find(letter); if(pos != std::string::npos) { str.erase(pos, 1); } } // replaces X in string with s, d, c, z or h depending on typename T template std::string replaceX(rocblas_client_api api, std::string input_string) { char letter(precision_letter[0]); std::replace(input_string.begin(), input_string.end(), 'X', letter); // exceptions if(letter == 'c' || letter == 'z') { if(letter == 'c') std::replace(input_string.begin(), input_string.end(), 'P', 's'); else std::replace(input_string.begin(), input_string.end(), 'P', 'd'); std::replace(input_string.begin(), input_string.end(), 'U', 'u'); } else { erase_letter(input_string, 'P'); erase_letter(input_string, 'U'); } if(api & c_API_64) { input_string += "_64"; } return input_string; } template void testing_logging(const Arguments& arg) { rocblas_pointer_mode test_pointer_mode = arg.pointer_mode_host ? rocblas_pointer_mode_host : rocblas_pointer_mode_device; // set environment variable ROCBLAS_LAYER to turn on logging. Note that setenv // only has scope for this executable, so it is not necessary to save and restore // this environment variable // // ROCBLAS_LAYER is a bit mask (see enum rocblas_layer_mode) // ROCBLAS_LAYER = 1 turns on log_trace // ROCBLAS_LAYER = 2 turns on log_bench // ROCBLAS_LAYER = 4 turns on log_profile // ROCBLAS_LAYER = 8 turns on internal function log_trace int setenv_status; setenv_status = setenv("ROCBLAS_LAYER", "3", true); ASSERT_EQ(setenv_status, 0); // open files static std::string tmp_dir = rocblas_tempname(); std::string test_run(precision_letter); test_run.append(arg.pointer_mode_host ? "_hostptr" : "_devptr"); if(arg.api & c_API_64) { test_run.append("_I64"); } const fs::path trace_fspath1 = tmp_dir + std::string("trace_") + test_run + std::string(".csv"); const fs::path trace_fspath2 = tmp_dir + std::string("trace_") + test_run + std::string("_gold.csv"); const fs::path bench_fspath1 = tmp_dir + std::string("bench_") + test_run + std::string(".txt"); const fs::path bench_fspath2 = tmp_dir + std::string("bench_") + test_run + std::string("_gold.txt"); std::string trace_path1 = trace_fspath1.generic_string(); std::string trace_path2 = trace_fspath2.generic_string(); std::string bench_path1 = bench_fspath1.generic_string(); std::string bench_path2 = bench_fspath2.generic_string(); // set environment variable to give pathname of for log_trace file setenv_status = setenv("ROCBLAS_LOG_TRACE_PATH", trace_path1.c_str(), true); ASSERT_EQ(setenv_status, 0); // set environment variable to give pathname of for log_bench file setenv_status = setenv("ROCBLAS_LOG_BENCH_PATH", bench_path1.c_str(), true); ASSERT_EQ(setenv_status, 0); // // call rocBLAS functions with log_trace and log_bench to output log_trace and log_bench files // int64_t m = 3; int64_t n = 2; int64_t k = 1; int64_t kl = 1; int64_t ku = 1; int64_t incx = 1; int64_t incy = 1; int64_t lda = 4; rocblas_stride stride_a = 40; int64_t ldb = 5; rocblas_stride stride_b = 50; int64_t ldc = 6; rocblas_stride stride_c = 60; int64_t ldd = 7; rocblas_stride stride_d = 70; int64_t batch_count = 1; T h_alpha = 1.5; T* alpha = &h_alpha; T h_beta = 0.5; T* beta = &h_beta; real_t h_real_alpha = 1.5; real_t* real_alpha = &h_real_alpha; // for gemm_ex float alpha_float = 1.5; float beta_float = 0.5; DEVICE_MEMCHECK(device_vector, d_alpha, (1)); DEVICE_MEMCHECK(device_vector>, d_real_alpha, (1)); DEVICE_MEMCHECK(device_vector, d_beta, (1)); bool device_mode = test_pointer_mode == rocblas_pointer_mode_device; if(device_mode) { CHECK_HIP_ERROR(hipMemcpy(d_alpha, alpha, sizeof(T), hipMemcpyHostToDevice)); CHECK_HIP_ERROR(hipMemcpy(d_beta, beta, sizeof(T), hipMemcpyHostToDevice)); CHECK_HIP_ERROR( hipMemcpy(d_real_alpha, real_alpha, sizeof(real_t), hipMemcpyHostToDevice)); alpha = d_alpha; beta = d_beta; real_alpha = d_real_alpha; } rocblas_operation transA = rocblas_operation_none; rocblas_operation transB = rocblas_operation_transpose; rocblas_fill uplo = rocblas_fill_upper; rocblas_diagonal diag = rocblas_diagonal_unit; rocblas_side side = rocblas_side_left; // use m as larger int64_t size_x = m * incx; int64_t size_y = m * incy; // strides set above max requirements int64_t size_a = stride_a * batch_count; int64_t size_b = stride_b * batch_count; int64_t size_c = stride_c * batch_count; int64_t size_d = stride_d * batch_count; // allocate memory on device DEVICE_MEMCHECK(device_vector, dx, (size_x)); DEVICE_MEMCHECK(device_vector, dy, (size_y)); DEVICE_MEMCHECK(device_vector, da, (size_a)); DEVICE_MEMCHECK(device_vector, db, (size_b)); DEVICE_MEMCHECK(device_vector, dc, (size_c)); DEVICE_MEMCHECK(device_vector, dd, (size_d)); int64_t h_i64_result; rocblas_int h_i32_result; DEVICE_MEMCHECK(device_vector, d_i64_result, (1)); DEVICE_MEMCHECK(device_vector, d_i32_result, (1)); DEVICE_MEMCHECK(device_vector, d_result, (1)); DEVICE_MEMCHECK(device_vector>, d_real_result, (1)); T h_result; T* result = &h_result; real_t h_real_result; real_t* real_result = &h_real_result; int64_t* i64_result = &h_i64_result; rocblas_int* i32_result = &h_i32_result; if(device_mode) { result = d_result; real_result = d_real_result; i64_result = d_i64_result; i32_result = d_i32_result; } rocblas_pointer_mode mode; // enclose in {} so rocblas_local_handle destructor called as it goes out of scope { // Auxiliary functions rocblas_local_handle handle; rocblas_set_pointer_mode(handle, test_pointer_mode); rocblas_get_pointer_mode(handle, &mode); if constexpr(!std::is_same_v) { // *************************************************** BLAS1 *************************************************** if(arg.api == C_64) { rocblas_iamax_64(handle, n, dx, incx, i64_result); rocblas_iamin_64(handle, n, dx, incx, i64_result); } else { rocblas_iamax(handle, n, dx, incx, i32_result); rocblas_iamin(handle, n, dx, incx, i32_result); } auto rocblas_asum_fn = rocblas_asum; auto rocblas_asum_fn_64 = rocblas_asum_64; DAPI_CHECK(rocblas_asum_fn, (handle, n, dx, incx, real_result)); auto rocblas_copy_fn = rocblas_copy; auto rocblas_copy_fn_64 = rocblas_copy_64; DAPI_CHECK(rocblas_copy_fn, (handle, n, dx, incx, dy, incy)); } auto rocblas_axpy_fn = rocblas_axpy; auto rocblas_axpy_fn_64 = rocblas_axpy_64; DAPI_CHECK(rocblas_axpy_fn, (handle, n, alpha, dx, incx, dy, incy)); auto rocblas_axpy_ex_fn = rocblas_axpy_ex; auto rocblas_axpy_ex_fn_64 = rocblas_axpy_ex_64; // fixed datatype dispatch rocblas_datatype dt = rocblas_type2datatype(); DAPI_CHECK(rocblas_axpy_ex_fn, (handle, n, alpha, dt, dx, dt, incx, dy, dt, incy, dt)); auto rocblas_dot_fn = rocblas_dot; auto rocblas_dot_fn_64 = rocblas_dot_64; DAPI_CHECK(rocblas_dot_fn, (handle, n, dx, incx, dy, incy, result)); if constexpr(!std::is_same_v) { auto rocblas_nrm2_fn = rocblas_nrm2; auto rocblas_nrm2_fn_64 = rocblas_nrm2_64; DAPI_CHECK(rocblas_nrm2_fn, (handle, n, dx, incx, real_result)); auto rocblas_scal_r_fn = rocblas_scal>; auto rocblas_scal_r_fn_64 = rocblas_scal_64>; DAPI_CHECK(rocblas_scal_r_fn, (handle, n, real_alpha, dx, incx)); auto rocblas_scal_fn = rocblas_scal; auto rocblas_scal_fn_64 = rocblas_scal_64; DAPI_CHECK(rocblas_scal_fn, (handle, n, alpha, dx, incx)); auto rocblas_swap_fn = rocblas_swap; auto rocblas_swap_fn_64 = rocblas_swap_64; DAPI_CHECK(rocblas_swap_fn, (handle, n, dx, incx, dy, incy)); // *************************************************** BLAS2 *************************************************** auto rocblas_gbmv_fn = rocblas_gbmv; auto rocblas_gbmv_fn_64 = rocblas_gbmv_64; DAPI_CHECK(rocblas_gbmv_fn, (handle, transA, m, n, kl, ku, alpha, da, lda, dx, incx, beta, dy, incy)); auto rocblas_gemv_fn = rocblas_gemv; auto rocblas_gemv_fn_64 = rocblas_gemv_64; DAPI_CHECK(rocblas_gemv_fn, (handle, transA, m, n, alpha, da, lda, dx, incx, beta, dy, incy)); auto rocblas_ger_fn = rocblas_ger; auto rocblas_ger_fn_64 = rocblas_ger_64; DAPI_CHECK(rocblas_ger_fn, (handle, m, n, alpha, dx, incx, dy, incy, da, lda)); if constexpr(!rocblas_is_complex) { auto rocblas_sbmv_fn = rocblas_sbmv; auto rocblas_sbmv_fn_64 = rocblas_sbmv_64; DAPI_CHECK(rocblas_sbmv_fn, (handle, uplo, n, k, alpha, da, lda, dx, incx, beta, dy, incy)); auto rocblas_spmv_fn = rocblas_spmv; auto rocblas_spmv_fn_64 = rocblas_spmv_64; DAPI_CHECK(rocblas_spmv_fn, (handle, uplo, n, alpha, da, dx, incx, beta, dy, incy)); auto rocblas_spr_fn = rocblas_spr; auto rocblas_spr_fn_64 = rocblas_spr_64; DAPI_CHECK(rocblas_spr_fn, (handle, uplo, n, alpha, dx, incx, da)); auto rocblas_spr2_fn = rocblas_spr2; auto rocblas_spr2_fn_64 = rocblas_spr2_64; DAPI_CHECK(rocblas_spr2_fn, (handle, uplo, n, alpha, dx, incx, dy, incy, da)); } auto rocblas_symv_fn = rocblas_symv; auto rocblas_symv_fn_64 = rocblas_symv_64; DAPI_CHECK(rocblas_symv_fn, (handle, uplo, n, alpha, da, lda, dx, incx, beta, dy, incy)); auto rocblas_syr_fn = rocblas_syr; auto rocblas_syr_fn_64 = rocblas_syr_64; DAPI_CHECK(rocblas_syr_fn, (handle, uplo, n, alpha, dx, incx, da, lda)); auto rocblas_syr2_fn = rocblas_syr2; auto rocblas_syr2_fn_64 = rocblas_syr2_64; DAPI_CHECK(rocblas_syr2_fn, (handle, uplo, n, alpha, dx, incx, dy, incy, da, lda)); auto rocblas_tbmv_fn = rocblas_tbmv; auto rocblas_tbmv_fn_64 = rocblas_tbmv_64; DAPI_CHECK(rocblas_tbmv_fn, (handle, uplo, transA, diag, n, k, da, lda, dx, incx)); auto rocblas_tpmv_fn = rocblas_tpmv; auto rocblas_tpmv_fn_64 = rocblas_tpmv_64; DAPI_CHECK(rocblas_tpmv_fn, (handle, uplo, transA, diag, n, da, dx, incx)); auto rocblas_trmv_fn = rocblas_trmv; auto rocblas_trmv_fn_64 = rocblas_trmv_64; DAPI_CHECK(rocblas_trmv_fn, (handle, uplo, transA, diag, n, da, lda, dx, incx)); auto rocblas_tbsv_fn = rocblas_tbsv; auto rocblas_tbsv_fn_64 = rocblas_tbsv_64; DAPI_CHECK(rocblas_tbsv_fn, (handle, uplo, transA, diag, n, k, da, lda, dx, incx)); auto rocblas_tpsv_fn = rocblas_tpsv; auto rocblas_tpsv_fn_64 = rocblas_tpsv_64; DAPI_CHECK(rocblas_tpsv_fn, (handle, uplo, transA, diag, n, da, dx, incx)); auto rocblas_trsv_fn = rocblas_trsv; auto rocblas_trsv_fn_64 = rocblas_trsv_64; DAPI_CHECK(rocblas_trsv_fn, (handle, uplo, transA, diag, n, da, lda, dx, incx)); // *************************************************** BLAS3 *************************************************** auto rocblas_trsm_fn = rocblas_trsm; auto rocblas_trsm_fn_64 = rocblas_trsm_64; DAPI_CHECK(rocblas_trsm_fn, (handle, side, uplo, transA, diag, m, n, alpha, da, lda, db, ldb)); auto rocblas_geam_fn = rocblas_geam; auto rocblas_geam_fn_64 = rocblas_geam_64; DAPI_CHECK(rocblas_geam_fn, (handle, transA, transB, m, n, alpha, da, lda, beta, db, ldb, dc, ldc)); auto rocblas_symm_fn = rocblas_symm; auto rocblas_symm_fn_64 = rocblas_symm_64; DAPI_CHECK(rocblas_symm_fn, (handle, side, uplo, m, n, alpha, da, lda, db, ldb, beta, dc, ldc)); auto rocblas_syrk_fn = rocblas_syrk; auto rocblas_syrk_fn_64 = rocblas_syrk_64; DAPI_CHECK(rocblas_syrk_fn, (handle, uplo, transA, n, k, alpha, da, lda, beta, dc, ldc)); auto rocblas_syr2k_fn = rocblas_syr2k; auto rocblas_syr2k_fn_64 = rocblas_syr2k_64; DAPI_CHECK(rocblas_syr2k_fn, (handle, uplo, transA, n, k, alpha, da, lda, db, ldb, beta, dc, ldc)); auto rocblas_syrkx_fn = rocblas_syrkx; auto rocblas_syrkx_fn_64 = rocblas_syrkx_64; DAPI_CHECK(rocblas_syrkx_fn, (handle, uplo, transA, n, k, alpha, da, lda, db, ldb, beta, dc, ldc)); auto rocblas_trmm_fn = rocblas_trmm; auto rocblas_trmm_fn_64 = rocblas_trmm_64; DAPI_CHECK(rocblas_trmm_fn, (handle, side, uplo, transA, diag, m, n, alpha, da, lda, db, ldb, dc, ldc)); } // !half // half allowed auto rocblas_gemm_fn = rocblas_gemm; auto rocblas_gemm_fn_64 = rocblas_gemm_64; DAPI_CHECK(rocblas_gemm_fn, (handle, transA, transB, m, n, k, alpha, da, lda, db, ldb, beta, dc, ldc)); auto rocblas_gemm_strided_batched_fn = rocblas_gemm_strided_batched; auto rocblas_gemm_strided_batched_fn_64 = rocblas_gemm_strided_batched_64; DAPI_CHECK(rocblas_gemm_strided_batched_fn, (handle, transA, transB, m, n, k, alpha, da, lda, stride_a, db, ldb, stride_b, beta, dc, ldc, stride_c, batch_count)); // exclude trtri as it is an internal function // rocblas_trtri(handle, uplo, diag, n, da, lda, db, ldb); // trmm // tritri if constexpr(!rocblas_is_complex) { // BLAS_EX void* alpha_gemm_ex = nullptr; void* beta_gemm_ex = nullptr; rocblas_half alpha_half(alpha_float); rocblas_half beta_half(beta_float); double alpha_double(alpha_float); double beta_double(beta_float); rocblas_gemm_algo algo = rocblas_gemm_algo_standard; int32_t solution_index = 0; uint32_t flags = 0; rocblas_datatype a_type; rocblas_datatype b_type; rocblas_datatype c_type; rocblas_datatype d_type; rocblas_datatype compute_type; DEVICE_MEMCHECK(device_vector, d_alpha_half, (1)); DEVICE_MEMCHECK(device_vector, d_beta_half, (1)); DEVICE_MEMCHECK(device_vector, d_alpha_float, (1)); DEVICE_MEMCHECK(device_vector, d_beta_float, (1)); DEVICE_MEMCHECK(device_vector, d_alpha_double, (1)); DEVICE_MEMCHECK(device_vector, d_beta_double, (1)); if constexpr(std::is_same_v) { a_type = rocblas_datatype_f16_r; b_type = rocblas_datatype_f16_r; c_type = rocblas_datatype_f16_r; d_type = rocblas_datatype_f16_r; compute_type = rocblas_datatype_f16_r; alpha_gemm_ex = &alpha_half; beta_gemm_ex = &beta_half; if(device_mode) { CHECK_HIP_ERROR(hipMemcpy( d_alpha_half, alpha_gemm_ex, sizeof(rocblas_half), hipMemcpyHostToDevice)); CHECK_HIP_ERROR(hipMemcpy( d_beta_half, beta_gemm_ex, sizeof(rocblas_half), hipMemcpyHostToDevice)); alpha_gemm_ex = d_alpha_half; beta_gemm_ex = d_beta_half; } } else if constexpr(std::is_same_v) { a_type = rocblas_datatype_f32_r; b_type = rocblas_datatype_f32_r; c_type = rocblas_datatype_f32_r; d_type = rocblas_datatype_f32_r; compute_type = rocblas_datatype_f32_r; alpha_gemm_ex = &alpha_float; beta_gemm_ex = &beta_float; if(device_mode) { CHECK_HIP_ERROR(hipMemcpy( d_alpha_float, alpha_gemm_ex, sizeof(float), hipMemcpyHostToDevice)); CHECK_HIP_ERROR(hipMemcpy( d_beta_float, beta_gemm_ex, sizeof(float), hipMemcpyHostToDevice)); alpha_gemm_ex = d_alpha_float; beta_gemm_ex = d_beta_float; } } else if constexpr(std::is_same_v) { a_type = rocblas_datatype_f64_r; b_type = rocblas_datatype_f64_r; c_type = rocblas_datatype_f64_r; d_type = rocblas_datatype_f64_r; compute_type = rocblas_datatype_f64_r; alpha_gemm_ex = &alpha_double; beta_gemm_ex = &beta_double; if(device_mode) { CHECK_HIP_ERROR(hipMemcpy( d_alpha_double, alpha_gemm_ex, sizeof(double), hipMemcpyHostToDevice)); CHECK_HIP_ERROR(hipMemcpy( d_beta_double, beta_gemm_ex, sizeof(double), hipMemcpyHostToDevice)); alpha_gemm_ex = d_alpha_double; beta_gemm_ex = d_beta_double; } } auto rocblas_gemm_ex_fn = rocblas_gemm_ex; auto rocblas_gemm_ex_fn_64 = rocblas_gemm_ex_64; DAPI_CHECK(rocblas_gemm_ex_fn, (handle, transA, transB, m, n, k, alpha_gemm_ex, da, a_type, lda, db, b_type, ldb, beta_gemm_ex, dc, c_type, ldc, dd, d_type, ldd, compute_type, algo, solution_index, flags)); auto rocblas_gemm_strided_batched_ex_fn = rocblas_gemm_strided_batched_ex; auto rocblas_gemm_strided_batched_ex_fn_64 = rocblas_gemm_strided_batched_ex_64; DAPI_CHECK(rocblas_gemm_strided_batched_ex_fn, (handle, transA, transB, m, n, k, alpha_gemm_ex, da, a_type, lda, stride_a, db, b_type, ldb, stride_b, beta_gemm_ex, dc, c_type, ldc, stride_c, dd, d_type, ldd, stride_d, batch_count, compute_type, algo, solution_index, flags)); } // !complex } // local_handle #ifdef BUILD_WITH_HIPBLASLT if(arg.algo == 1) { if constexpr(!rocblas_is_complex) { // internal API test requires hipblaslt backend to be used, see hardcoded results section // GEMM internal API trace 8 setenv_status = setenv("ROCBLAS_LAYER", "8", true); ASSERT_EQ(setenv_status, 0); // Auxiliary functions rocblas_local_handle handle; rocblas_set_pointer_mode(handle, test_pointer_mode); CHECK_ROCBLAS_ERROR(rocblas_gemm( handle, transA, transB, m, n, k, alpha, da, lda, db, ldb, beta, dc, ldc)); } // !complex } #endif // BUILD_WITH_HIPBLASLT setenv_status = setenv("ROCBLAS_LAYER", "0", true); ASSERT_EQ(setenv_status, 0); // // write "golden file" // std::ofstream trace_ofs; std::ofstream bench_ofs; trace_ofs.exceptions(std::ifstream::badbit | std::ifstream::failbit); trace_ofs.exceptions(std::ofstream::badbit | std::ofstream::failbit); trace_ofs.open(trace_path2); bench_ofs.open(bench_path2); ASSERT_FALSE(trace_ofs.fail()); ASSERT_FALSE(trace_ofs.bad()); ASSERT_FALSE(bench_ofs.fail()); ASSERT_FALSE(bench_ofs.bad()); rocblas_internal_ostream trace_ofs2; rocblas_internal_ostream bench_ofs2; std::string bench(arg.api == C_64 ? "./rocblas-bench --api 1" : "./rocblas-bench"); // Auxiliary function int pmode = (int)test_pointer_mode; trace_ofs2 << "rocblas_create_handle,atomics_not_allowed\n"; trace_ofs2 << "rocblas_set_pointer_mode," << pmode << ",atomics_not_allowed\n"; trace_ofs2 << "rocblas_get_pointer_mode," << pmode << ",atomics_not_allowed\n"; auto transA_letter = rocblas2char_operation(transA); auto transB_letter = rocblas2char_operation(transB); auto side_letter = rocblas2char_side(side); auto uplo_letter = rocblas2char_fill(uplo); auto diag_letter = rocblas2char_diagonal(diag); // *************************************************** BLAS1 *************************************************** const char* bench_endl = " \n"; // space for empty atomics enabled default if constexpr(!std::is_same_v) { // // AMAX // trace_ofs2 << replaceX(arg.api, "rocblas_iXamax") << "," << n << "," << (void*)dx << "," << incx << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f iamax -r " << rocblas_precision_string << " -n " << n << " --incx " << incx << bench_endl; // // AMIN // trace_ofs2 << replaceX(arg.api, "rocblas_iXamin") << "," << n << "," << (void*)dx << "," << incx << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f iamin -r " << rocblas_precision_string << " -n " << n << " --incx " << incx << bench_endl; // // ASUM // trace_ofs2 << replaceX(arg.api, "rocblas_PXasum") << "," << n << "," << (void*)dx << "," << incx << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f asum -r " << rocblas_precision_string << " -n " << n << " --incx " << incx << bench_endl; // // COPY // trace_ofs2 << replaceX(arg.api, "rocblas_Xcopy") << "," << n << "," << (void*)dx << "," << incx << "," << (void*)dy << "," << incy << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f copy -r " << rocblas_precision_string << " -n " << n << " --incx " << incx << " --incy " << incy << bench_endl; } // // AXPY // trace_ofs2 << replaceX(arg.api, "rocblas_Xaxpy") << "," << n << "," << h_alpha << "," << (void*)dx << "," << incx << "," << (void*)dy << "," << incy << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f axpy -r " << rocblas_precision_string << " -n " << n << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --incx " << incx << " --incy " << incy << bench_endl; // // AXPY_EX // std::string dt_str(rocblas_datatype_string(rocblas_type2datatype())); if(test_pointer_mode == rocblas_pointer_mode_host) { trace_ofs2 << replaceX(arg.api, "rocblas_axpy_ex") << "," << n << "," << h_alpha << "," << dt_str << "," << (void*)dx << "," << dt_str << "," << incx << "," << (void*)dy << "," << dt_str << "," << incy << "," << dt_str << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f axpy_ex" << " -n " << n << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --a_type " << dt_str << " --b_type " << dt_str << " --incx " << incx << " --c_type " << dt_str << " --incy " << incy << " --compute_type " << dt_str << bench_endl; } else { trace_ofs2 << replaceX(arg.api, "rocblas_axpy_ex") << "," << n << "," << dt_str << "," << (void*)dx << "," << dt_str << "," << incx << "," << (void*)dy << "," << dt_str << "," << incy << "," << dt_str << ",atomics_not_allowed\n"; // no bench output TODO } // // DOT // trace_ofs2 << replaceX(arg.api, "rocblas_XdotU") << "," << n << "," << (void*)dx << "," << incx << "," << (void*)dy << "," << incy << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f dot -r " << rocblas_precision_string << " -n " << n << " --incx " << incx << " --incy " << incy << bench_endl; if constexpr(!std::is_same_v) { // // NRM2 // trace_ofs2 << replaceX(arg.api, "rocblas_PXnrm2") << "," << n << "," << (void*)dx << "," << incx << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f nrm2 -r " << rocblas_precision_string << " -n " << n << " --incx " << incx << bench_endl; // // SCAL (real alpha) // trace_ofs2 << replaceX(arg.api, "rocblas_XPscal") << "," << n << "," << h_real_alpha << "," << (void*)dx << "," << incx << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f scal --a_type " << rocblas_precision_string << " --b_type " << rocblas_precision_string> << " -n " << n << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_real_alpha) << " --incx " << incx << bench_endl; // // SCAL // trace_ofs2 << replaceX(arg.api, "rocblas_Xscal") << "," << n << "," << h_alpha << "," << (void*)dx << "," << incx << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f scal --a_type " << rocblas_precision_string << " --b_type " << rocblas_precision_string << " -n " << n << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --incx " << incx << bench_endl; // // SWAP // trace_ofs2 << replaceX(arg.api, "rocblas_Xswap") << "," << n << "," << (void*)dx << "," << incx << "," << (void*)dy << "," << incy << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f swap -r " << rocblas_precision_string << " -n " << n << " --incx " << incx << " --incy " << incy << bench_endl; // *************************************************** BLAS2 *************************************************** // // GBMV // trace_ofs2 << replaceX(arg.api, "rocblas_Xgbmv") << "," << transA << "," << m << "," << n << "," << kl << "," << ku << "," << h_alpha << "," << (void*)da << "," << lda << "," << (void*)dx << "," << incx << "," << h_beta << "," << (void*)dy << "," << incy << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f gbmv -r " << rocblas_precision_string << " --transposeA " << transA_letter << " -m " << m << " -n " << n << " --kl " << kl << " --ku " << ku << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --lda " << lda << " --incx " << incx << " " << rocblas_internal_log_bench_scalar_value("beta", &h_beta) << " --incy " << incy << bench_endl; // // GEMV // trace_ofs2 << replaceX(arg.api, "rocblas_Xgemv") << "," << transA << "," << m << "," << n << "," << h_alpha << "," << (void*)da << "," << lda << "," << (void*)dx << "," << incx << "," << h_beta << "," << (void*)dy << "," << incy << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f gemv -r " << rocblas_precision_string << " --transposeA " << transA_letter << " -m " << m << " -n " << n << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --lda " << lda << " --incx " << incx << " " << rocblas_internal_log_bench_scalar_value("beta", &h_beta) << " --incy " << incy << bench_endl; // // GER // trace_ofs2 << replaceX(arg.api, "rocblas_XgerU") << "," << m << "," << n << "," << h_alpha << "," << (void*)dx << "," << incx << "," << (void*)dy << "," << incy << "," << (void*)da << "," << lda << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f " << replaceX(rocblas_client_api::C, "gerU") << " -r " << rocblas_precision_string << " -m " << m << " -n " << n << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --incx " << incx << " --incy " << incy << " --lda " << lda << bench_endl; if constexpr(!rocblas_is_complex) { // // SBMV // trace_ofs2 << replaceX(arg.api, "rocblas_Xsbmv") << "," << uplo << "," << n << "," << k << "," << h_alpha << "," << (void*)da << "," << lda << "," << (void*)dx << "," << incx << "," << h_beta << "," << (void*)dy << "," << incy << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f sbmv -r " << rocblas_precision_string << " --uplo " << uplo_letter << " -n " << n << " -k " << k << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --lda " << lda << " --incx " << incx << " " << rocblas_internal_log_bench_scalar_value("beta", &h_beta) << " --incy " << incy << bench_endl; // // SPMV // trace_ofs2 << replaceX(arg.api, "rocblas_Xspmv") << "," << uplo << "," << n << "," << h_alpha << "," << (void*)da << "," << (void*)dx << "," << incx << "," << h_beta << "," << (void*)dy << "," << incy << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f spmv -r " << rocblas_precision_string << " --uplo " << uplo_letter << " -n " << n << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --incx " << incx << " " << rocblas_internal_log_bench_scalar_value("beta", &h_beta) << " --incy " << incy << bench_endl; // // SPR // trace_ofs2 << replaceX(arg.api, "rocblas_Xspr") << "," << uplo << "," << n << "," << h_alpha << "," << (void*)dx << "," << incx << "," << (void*)da << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f spr -r " << rocblas_precision_string << " --uplo " << uplo_letter << " -n " << n << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --incx " << incx << bench_endl; // // SPR2 // trace_ofs2 << replaceX(arg.api, "rocblas_Xspr2") << "," << uplo << "," << n << "," << h_alpha << "," << (void*)dx << "," << incx << "," << (void*)dy << "," << incy << "," << (void*)da << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f spr2 -r " << rocblas_precision_string << " --uplo " << uplo_letter << " -n " << n << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --incx " << incx << " --incy " << incy << bench_endl; } // // SYMV // trace_ofs2 << replaceX(arg.api, "rocblas_Xsymv") << "," << uplo << "," << n << "," << h_alpha << "," << (void*)da << "," << lda << "," << (void*)dx << "," << incx << "," << h_beta << "," << (void*)dy << "," << incy << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f symv -r " << rocblas_precision_string << " --uplo " << uplo_letter << " -n " << n << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --lda " << lda << " --incx " << incx << " " << rocblas_internal_log_bench_scalar_value("beta", &h_beta) << " --incy " << incy << bench_endl; // // SYR // trace_ofs2 << replaceX(arg.api, "rocblas_Xsyr") << "," << uplo << "," << n << "," << h_alpha << "," << (void*)dx << "," << incx << "," << (void*)da << "," << lda << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f syr -r " << rocblas_precision_string << " --uplo " << uplo_letter << " -n " << n << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --incx " << incx << " --lda " << lda << bench_endl; // // SYR2 // trace_ofs2 << replaceX(arg.api, "rocblas_Xsyr2") << "," << uplo << "," << n << "," << h_alpha << "," << (void*)dx << "," << incx << "," << (void*)dy << "," << incy << "," << (void*)da << "," << lda << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f syr2 -r " << rocblas_precision_string << " --uplo " << uplo_letter << " -n " << n << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --lda " << lda << " --incx " << incx << " --incy " << incy << bench_endl; // // TBMV // trace_ofs2 << replaceX(arg.api, "rocblas_Xtbmv") << "," << uplo << "," << transA << "," << diag << "," << n << "," << k << "," << (void*)da << "," << lda << "," << (void*)dx << "," << incx << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f tbmv -r " << rocblas_precision_string << " --uplo " << uplo_letter << " --transposeA " << transA_letter << " --diag " << diag_letter << " -n " << n << " -k " << k << " --lda " << lda << " --incx " << incx << bench_endl; // // TPMV // trace_ofs2 << replaceX(arg.api, "rocblas_Xtpmv") << "," << uplo << "," << transA << "," << diag << "," << n << "," << (void*)da << "," << (void*)dx << "," << incx << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f tpmv -r " << rocblas_precision_string << " --uplo " << uplo_letter << " --transposeA " << transA_letter << " --diag " << diag_letter << " -n " << n << " --incx " << incx << bench_endl; // // TRMV // trace_ofs2 << replaceX(arg.api, "rocblas_Xtrmv") << "," << uplo << "," << transA << "," << diag << "," << n << "," << (void*)da << "," << lda << "," << (void*)dx << "," << incx << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f trmv -r " << rocblas_precision_string << " --uplo " << uplo_letter << " --transposeA " << transA_letter << " --diag " << diag_letter << " -n " << n << " --lda " << lda << " --incx " << incx << bench_endl; // // TBSV // trace_ofs2 << replaceX(arg.api, "rocblas_Xtbsv") << "," << uplo << "," << transA << "," << diag << "," << n << "," << k << "," << (void*)da << "," << lda << "," << (void*)dx << "," << incx << ",atomics_not_allowed\n"; if(test_pointer_mode == rocblas_pointer_mode_host) bench_ofs2 << bench.c_str() << " -f tbsv -r " << rocblas_precision_string << " --uplo " << uplo_letter << " --transposeA " << transA_letter << " --diag " << diag_letter << " -n " << n << " -k " << k << " --lda " << lda << " --incx " << incx << bench_endl; // // TPSV // trace_ofs2 << replaceX(arg.api, "rocblas_Xtpsv") << "," << uplo << "," << transA << "," << diag << "," << n << "," << (void*)da << "," << (void*)dx << "," << incx << ",atomics_not_allowed\n"; if(test_pointer_mode == rocblas_pointer_mode_host) bench_ofs2 << bench.c_str() << " -f tpsv -r " << rocblas_precision_string << " --uplo " << uplo_letter << " --transposeA " << transA_letter << " --diag " << diag_letter << " -n " << n << " --incx " << incx << bench_endl; // // TRSV // trace_ofs2 << replaceX(arg.api, "rocblas_Xtrsv") << "," << uplo << "," << transA << "," << diag << "," << n << "," << (void*)da << "," << lda << "," << (void*)dx << "," << incx << ",atomics_not_allowed\n"; if(test_pointer_mode == rocblas_pointer_mode_host) bench_ofs2 << bench.c_str() << " -f trsv -r " << rocblas_precision_string << " --uplo " << uplo_letter << " --transposeA " << transA_letter << " --diag " << diag_letter << " -n " << n << " --lda " << lda << " --incx " << incx << bench_endl; // *************************************************** BLAS3 *************************************************** // // TRSM // trace_ofs2 << replaceX(arg.api, "rocblas_Xtrsm") << "," << side << "," << uplo << "," << transA << "," << diag << "," << m << "," << n << "," << h_alpha << "," << (void*)da << "," << lda << "," << (void*)db << "," << ldb << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f trsm -r " << rocblas_precision_string << " --side " << side_letter << " --uplo " << uplo_letter << " --transposeA " << transA_letter << " --diag " << diag_letter << " -m " << m << " -n " << n << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --lda " << lda << " --ldb " << ldb << bench_endl; // // GEAM // trace_ofs2 << replaceX(arg.api, "rocblas_Xgeam") << "," << transA << "," << transB << "," << m << "," << n << "," << h_alpha << "," << (void*)da << "," << lda << "," << h_beta << "," << (void*)db << "," << ldb << "," << (void*)dc << "," << ldc << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f geam -r " << rocblas_precision_string << " --transposeA " << transA_letter << " --transposeB " << transB_letter << " -m " << m << " -n " << n << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --lda " << lda << " " << rocblas_internal_log_bench_scalar_value("beta", &h_beta) << " --ldb " << ldb << " --ldc " << ldc << bench_endl; // // SYMM // trace_ofs2 << replaceX(arg.api, "rocblas_Xsymm") << "," << side << "," << uplo << "," << m << "," << n << "," << h_alpha << "," << (void*)da << "," << lda << "," << (void*)db << "," << ldb << "," << h_beta << "," << (void*)dc << "," << ldc << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f symm -r " << rocblas_precision_string << " --side " << side_letter << " --uplo " << uplo_letter << " -m " << m << " -n " << n << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --lda " << lda << " --ldb " << ldb << " " << rocblas_internal_log_bench_scalar_value("beta", &h_beta) << " --ldc " << ldc << bench_endl; // // SYRK // trace_ofs2 << replaceX(arg.api, "rocblas_Xsyrk") << "," << uplo << "," << transA << "," << n << "," << k << "," << h_alpha << "," << (void*)da << "," << lda << "," << h_beta << "," << (void*)dc << "," << ldc << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f syrk -r " << rocblas_precision_string << " --uplo " << uplo_letter << " --transposeA " << transA_letter << " -n " << n << " -k " << k << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --lda " << lda << " " << rocblas_internal_log_bench_scalar_value("beta", &h_beta) << " --ldc " << ldc << bench_endl; // // SYR2K // trace_ofs2 << replaceX(arg.api, "rocblas_Xsyr2k") << "," << uplo << "," << transA << "," << n << "," << k << "," << h_alpha << "," << (void*)da << "," << lda << "," << (void*)db << "," << ldb << "," << h_beta << "," << (void*)dc << "," << ldc << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f syr2k -r " << rocblas_precision_string << " --uplo " << uplo_letter << " --transposeA " << transA_letter << " -n " << n << " -k " << k << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --lda " << lda << " --ldb " << ldb << " " << rocblas_internal_log_bench_scalar_value("beta", &h_beta) << " --ldc " << ldc << bench_endl; // // SYRKX // trace_ofs2 << replaceX(arg.api, "rocblas_Xsyrkx") << "," << uplo << "," << transA << "," << n << "," << k << "," << h_alpha << "," << (void*)da << "," << lda << "," << (void*)db << "," << ldb << "," << h_beta << "," << (void*)dc << "," << ldc << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f syrkx -r " << rocblas_precision_string << " --uplo " << uplo_letter << " --transposeA " << transA_letter << " -n " << n << " -k " << k << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --lda " << lda << " --ldb " << ldb << " " << rocblas_internal_log_bench_scalar_value("beta", &h_beta) << " --ldc " << ldc << bench_endl; // // TRMM // trace_ofs2 << replaceX(arg.api, "rocblas_Xtrmm") << "," << side << "," << uplo << "," << transA << "," << diag << "," << m << "," << n << "," << h_alpha << "," << (void*)da << "," << lda << "," << (void*)db << "," << ldb << "," << (void*)dc << "," << ldc << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f trmm -r " << rocblas_precision_string << " --side " << side_letter << " --uplo " << uplo_letter << " --transposeA " << transA_letter << " --diag " << diag_letter << " -m " << m << " -n " << n << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --lda " << lda << " --ldb " << ldb << " --ldc " << ldc << bench_endl; } // !half // // GEMM // trace_ofs2 << replaceX(arg.api, "rocblas_Xgemm") << "," << transA << "," << transB << "," << m << "," << n << "," << k << "," << h_alpha << "," << (void*)da << "," << lda << "," << (void*)db << "," << ldb << "," << h_beta << "," << (void*)dc << "," << ldc << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f gemm -r " << rocblas_precision_string << " --transposeA " << transA_letter << " --transposeB " << transB_letter << " -m " << m << " -n " << n << " -k " << k << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --lda " << lda << " --ldb " << ldb << " " << rocblas_internal_log_bench_scalar_value("beta", &h_beta) << " --ldc " << ldc << bench_endl; // // GEMM_STRIDED_BATCHED // trace_ofs2 << replaceX(arg.api, "rocblas_Xgemm_strided_batched") << "," << transA << "," << transB << "," << m << "," << n << "," << k << "," << h_alpha << "," << (void*)da << "," << lda << "," << stride_a << "," << (void*)db << "," << ldb << "," << stride_b << "," << h_beta << "," << (void*)dc << "," << ldc << "," << stride_c << "," << batch_count << ",atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f gemm_strided_batched -r " << rocblas_precision_string << " --transposeA " << transA_letter << " --transposeB " << transB_letter << " -m " << m << " -n " << n << " -k " << k << " " << rocblas_internal_log_bench_scalar_value("alpha", &h_alpha) << " --lda " << lda << " --stride_a " << stride_a << " --ldb " << ldb << " --stride_b " << stride_b << " " << rocblas_internal_log_bench_scalar_value("beta", &h_beta) << " --ldc " << ldc << " --stride_c " << stride_c << " --batch_count " << batch_count << bench_endl; if constexpr(!rocblas_is_complex) { rocblas_datatype a_type, b_type, c_type, d_type, compute_type; if(std::is_same_v) { a_type = rocblas_datatype_f16_r; b_type = rocblas_datatype_f16_r; c_type = rocblas_datatype_f16_r; d_type = rocblas_datatype_f16_r; compute_type = rocblas_datatype_f16_r; } else if(std::is_same_v) { a_type = rocblas_datatype_f32_r; b_type = rocblas_datatype_f32_r; c_type = rocblas_datatype_f32_r; d_type = rocblas_datatype_f32_r; compute_type = rocblas_datatype_f32_r; } if(std::is_same_v) { a_type = rocblas_datatype_f64_r; b_type = rocblas_datatype_f64_r; c_type = rocblas_datatype_f64_r; d_type = rocblas_datatype_f64_r; compute_type = rocblas_datatype_f64_r; } rocblas_gemm_algo algo = rocblas_gemm_algo_standard; int32_t solution_index = 0; uint32_t flags = 0; // //GEMM_EX // trace_ofs2 << replaceX(arg.api, "rocblas_gemm_ex") << "," << transA << "," << transB << "," << m << "," << n << "," << k << "," << alpha_float << "," << (void*)da << "," << rocblas_datatype_string(a_type) << "," << lda << "," << (void*)db << "," << rocblas_datatype_string(b_type) << "," << ldb << "," << beta_float << "," << (void*)dc << "," << rocblas_datatype_string(c_type) << "," << ldc << "," << (void*)dd << "," << rocblas_datatype_string(d_type) << "," << ldd << "," << rocblas_datatype_string(compute_type) << "," << algo << "," << solution_index << ",none,atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f gemm_ex" << " --transposeA " << transA_letter << " --transposeB " << transB_letter << " -m " << m << " -n " << n << " -k " << k << " --alpha " << alpha_float << " --a_type " << rocblas_datatype_string(a_type) << " --lda " << lda << " --b_type " << rocblas_datatype_string(b_type) << " --ldb " << ldb << " --beta " << beta_float << " --c_type " << rocblas_datatype_string(c_type) << " --ldc " << ldc << " --d_type " << rocblas_datatype_string(d_type) << " --ldd " << ldd << " --compute_type " << rocblas_datatype_string(compute_type) << " --algo " << algo << " --solution_index " << solution_index << " --flags " << flags << bench_endl; // //GEMM_STRIDED_BATCHED_EX // trace_ofs2 << replaceX(arg.api, "rocblas_gemm_strided_batched_ex") << "," << transA << "," << transB << "," << m << "," << n << "," << k << "," << alpha_float << "," << (void*)da << "," << rocblas_datatype_string(a_type) << "," << lda << "," << stride_a << "," << (void*)db << "," << rocblas_datatype_string(b_type) << "," << ldb << "," << stride_b << "," << beta_float << "," << (void*)dc << "," << rocblas_datatype_string(c_type) << "," << ldc << "," << stride_c << "," << (void*)dd << "," << rocblas_datatype_string(d_type) << "," << ldd << "," << stride_d << "," << batch_count << "," << rocblas_datatype_string(compute_type) << "," << algo << "," << solution_index << ",none,atomics_not_allowed\n"; bench_ofs2 << bench.c_str() << " -f gemm_strided_batched_ex" << " --transposeA " << transA_letter << " --transposeB " << transB_letter << " -m " << m << " -n " << n << " -k " << k << " --alpha " << alpha_float << " --a_type " << rocblas_datatype_string(a_type) << " --lda " << lda << " --stride_a " << stride_a << " --b_type " << rocblas_datatype_string(b_type) << " --ldb " << ldb << " --stride_b " << stride_b << " --beta " << beta_float << " --c_type " << rocblas_datatype_string(c_type) << " --ldc " << ldc << " --stride_c " << stride_c << " --d_type " << rocblas_datatype_string(d_type) << " --ldd " << ldd << " --stride_d " << stride_d << " --batch_count " << batch_count << " --compute_type " << rocblas_datatype_string(compute_type) << " --algo " << algo << " --solution_index " << solution_index << " --flags " << flags << bench_endl; } // !complex // Auxiliary function trace_ofs2 << "rocblas_destroy_handle,atomics_not_allowed\n"; #ifdef BUILD_WITH_HIPBLASLT if(arg.algo == 1) { if constexpr(!rocblas_is_complex) { // // GEMM internal logging only (no bench or profile) // trace_ofs2 << "rocblas_internal,rocblas_gemm_hipblaslt_backend" << "," << transA << "," << transB << "," << m << "," << n << "," << k << "," << h_alpha << "," << (void*)da << "," << lda << "," << (void*)db << "," << ldb << "," << h_beta << "," << (void*)dc << "," << ldc << "," << (void*)dc << "," << ldc << ",atomics_not_allowed\n"; // logs d info as also for gemm_ex } // !complex } #endif // BUILD_WITH_HIPBLASLT // excluded trtri as it is an internal function // trace_ofs2 << "\n" << replaceX("rocblas_Xtrtri") << "," << uplo << "," << diag << "," << // n // << "," << (void*)da << "," << lda << "," << (void*)db << "," << ldb; // Flush the streams trace_ofs2.flush(); bench_ofs2.flush(); // Transfer the formatted output to the files trace_ofs << trace_ofs2; bench_ofs << bench_ofs2; // Flush the streams trace_ofs.flush(); bench_ofs.flush(); // Close the files trace_ofs.close(); bench_ofs.close(); // // check if rocBLAS output files same as "golden files" // #ifdef WIN32 // need all file descriptors closed to allow file removal on windows before process exits rocblas_internal_ostream::clear_workers(); int trace_cmp = diff_files(trace_path1, trace_path2); //int trace_cmp = system(("fc.exe \"" + trace_path1 + "\" \"" + trace_path2 + "\" | findstr *****").c_str()); #else int trace_cmp = system(("/usr/bin/diff " + trace_path1 + " " + trace_path2).c_str()); #endif ASSERT_EQ(trace_cmp, 0); if(!trace_cmp) { fs::remove(trace_fspath1); fs::remove(trace_fspath2); } #ifdef WIN32 int bench_cmp = diff_files(bench_path1, bench_path2); //int bench_cmp = system(("fc.exe \"" + bench_path1 + "\" \"" + bench_path2 + "\" | findstr *****").c_str()); #else int bench_cmp = system(("/usr/bin/diff " + bench_path1 + " " + bench_path2).c_str()); #endif ASSERT_EQ(bench_cmp, 0); if(!bench_cmp) { fs::remove(bench_fspath1); fs::remove(bench_fspath2); } }