Files
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

536 lines
18 KiB
C++

/*! \file */
/* ************************************************************************
* Copyright (C) 2021-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.
*
* ************************************************************************ */
#pragma once
#include "rocsparse_check.hpp"
#include "rocsparse_matrix_coo.hpp"
#include "rocsparse_matrix_csx.hpp"
#include "rocsparse_matrix_dense.hpp"
#include "rocsparse_matrix_gebsx.hpp"
#include "rocsparse_type_conversion.hpp"
template <typename X, typename Y>
inline void
rocsparse_importer_copy_mixed_arrays(size_t size, X* __restrict__ x, const Y* __restrict__ y)
{
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic, 1024)
#endif
for(size_t i = 0; i < size; ++i)
{
x[i] = static_cast<X>(y[i]);
}
}
template <>
inline void rocsparse_importer_copy_mixed_arrays(size_t size,
rocsparse_float_complex* __restrict__ x,
const rocsparse_double_complex* __restrict__ y)
{
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic, 1024)
#endif
for(size_t i = 0; i < size; ++i)
{
x[i] = rocsparse_float_complex(static_cast<float>(std::real(y[i])),
static_cast<float>(std::imag(y[i])));
}
}
template <>
inline void rocsparse_importer_copy_mixed_arrays(size_t size,
rocsparse_double_complex* __restrict__ x,
const rocsparse_float_complex* __restrict__ y)
{
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic, 1024)
#endif
for(size_t i = 0; i < size; ++i)
{
x[i] = rocsparse_double_complex(static_cast<double>(std::real(y[i])),
static_cast<double>(std::imag(y[i])));
}
}
template <>
inline void rocsparse_importer_copy_mixed_arrays(size_t size,
int8_t* __restrict__ x,
const rocsparse_float_complex* __restrict__ y)
{
throw rocsparse_status_not_implemented;
}
template <>
inline void rocsparse_importer_copy_mixed_arrays(size_t size,
int8_t* __restrict__ x,
const rocsparse_double_complex* __restrict__ y)
{
throw rocsparse_status_not_implemented;
}
template <>
inline void rocsparse_importer_copy_mixed_arrays(size_t size,
int8_t* __restrict__ x,
const rocsparse_bfloat16* __restrict__ y)
{
throw rocsparse_status_not_implemented;
}
template <>
inline void rocsparse_importer_copy_mixed_arrays(size_t size,
_Float16* __restrict__ x,
const rocsparse_bfloat16* __restrict__ y)
{
throw rocsparse_status_not_implemented;
}
template <>
inline void rocsparse_importer_copy_mixed_arrays(size_t size,
_Float16* __restrict__ x,
const rocsparse_float_complex* __restrict__ y)
{
throw rocsparse_status_not_implemented;
}
template <>
inline void rocsparse_importer_copy_mixed_arrays(size_t size,
_Float16* __restrict__ x,
const rocsparse_double_complex* __restrict__ y)
{
throw rocsparse_status_not_implemented;
}
template <>
inline void rocsparse_importer_copy_mixed_arrays(size_t size,
rocsparse_bfloat16* __restrict__ x,
const _Float16* __restrict__ y)
{
throw rocsparse_status_not_implemented;
}
template <>
inline void rocsparse_importer_copy_mixed_arrays(size_t size,
rocsparse_bfloat16* __restrict__ x,
const rocsparse_float_complex* __restrict__ y)
{
throw rocsparse_status_not_implemented;
}
template <>
inline void rocsparse_importer_copy_mixed_arrays(size_t size,
rocsparse_bfloat16* __restrict__ x,
const rocsparse_double_complex* __restrict__ y)
{
throw rocsparse_status_not_implemented;
}
template <>
inline void rocsparse_importer_copy_mixed_arrays(size_t size,
float* __restrict__ x,
const rocsparse_float_complex* __restrict__ y)
{
throw rocsparse_status_not_implemented;
}
template <>
inline void rocsparse_importer_copy_mixed_arrays(size_t size,
float* __restrict__ x,
const rocsparse_double_complex* __restrict__ y)
{
throw rocsparse_status_not_implemented;
}
template <>
inline void rocsparse_importer_copy_mixed_arrays(size_t size,
double* __restrict__ x,
const rocsparse_float_complex* __restrict__ y)
{
throw rocsparse_status_not_implemented;
}
template <>
inline void rocsparse_importer_copy_mixed_arrays(size_t size,
double* __restrict__ x,
const rocsparse_double_complex* __restrict__ y)
{
throw rocsparse_status_not_implemented;
}
template <typename U>
rocsparse_status rocsparse_importer_switch_base(size_t size,
U& u,
rocsparse_index_base base,
rocsparse_index_base newbase)
{
if(base != newbase)
{
switch(newbase)
{
case rocsparse_index_base_one:
{
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic, 1024)
#endif
for(size_t i = 0; i < size; ++i)
{
++u[i];
}
return rocsparse_status_success;
}
case rocsparse_index_base_zero:
{
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic, 1024)
#endif
for(size_t i = 0; i < size; ++i)
{
--u[i];
}
return rocsparse_status_success;
}
}
return rocsparse_status_invalid_value;
}
return rocsparse_status_success;
}
template <typename IMPL>
class rocsparse_importer
{
public:
template <typename I = rocsparse_int, typename J = rocsparse_int>
rocsparse_status
import_sparse_csx(rocsparse_direction* dir, J* m, J* n, I* nnz, rocsparse_index_base* base)
{
return static_cast<IMPL&>(*this).import_sparse_csx(dir, m, n, nnz, base);
}
template <typename T, typename I = rocsparse_int, typename J = rocsparse_int>
rocsparse_status import_sparse_csx(I* ptr, J* ind, T* val)
{
return static_cast<IMPL&>(*this).import_sparse_csx(ptr, ind, val);
}
template <typename I = rocsparse_int, typename J = rocsparse_int>
rocsparse_status import_sparse_gebsx(rocsparse_direction* dir,
rocsparse_direction* dirb,
J* mb,
J* nb,
I* nnzb,
J* block_dim_row,
J* block_dim_column,
rocsparse_index_base* base)
{
return static_cast<IMPL&>(*this).import_sparse_gebsx(
dir, dirb, mb, nb, nnzb, block_dim_row, block_dim_column, base);
}
template <typename T, typename I = rocsparse_int, typename J = rocsparse_int>
rocsparse_status import_sparse_gebsx(I* ptr, J* ind, T* val)
{
return static_cast<IMPL&>(*this).import_sparse_gebsx(ptr, ind, val);
}
rocsparse_status import_dense_vector(size_t* size)
{
return static_cast<IMPL&>(*this).import_dense_vector(size);
}
template <typename T>
rocsparse_status import_dense_vector(T* data, size_t incy)
{
return static_cast<IMPL&>(*this).import_dense_vector(data, incy);
}
template <typename I = rocsparse_int>
rocsparse_status import_dense_matrix(rocsparse_order* order, I* m, I* n)
{
return static_cast<IMPL&>(*this).import_dense_matrix(order, m, n);
}
template <typename T, typename I = rocsparse_int>
rocsparse_status import_dense_matrix(T* data, I ld)
{
return static_cast<IMPL&>(*this).import_dense_matrix(data, ld);
}
template <typename I = rocsparse_int>
rocsparse_status import_sparse_coo(I* m, I* n, int64_t* nnz, rocsparse_index_base* base)
{
return static_cast<IMPL&>(*this).import_sparse_coo(m, n, nnz, base);
}
template <typename T, typename I = rocsparse_int>
rocsparse_status import_sparse_coo(I* row_ind, I* col_ind, T* val)
{
return static_cast<IMPL&>(*this).import_sparse_coo(row_ind, col_ind, val);
}
public:
template <rocsparse_direction DIRECTION,
typename T,
typename I = rocsparse_int,
typename J = rocsparse_int>
rocsparse_status import(host_csx_matrix<DIRECTION, T, I, J>& csx_)
{
//
// Define
//
{
J M;
J N;
I nnz;
rocsparse_index_base base;
rocsparse_direction dir;
rocsparse_status status = this->import_sparse_csx(&dir, &M, &N, &nnz, &base);
if(status != rocsparse_status_success)
{
return status;
}
csx_.define(M, N, nnz, base);
}
//
// Import
//
{
rocsparse_status status
= this->import_sparse_csx<T, I, J>(csx_.ptr, csx_.ind, csx_.val);
if(status != rocsparse_status_success)
{
return status;
}
}
return rocsparse_status_success;
}
template <typename T, typename I = rocsparse_int>
rocsparse_status import(host_coo_matrix<T, I>& matrix_)
{
//
// Define.
//
{
I M, N, nnz;
rocsparse_index_base base;
rocsparse_status status = this->import_sparse_coo(&M, &N, &nnz, &base);
if(status != rocsparse_status_success)
{
return status;
}
matrix_.define(M, N, nnz, base);
}
//
// Import.
//
{
rocsparse_status status
= this->import_sparse_coo(matrix_.ptr, matrix_.ind, matrix_.val, matrix_.base);
if(status != rocsparse_status_success)
{
return status;
}
}
return rocsparse_status_success;
}
template <rocsparse_direction DIRECTION,
typename T,
typename I = rocsparse_int,
typename J = rocsparse_int>
rocsparse_status import(host_gebsx_matrix<DIRECTION, T, I, J>& that_)
{
//
// Define
//
{
J Mb;
J Nb;
I nnzb;
rocsparse_index_base base;
rocsparse_direction dir;
rocsparse_direction dirb;
J block_dim_row, block_dim_column;
rocsparse_status status = this->import_sparse_gebsx(
&dir, &dirb, &Mb, &Nb, &nnzb, &block_dim_row, &block_dim_column, &base);
if(status != rocsparse_status_success)
{
return status;
}
if(dir != DIRECTION)
{
std::cerr << "dir != DIRECTION" << std::endl;
return rocsparse_status_invalid_value;
}
that_.define(dirb, Mb, Nb, nnzb, block_dim_row, block_dim_column, base);
}
//
// Import
//
{
rocsparse_status status
= this->import_sparse_csx<T, I, J>(that_.ptr, that_.ind, that_.val);
if(status != rocsparse_status_success)
{
return status;
}
}
return rocsparse_status_success;
}
template <typename T, typename I = rocsparse_int>
rocsparse_status import(host_dense_matrix<T, I>& that_)
{
//
// Define
//
{
rocsparse_order order;
I M;
I N;
rocsparse_status status = this->import_dense_matrix(&order, &M, &N);
if(status != rocsparse_status_success)
{
return status;
}
that_.define(M, N, order);
}
//
// Import
//
{
rocsparse_status status = this->import_dense_matrix<T, I>(that_.val, that_.ld);
if(status != rocsparse_status_success)
{
return status;
}
}
return rocsparse_status_success;
}
template <typename T>
rocsparse_status import(host_dense_vector<T>& that_)
{
//
// Define
//
{
size_t M;
rocsparse_status status = this->import_dense_vector(&M);
if(status != rocsparse_status_success)
{
return status;
}
that_.resize(M);
}
//
// Import
//
{
static constexpr size_t ld = 1;
rocsparse_status status = this->import_dense_vector<T>(that_.data(), ld);
if(status != rocsparse_status_success)
{
return status;
}
}
return rocsparse_status_success;
}
};
template <typename A>
inline A convertToInt(A value)
{
return static_cast<A>(static_cast<int>(value));
}
template <>
inline rocsparse_float_complex convertToInt(rocsparse_float_complex value)
{
return rocsparse_float_complex(static_cast<float>(static_cast<int>(std::real(value))),
static_cast<float>(static_cast<int>(std::imag(value))));
}
template <>
inline rocsparse_double_complex convertToInt(rocsparse_double_complex value)
{
return rocsparse_double_complex(static_cast<double>(static_cast<int>(std::real(value))),
static_cast<double>(static_cast<int>(std::imag(value))));
}
inline void missing_file_error_message(const char* filename)
{
std::cerr << "#" << std::endl;
std::cerr << "# error:" << std::endl;
std::cerr << "# cannot open file '" << filename << "'" << std::endl;
std::cerr << "#" << std::endl;
std::cerr << "# PLEASE READ CAREFULLY !" << std::endl;
std::cerr << "#" << std::endl;
std::cerr << "# What could be the reason of this error: " << std::endl;
std::cerr
<< "# -1 If you are running the benchmarking application, then the path (or the name) "
"of the file you have specified might contain a typo."
<< std::endl;
std::cerr << "# -2 If you are running the benchmarking application, then the file you have "
"specified does not exist."
<< std::endl;
std::cerr
<< "# -3 If you are running the testing application, then it expects to find the file "
"at the specified location. This means that either you did not download the test "
"matrices, or you did not specify the location of the folder containing your "
"files. If you want to specify the location of the folder containing your files, "
"then you will find the needed information with 'rocsparse-test --help'."
"If you need to download matrices, then a cmake script "
"'rocsparse_clientmatrices.cmake' is available from the rocsparse client package."
<< std::endl;
std::cerr << "#" << std::endl;
std::cerr
<< "# Examples: 'rocsparse_clientmatrices.cmake -DCMAKE_MATRICES_DIR=<path-of-your-folder>'"
<< std::endl;
std::cerr << "# 'rocsparse-test --matrices-dir <path-of-your-folder>'" << std::endl;
std::cerr << "# (or 'export "
"ROCSPARSE_CLIENTS_MATRICES_DIR=<path-of-your-folder>;rocsparse-test')"
<< std::endl;
std::cerr << "#" << std::endl;
exit(rocsparse_status_internal_error);
}