/* * Copyright (c) Advanced Micro Devices, Inc., or its affiliates. * * SPDX-License-Identifier: MIT */ #include #include #include "__syncthreads_count_negative_kernels_rtc.hh" #include "syncthreads_common.hh" /** * @addtogroup __syncthreads_count __syncthreads_count * @{ * @ingroup SyncthreadsTest */ /** * Test Description * ------------------------ * - Basic synchronization test for `__syncthreads_count`. * * Test source * ------------------------ * - unit/syncthreads/__syncthreads_count.cc * Test requirements * ------------------------ * - HIP_VERSION >= 5.2 */ HIP_TEST_CASE(Unit___syncthreads_count_Positive_Basic) { const auto kGridSize = 2; const auto kBlockSize = GENERATE(13, 32, 64, 513); LinearAllocGuard out_alloc(LinearAllocs::hipMallocManaged, sizeof(int) * kGridSize); HipTest::launchKernel(SyncthreadsKernel, kGridSize, kBlockSize, sizeof(int) * kBlockSize, nullptr, out_alloc.ptr()); HIP_CHECK(hipDeviceSynchronize()); for (int i = 0; i < kGridSize; ++i) { REQUIRE(out_alloc.host_ptr()[i] == kBlockSize * (kBlockSize + 1) / 2); } } /** * Test Description * ------------------------ * - Test `__syncthreads_count` with 0 as the predicate for all threads. * * Test source * ------------------------ * - unit/syncthreads/__syncthreads_count.cc * Test requirements * ------------------------ * - HIP_VERSION >= 5.2 */ HIP_TEST_CASE(Unit___syncthreads_count_Positive_Predicate_Zero) { const auto kGridSize = 2; const auto kBlockSize = GENERATE(13, 32, 64, 513); LinearAllocGuard out_alloc(LinearAllocs::hipMallocManaged, sizeof(int) * kGridSize * kBlockSize); HipTest::launchKernel(SyncthreadsZeroKernel, kGridSize, kBlockSize, 0, nullptr, out_alloc.ptr()); HIP_CHECK(hipDeviceSynchronize()); for (int i = 0; i < kGridSize * kBlockSize; ++i) { REQUIRE(out_alloc.host_ptr()[i] == 0); } } /** * Test Description * ------------------------ * - Test `__syncthreads_count` with 1 as the predicate for all threads. * * Test source * ------------------------ * - unit/syncthreads/__syncthreads_count.cc * Test requirements * ------------------------ * - HIP_VERSION >= 5.2 */ HIP_TEST_CASE(Unit___syncthreads_count_Positive_Predicate_One) { const auto kGridSize = 2; const auto kBlockSize = GENERATE(13, 32, 64, 513); LinearAllocGuard out_alloc(LinearAllocs::hipMallocManaged, sizeof(int) * kGridSize * kBlockSize); HipTest::launchKernel(SyncthreadsOneKernel, kGridSize, kBlockSize, 0, nullptr, out_alloc.ptr()); HIP_CHECK(hipDeviceSynchronize()); for (int i = 0; i < kGridSize * kBlockSize; ++i) { REQUIRE(out_alloc.host_ptr()[i] == kBlockSize); } } /** * Test Description * ------------------------ * - Test `__syncthreads_count` with 0 as the predicate for even threads, and 1 as the predicate * for odd threads. * * Test source * ------------------------ * - unit/syncthreads/__syncthreads_count.cc * Test requirements * ------------------------ * - HIP_VERSION >= 5.2 */ HIP_TEST_CASE(Unit___syncthreads_count_Positive_Predicate_OddEven) { const auto kGridSize = 2; const auto kBlockSize = GENERATE(13, 32, 64, 513); LinearAllocGuard out_alloc(LinearAllocs::hipMallocManaged, sizeof(int) * kGridSize * kBlockSize); HipTest::launchKernel(SyncthreadsOddEvenKernel, kGridSize, kBlockSize, 0, nullptr, out_alloc.ptr()); HIP_CHECK(hipDeviceSynchronize()); for (int i = 0; i < kGridSize * kBlockSize; ++i) { REQUIRE(out_alloc.host_ptr()[i] == kBlockSize / 2); } } /** * Test Description * ------------------------ * - Test `__syncthreads_count` with a negative predicate. * * Test source * ------------------------ * - unit/syncthreads/__syncthreads_count.cc * Test requirements * ------------------------ * - HIP_VERSION >= 5.2 */ HIP_TEST_CASE(Unit___syncthreads_count_Positive_Predicate_Negative) { const auto kGridSize = 2; const auto kBlockSize = GENERATE(13, 32, 64, 513); LinearAllocGuard out_alloc(LinearAllocs::hipMallocManaged, sizeof(int) * kGridSize * kBlockSize); HipTest::launchKernel(SyncthreadsNegativeKernel, kGridSize, kBlockSize, 0, nullptr, out_alloc.ptr()); HIP_CHECK(hipDeviceSynchronize()); for (int i = 0; i < kGridSize * kBlockSize; ++i) { REQUIRE(out_alloc.host_ptr()[i] == kBlockSize); } } /** * Test Description * ------------------------ * - Test `__syncthreads_count` with the thread ID as the predicate. * * Test source * ------------------------ * - unit/syncthreads/__syncthreads_count.cc * Test requirements * ------------------------ * - HIP_VERSION >= 5.2 */ HIP_TEST_CASE(Unit___syncthreads_count_Positive_Predicate_Id) { const auto kGridSize = 2; const auto kBlockSize = GENERATE(13, 32, 64, 513); LinearAllocGuard out_alloc(LinearAllocs::hipMallocManaged, sizeof(int) * kGridSize * kBlockSize); HipTest::launchKernel(SyncthreadsIdKernel, kGridSize, kBlockSize, 0, nullptr, out_alloc.ptr()); HIP_CHECK(hipDeviceSynchronize()); for (int i = 0; i < kGridSize * kBlockSize; ++i) { REQUIRE(out_alloc.host_ptr()[i] == kBlockSize - 1); } } /** * Test Description * ------------------------ * - Real-time compiles kernels that pass invalid arguments to `__syncthreads_count`. * * Test source * ------------------------ * - unit/syncthreads/__syncthreads_count.cc * Test requirements * ------------------------ * - HIP_VERSION >= 5.2 */ HIP_TEST_CASE(Unit___syncthreads_count_Negative_Parameters_RTC) { hiprtcProgram program{}; HIPRTC_CHECK(hiprtcCreateProgram(&program, kSyncthreadsCountSource, "__syncthreads_count_negative.cc", 0, nullptr, nullptr)); hiprtcResult result{hiprtcCompileProgram(program, 0, nullptr)}; // Get the compile log and count compiler error messages size_t log_size{}; HIPRTC_CHECK(hiprtcGetProgramLogSize(program, &log_size)); std::string log(log_size, ' '); HIPRTC_CHECK(hiprtcGetProgramLog(program, log.data())); int error_count{0}; int expected_error_count{2}; std::string error_message{"error:"}; size_t n_pos = log.find(error_message, 0); while (n_pos != std::string::npos) { ++error_count; n_pos = log.find(error_message, n_pos + 1); } HIPRTC_CHECK(hiprtcDestroyProgram(&program)); HIPRTC_CHECK_ERROR(result, HIPRTC_ERROR_COMPILATION); REQUIRE(error_count == expected_error_count); } /** * End doxygen group SyncthreadsTest. * @} */