Files
2026-07-13 13:27:18 +08:00

183 lines
7.0 KiB
C++

/*!
* Copyright (c) 2021-2026 Microsoft Corporation. All rights reserved.
* Copyright (c) 2021-2026 The LightGBM developers. All rights reserved.
* Licensed under the MIT License. See LICENSE file in the project root for license information.
*/
#ifndef LIGHTGBM_INCLUDE_LIGHTGBM_CUDA_CUDA_ROW_DATA_HPP_
#define LIGHTGBM_INCLUDE_LIGHTGBM_CUDA_CUDA_ROW_DATA_HPP_
#ifdef USE_CUDA
#include <LightGBM/bin.h>
#include <LightGBM/config.h>
#include <LightGBM/cuda/cuda_utils.hu>
#include <LightGBM/dataset.h>
#include <LightGBM/train_share_states.h>
#include <LightGBM/utils/openmp_wrapper.h>
#include <cstdint>
#include <vector>
#define COPY_SUBROW_BLOCK_SIZE_ROW_DATA (1024)
#if CUDART_VERSION == 10000
#define DP_SHARED_HIST_SIZE (5176)
#else
#define DP_SHARED_HIST_SIZE (6144)
#endif
#define SP_SHARED_HIST_SIZE (DP_SHARED_HIST_SIZE * 2)
namespace LightGBM {
class CUDARowData {
public:
CUDARowData(const Dataset* train_data,
const TrainingShareStates* train_share_state,
const int gpu_device_id,
const bool gpu_use_dp);
~CUDARowData();
void Init(const Dataset* train_data,
TrainingShareStates* train_share_state);
void CopySubrow(const CUDARowData* full_set, const data_size_t* used_indices, const data_size_t num_used_indices);
void CopySubcol(const CUDARowData* full_set, const std::vector<int8_t>& is_feature_used, const Dataset* train_data);
void CopySubrowAndSubcol(const CUDARowData* full_set, const data_size_t* used_indices,
const data_size_t num_used_indices, const std::vector<bool>& is_feature_used, const Dataset* train_data);
template <typename BIN_TYPE>
const BIN_TYPE* GetBin() const;
template <typename PTR_TYPE>
const PTR_TYPE* GetPartitionPtr() const;
template <typename PTR_TYPE>
const PTR_TYPE* GetRowPtr() const;
int NumLargeBinPartition() const { return static_cast<int>(large_bin_partitions_.size()); }
int num_feature_partitions() const { return num_feature_partitions_; }
int max_num_column_per_partition() const { return max_num_column_per_partition_; }
bool is_sparse() const { return is_sparse_; }
uint8_t bit_type() const { return bit_type_; }
uint8_t row_ptr_bit_type() const { return row_ptr_bit_type_; }
const int* cuda_feature_partition_column_index_offsets() const { return cuda_feature_partition_column_index_offsets_.RawData(); }
const uint32_t* cuda_column_hist_offsets() const { return cuda_column_hist_offsets_.RawData(); }
const uint32_t* cuda_partition_hist_offsets() const { return cuda_partition_hist_offsets_.RawData(); }
int shared_hist_size() const { return shared_hist_size_; }
private:
void DivideCUDAFeatureGroups(const Dataset* train_data, TrainingShareStates* share_state);
template <typename BIN_TYPE>
void GetDenseDataPartitioned(const BIN_TYPE* row_wise_data, std::vector<BIN_TYPE>* partitioned_data);
template <typename BIN_TYPE, typename ROW_PTR_TYPE>
void GetSparseDataPartitioned(const BIN_TYPE* row_wise_data,
const ROW_PTR_TYPE* row_ptr,
std::vector<std::vector<BIN_TYPE>>* partitioned_data,
std::vector<std::vector<ROW_PTR_TYPE>>* partitioned_row_ptr,
std::vector<ROW_PTR_TYPE>* partition_ptr);
template <typename BIN_TYPE, typename ROW_PTR_TYPE>
void InitSparseData(const BIN_TYPE* host_data,
const ROW_PTR_TYPE* host_row_ptr,
CUDAVector<BIN_TYPE>* cuda_data,
CUDAVector<ROW_PTR_TYPE>* cuda_row_ptr,
CUDAVector<ROW_PTR_TYPE>* cuda_partition_ptr);
/*! \brief number of threads to use */
int num_threads_;
/*! \brief number of training data */
data_size_t num_data_;
/*! \brief number of bins of all features */
int num_total_bin_;
/*! \brief number of feature groups in dataset */
int num_feature_group_;
/*! \brief number of features in dataset */
int num_feature_;
/*! \brief number of bits used to store each bin value */
uint8_t bit_type_;
/*! \brief number of bits used to store each row pointer value */
uint8_t row_ptr_bit_type_;
/*! \brief is sparse row wise data */
bool is_sparse_;
/*! \brief start column index of each feature partition */
std::vector<int> feature_partition_column_index_offsets_;
/*! \brief histogram offset of each column */
std::vector<uint32_t> column_hist_offsets_;
/*! \brief histogram offset of each partition */
std::vector<uint32_t> partition_hist_offsets_;
/*! \brief maximum number of columns among all feature partitions */
int max_num_column_per_partition_;
/*! \brief number of partitions */
int num_feature_partitions_;
/*! \brief used when bagging with subset, number of used indices */
data_size_t num_used_indices_;
/*! \brief used when bagging with subset, number of total elements */
uint64_t num_total_elements_;
/*! \brief used when bagging with column subset, the size of maximum number of feature partitions */
int cur_num_feature_partition_buffer_size_;
/*! \brief CUDA device ID */
int gpu_device_id_;
/*! \brief index of partitions with large bins that its histogram cannot fit into shared memory, each large bin partition contains a single column */
std::vector<int> large_bin_partitions_;
/*! \brief index of partitions with small bins */
std::vector<int> small_bin_partitions_;
/*! \brief shared memory size used by histogram */
int shared_hist_size_;
/*! \brief whether to use double precision in histograms per block */
bool gpu_use_dp_;
// CUDA memory
/*! \brief row-wise data stored in CUDA, 8 bits */
CUDAVector<uint8_t> cuda_data_uint8_t_;
/*! \brief row-wise data stored in CUDA, 16 bits */
CUDAVector<uint16_t> cuda_data_uint16_t_;
/*! \brief row-wise data stored in CUDA, 32 bits */
CUDAVector<uint32_t> cuda_data_uint32_t_;
/*! \brief row pointer stored in CUDA, 16 bits */
CUDAVector<uint16_t> cuda_row_ptr_uint16_t_;
/*! \brief row pointer stored in CUDA, 32 bits */
CUDAVector<uint32_t> cuda_row_ptr_uint32_t_;
/*! \brief row pointer stored in CUDA, 64 bits */
CUDAVector<uint64_t> cuda_row_ptr_uint64_t_;
/*! \brief partition bin offsets, 16 bits */
CUDAVector<uint16_t> cuda_partition_ptr_uint16_t_;
/*! \brief partition bin offsets, 32 bits */
CUDAVector<uint32_t> cuda_partition_ptr_uint32_t_;
/*! \brief partition bin offsets, 64 bits */
CUDAVector<uint64_t> cuda_partition_ptr_uint64_t_;
/*! \brief start column index of each feature partition */
CUDAVector<int> cuda_feature_partition_column_index_offsets_;
/*! \brief histogram offset of each column */
CUDAVector<uint32_t> cuda_column_hist_offsets_;
/*! \brief histogram offset of each partition */
CUDAVector<uint32_t> cuda_partition_hist_offsets_;
/*! \brief block buffer when calculating prefix sum */
CUDAVector<uint16_t> cuda_block_buffer_uint16_t_;
/*! \brief block buffer when calculating prefix sum */
CUDAVector<uint32_t> cuda_block_buffer_uint32_t_;
/*! \brief block buffer when calculating prefix sum */
CUDAVector<uint64_t> cuda_block_buffer_uint64_t_;
};
} // namespace LightGBM
#endif // USE_CUDA
#endif // LIGHTGBM_INCLUDE_LIGHTGBM_CUDA_CUDA_ROW_DATA_HPP_