Files
TheRock/rocm-libraries/projects/rocprim/test/rocprim/test_counting_iterator.cpp
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

212 lines
6.8 KiB
C++

// MIT License
//
// Copyright (c) 2017-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
// copies 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
// IMPLIED, 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 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
#include "../common_test_header.hpp"
// required test headers
#include "test_seed.hpp"
#include "test_utils_assertions.hpp"
#include "test_utils_data_generation.hpp"
// required common headers
#include "../../common/utils_device_ptr.hpp"
// required rocprim headers
#include <rocprim/device/device_transform.hpp>
#include <rocprim/iterator/counting_iterator.hpp>
#include <algorithm>
#include <cstddef>
#include <vector>
// Params for tests
template<class InputType>
struct RocprimCountingIteratorParams
{
using input_type = InputType;
};
template<class Params>
class RocprimCountingIteratorTests : public ::testing::Test
{
public:
using input_type = typename Params::input_type;
const bool debug_synchronous = false;
};
using RocprimCountingIteratorTestsParams
= ::testing::Types<RocprimCountingIteratorParams<int>,
RocprimCountingIteratorParams<unsigned int>,
RocprimCountingIteratorParams<unsigned long>,
RocprimCountingIteratorParams<size_t>>;
TYPED_TEST_SUITE(RocprimCountingIteratorTests, RocprimCountingIteratorTestsParams);
TYPED_TEST(RocprimCountingIteratorTests, Basic)
{
int device_id = test_common_utils::obtain_device_from_ctest();
SCOPED_TRACE(testing::Message() << "with device_id = " << device_id);
HIP_CHECK(hipSetDevice(device_id));
using T = typename TestFixture::input_type;
using Iterator = rocprim::counting_iterator<T>;
using value_type = typename Iterator::value_type;
for(size_t seed_index = 0; seed_index < number_of_runs; seed_index++)
{
unsigned int seed_value
= seed_index < random_seeds_count ? rand() : seeds[seed_index - random_seeds_count];
SCOPED_TRACE(testing::Message() << "with seed = " << seed_value);
T start_value = test_utils::get_random_value<T>(1, 100, seed_value);
Iterator begin = rocprim::make_counting_iterator<T>(start_value);
Iterator mid = begin + 5;
Iterator end = begin + 10;
// Pre-increment
Iterator it = begin;
++it;
ASSERT_EQ(*it, start_value + 1);
// Post-increment
Iterator post = it++;
ASSERT_EQ(*post, start_value + 1);
ASSERT_EQ(*it, start_value + 2);
// Pre-decrement
--it;
ASSERT_EQ(*it, start_value + 1);
// Post-decrement
post = it--;
ASSERT_EQ(*post, start_value + 1);
ASSERT_EQ(*it, start_value + 0);
// operator+
Iterator plus_it = begin + 3;
ASSERT_EQ(*plus_it, start_value + 3);
Iterator plus_it_rev = 3 + begin;
ASSERT_EQ(*plus_it_rev, start_value + 3);
// operator-
Iterator minus_it = end - 3;
ASSERT_EQ(*minus_it, start_value + 7);
// compound assignment +=
Iterator a = begin;
a += 4;
ASSERT_EQ(*a, start_value + 4);
// compound assignment -=
a -= 2;
ASSERT_EQ(*a, start_value + 2);
// Subtraction of iterators (distance)
ASSERT_EQ(end - begin, T(10));
ASSERT_EQ(mid - begin, T(5));
ASSERT_EQ(begin - mid, T(-5));
// Indexing operator[]
for(int i = 0; i < 10; i++)
{
ASSERT_EQ(begin[i], start_value + i);
}
// Comparisons
ASSERT_TRUE(begin == begin);
ASSERT_TRUE(begin != end);
ASSERT_TRUE(begin < end);
ASSERT_TRUE(end > begin);
ASSERT_TRUE(begin <= begin);
ASSERT_TRUE(begin <= end);
ASSERT_TRUE(end >= begin);
ASSERT_TRUE(end >= end);
// Arrow operator
const value_type* ptr = begin.operator->();
ASSERT_EQ(*ptr, start_value);
}
}
template<class T>
struct transform
{
__device__ __host__
constexpr T operator()(const T& a) const
{
return 5 + a;
}
};
TYPED_TEST(RocprimCountingIteratorTests, Transform)
{
int device_id = test_common_utils::obtain_device_from_ctest();
SCOPED_TRACE(testing::Message() << "with device_id = " << device_id);
HIP_CHECK(hipSetDevice(device_id));
using T = typename TestFixture::input_type;
using Iterator = typename rocprim::counting_iterator<T>;
const bool debug_synchronous = TestFixture::debug_synchronous;
const size_t size = 1024;
hipStream_t stream = 0; // default
for(size_t seed_index = 0; seed_index < number_of_runs; seed_index++)
{
unsigned int seed_value = seed_index < random_seeds_count ? rand() : seeds[seed_index - random_seeds_count];
SCOPED_TRACE(testing::Message() << "with seed = " << seed_value);
SCOPED_TRACE(testing::Message() << "with size = " << size);
// Create counting_iterator<U> with random starting point
Iterator input_begin(test_utils::get_random_value<T>(0, 200, seed_value));
std::vector<T> output(size);
common::device_ptr<T> d_output(output.size());
// Calculate expected results on host
std::vector<T> expected(size);
std::transform(
input_begin,
input_begin + size,
expected.begin(),
transform<T>()
);
// Run
HIP_CHECK(rocprim::transform(input_begin,
d_output.get(),
size,
transform<T>(),
stream,
debug_synchronous));
HIP_CHECK(hipGetLastError());
HIP_CHECK(hipDeviceSynchronize());
// Copy output to host
output = d_output.load();
// Validating results
ASSERT_NO_FATAL_FAILURE(test_utils::assert_eq(output, expected));
}
}