1

演算子でCUDA Thrust の包括的スキャンを使用することによりmax、欠損値を前の非欠損値 (左側の最後の非欠損値) で埋めることができます。

しかし、次の非欠損値 (右側) を使用して埋める方法は? したがって、たとえば、0欠損値マーカーとして次のように使用します。

                  Input: [0 1 0 0 4 0 6 0]
 Fill missing from left: [0 1 1 1 4 4 6 6]
Fill missing from right: [0 1 4 4 4 6 6 6]   <- want

(最後の要素が欠落している場合は、左から最後の s を埋めることに戻ることに注意してください0。)

逆に包括的なスキャンを試みましたが、期待どおり[0 6 6 6 6 6 6 6]maxはありませんでした。

どうもありがとう。

4

2 に答える 2

3

ファンクターFillMissingとは、要素が0の場合は前の要素に置き換え、それ以外の場合は保持することを意味します。逆イテレータを使用する場合、「前」は正しいものを意味します。

#include <thrust/device_vector.h>
#include <thrust/scan.h>
#include <iterator>

template<class T>
struct FillMissing
{
    __host__ __device__ T operator()(const T& res, const T& dat)
    {
        return dat == T(0) ? res : dat;
    }
};

int main()
{
    thrust::device_vector<double> vec(8);
    vec[1] = 1;
    vec[4] = 4;
    vec[6] = 6;

    thrust::inclusive_scan(
            vec.rbegin(), vec.rend(),
            vec.rbegin(),
            FillMissing<double>());

    thrust::copy(
            vec.begin(), vec.end(),
            std::ostream_iterator<double>(std::cout, " "));
    std::cout << std::endl;
}

出力。

1 1 4 4 4 6 6 0

末尾の0を処理するために追加のコードが必要になる場合があります

于 2013-01-14T02:29:17.227 に答える
3

max()左から右にスキャンするときに値の昇順で機能する理由は、現在の最大値が常に0不足している要素よりも高くなるためです。最初から。

単純に右から左にスキャンするとmax()、範囲が下降するため、機能しなくなります。

rbegin()したがって、 andを使用しrend()て右から左にスキャンし、さらに MAX_INT をプレースホルダーおよびmin()演算子として使用する必要があるようです。

Input: [MAX_INT 1 MAX_INT MAX_INT 4 MAX_INT 6 MAX_INT]
Fill missing from right: [1 1 4 4 4 6 6 MAX_INT]

次に、左右の特殊なケースに合わせてファッジする必要があります。

于 2013-01-14T00:53:19.020 に答える