blocked_nd_range の推論ガイド

blocked_nd_range の推論ガイド#

この機能を有効にするには、TBB_PREVIEW_BLOCKED_ND_RANGE_DEDUCTION_GUIDES マクロを 1 に定義します。

説明#

blocked_nd_range クラスは、oneTBB 並列アルゴリズムで再帰的に分割可能な N 次元半開区間を表します。この機能は、blocked_nd_range を拡張して、クラス・テンプレート引数推論 (C++17 以降) をサポートします。これにより、コンストラクター引数からテンプレート引数を推測できる場合、blocked_nd_range オブジェクトを作成する際にテンプレート引数を明示的に指定する必要がなくなります。

 
oneapi::tbb::blocked_range<int> range1(0, 100); 
oneapi::tbb::blocked_range<int> range2(0, 200); 
oneapi::tbb::blocked_range<int> range3(0, 300); 

// int タイプの一次元レンジが 3 つ提供されているため、 
// nd_range のタイプは oneapi::tbb::blocked_nd_range<int, 3> と推測できます 
oneapi::tbb::blocked_nd_range nd_range(range1, range2, range3);

この機能の実装の詳細な説明や、API に関するコメントやフィードバックを残すには、[対応する RFC] (uxlfoundation/oneTBB) を参照してください。

API#

概要#

namespace oneapi { 
namespace tbb { 

    template <typename Value, unsigned int N> 

    class blocked_nd_range { 
    public: 
        // oneTBB 仕様の一部として定義されたメンバータイプとコンストラクター 
        using value_type = Value; 
        using dim_range_type = blocked_range<value_type>; 
        using size_type = typename dim_range_type::size_type; 

        blocked_nd_range(const dim_range_type& dim0, /* N 個の const dim_range_type タイプの引数 */); // [1] 
        blocked_nd_range(const value_type (&dim_size)[N], size_type grainsize = 1); // [2] 
        blocked_nd_range(blocked_nd_range& r, split); // [3] 
        blocked_nd_range(blocked_nd_range& r, proportional_split); // [4] 
    }; // class blocked_nd_range 

    // 明示的な推論ガイド 
    template <typename Value, typename...Values> 
    blocked_nd_range(blocked_range<Value>, blocked_range<Values>...) 
    -> blocked_nd_range<Value, 1 + sizeof...(Values)>; 

    template <typename Value, unsigned int...Ns> 
    blocked_nd_range(const Value (&...)[Ns]) 
    -> blocked_nd_range<Value, sizeof...(Ns)>; 

    template <typename Value, unsigned int N> 
    blocked_nd_range(const Value (&)[N], typename blocked_nd_range<Value, N>::size_type = 1) 
    -> blocked_nd_range<Value, N>; 

    template <typename Value, unsigned int N> 
    blocked_nd_range(blocked_nd_range<Value, N>, split) 
    -> blocked_nd_range<Value, N>; 

    template <typename Value, unsigned int N> 
    blocked_nd_range(blocked_nd_range<Value, N>, proportional_split) 
    -> blocked_nd_range<Value, N>; 
} // namespace tbb 
} // namespace oneapi

デダクション・ガイド

blocked_nd_range のコピーおよび移動コンストラクターは、暗黙的に生成された推論ガイドを提供します。さらに、次の明示的なデダクション・ガイドが提供されます。

template <typename Value, typename... Values> 
blocked_nd_range(blocked_range<Value>, blocked_range<Values>...) 
-> blocked_nd_range<Value, 1 + sizeof...(Values)>;

効果: blocked_range オブジェクトのセットが blocked_nd_range コンストラクター [1] に渡されたときに推論を有効にします。

条件: Values 内のすべてのタイプが Value と同じ場合にのみ、オーバーロードの解決に参加します。

template <typename Value, unsigned int... Ns> 
blocked_nd_range(const Value (&...)[Ns]) 
-> blocked_nd_range<Value, sizeof...(Ns)>;

効果: blocked_range オブジェクトのセットが blocked_nd_range コンストラクター [1] に中括弧で囲まれた初期化リストとして渡された場合に推論を有効にします。

条件: sizeof...(Ns) >= 2 の場合にのみオーバーロードの解決に参加し、Ns 内の各整数 Ni2 または 3 のいずれかであり、それぞれ 2 個と 3 個の引数を持つ blocked_range コンストラクターに対応します。

このガイドでは、同じタイプのオブジェクトを含む中括弧で囲まれた初期化リストからの推論のみを許可します。非整数 value_type のレンジの場合、明示的な粒度引数の設定は推論ガイドではサポートされておらず、明示的なテンプレート引数を指定する必要があります。

template <typename Value, unsigned int N> 
blocked_nd_range(const Value (&)[N], typename blocked_nd_range<Value, N>::size_type = 1) 
-> blocked_nd_range<Value, N>;

効果: 次元サイズのセットを示す単一の C 配列オブジェクトから、blocked_nd_range のコンストラクター 2 への推論を許可します。

template <typename Value, unsigned int N> 
blocked_nd_range(blocked_nd_range<Value, N>, split) 
-> blocked_nd_range<Value, N>;

効果: blocked_nd_range の分割コンストラクター 3 を使用しながら推論を許可します。

template <typename Value, unsigned int N> 
blocked_nd_range(blocked_nd_range<Value, N>, proportional_split) 
-> blocked_nd_range<Value, N>;

効果: blocked_nd_range の比例分割コンストラクター 4 を使用しながら推論を許可します。

#


{ 
    oneapi::tbb::blocked_range<int> range1(0, 100); 
    oneapi::tbb::blocked_range<int> range2(0, 200); 

    // blocked_nd_range<int, 2> として推論 
    oneapi::tbb::blocked_nd_range nd_range(range1, range2); 
} 
{ 
    // blocked_nd_range<int, 2> として推論 
    oneapi::tbb::blocked_nd_range nd_range({0, 100}, {0, 200, 5}); 
} 
{ 
    int endings[3] = {100, 200, 300}; 

    // blocked_nd_range<int, 3> として推論 
    oneapi::tbb::blocked_nd_range nd_range1(endings); 

    // blocked_nd_range<int, 3> として推論 
    oneapi::tbb::blocked_nd_range nd_range2({100, 200, 300}, /*grainsize = */10); 
}