| 1 | #include "samples_grouping_gpu.h" |
| 2 | namespace NCatboostCuda { |
| 3 | TGpuSamplesGrouping<NCudaLib::TMirrorMapping> TGpuSamplesGroupingHelper<NCudaLib::TMirrorMapping>::CreateGpuGrouping(const TFeatureParallelDataSet& dataSet, |
| 4 | const TSlice& slice) { |
| 5 | const IQueriesGrouping& grouping = dataSet.GetSamplesGrouping(); |
| 6 | |
| 7 | const ui32 rightGroupId = grouping.GetQueryId(slice.Right); |
| 8 | const ui32 leftGroupId = grouping.GetQueryId(slice.Left); |
| 9 | const ui32 groupCount = rightGroupId - leftGroupId; |
| 10 | TVector<ui32> offsets(groupCount); |
| 11 | TVector<ui32> sizes(groupCount); |
| 12 | const ui32 offset = grouping.GetQueryOffset(leftGroupId); |
| 13 | |
| 14 | for (ui32 i = leftGroupId; i < rightGroupId; ++i) { |
| 15 | offsets[i - leftGroupId] = grouping.GetQueryOffset(i) - offset; |
| 16 | sizes[i - leftGroupId] = grouping.GetQuerySize(i); |
| 17 | } |
| 18 | TMirrorBuffer<ui32> offsetsGpu = TMirrorBuffer<ui32>::Create(NCudaLib::TMirrorMapping(offsets.size())); |
| 19 | TMirrorBuffer<ui32> sizesGpu = TMirrorBuffer<ui32>::CopyMapping(offsetsGpu); |
| 20 | offsetsGpu.Write(offsets); |
| 21 | sizesGpu.Write(sizes); |
| 22 | TGpuSamplesGrouping<NCudaLib::TMirrorMapping> samplesGrouping; |
| 23 | |
| 24 | samplesGrouping.Grouping = &grouping; |
| 25 | samplesGrouping.CurrentDocsSlice = slice; |
| 26 | samplesGrouping.Offsets = offsetsGpu.ConstCopyView(); |
| 27 | samplesGrouping.Sizes = sizesGpu.ConstCopyView(); |
| 28 | samplesGrouping.OffsetBiases = NCudaLib::GetCudaManager().CreateDistributedObject<ui32>(0); |
| 29 | |
| 30 | { |
| 31 | const TQueriesGrouping* pointwiseSamplesGrouping = dynamic_cast<const TQueriesGrouping*>(&grouping); |
| 32 | if (pointwiseSamplesGrouping && pointwiseSamplesGrouping->GetFlatQueryPairs().size()) { |
| 33 | const auto& pairs = pointwiseSamplesGrouping->GetFlatQueryPairs(); |
| 34 | const auto& pairsWeights = pointwiseSamplesGrouping->GetQueryPairWeights(); |
| 35 | |
| 36 | auto pairsGpu = TMirrorBuffer<uint2>::Create(NCudaLib::TMirrorMapping(pairs.size())); |
| 37 | auto pairsWeightsGpu = TMirrorBuffer<float>::Create(NCudaLib::TMirrorMapping(pairs.size())); |
| 38 | |
| 39 | pairsGpu.Write(pairs); |
| 40 | pairsWeightsGpu.Write(pairsWeights); |
| 41 | |
| 42 | samplesGrouping.Pairs = pairsGpu.ConstCopyView(); |
| 43 | samplesGrouping.PairsWeights = pairsWeightsGpu.ConstCopyView(); |
| 44 | } |
| 45 | } |
| 46 | return samplesGrouping; |
| 47 | } |
| 48 | |
| 49 | TGpuSamplesGrouping<NCudaLib::TMirrorMapping> |
| 50 | TGpuSamplesGroupingHelper<NCudaLib::TMirrorMapping>::SliceGrouping(const TGpuSamplesGrouping<NCudaLib::TMirrorMapping>& grouping, |
nothing calls this directly
no test coverage detected