共用方式為


使用 Lambda、函式物件和限制函式

您想要在加速器上執行的C++ AMP 程式代碼會指定為 方法呼叫 parallel_for_each 中的自變數。 您可以提供 Lambda 運算式或函式物件 (functor) 做為該自變數。 此外,Lambda 運算式或函式物件可以呼叫C++ AMP 限制函式。 本主題使用數位加法演算法來示範 Lambda、函式物件和受限制的函式。 下列範例顯示沒有C++ AMP 程式代碼的演算法。 會建立兩個長度相等的 1D 陣列。 對應的整數元素會加入並儲存在第三個 1 維陣列中。 C++ AMP 未使用。

void CpuMethod() {

    int aCPP[] = {1, 2, 3, 4, 5};
    int bCPP[] = {6, 7, 8, 9, 10};
    int sumCPP[5];

    for (int idx = 0; idx <5; idx++)
    {
        sumCPP[idx] = aCPP[idx] + bCPP[idx];
    }

    for (int idx = 0; idx <5; idx++)
    {
        std::cout <<sumCPP[idx] <<"\n";
    }
}

Lambda 表達式

使用 Lambda 運算式是使用 C++ AMP 重寫程式代碼的最直接方式。

void AddArraysWithLambda() {
    int aCPP[] = {1, 2, 3, 4, 5};
    int bCPP[] = {6, 7, 8, 9, 10};
    int sumCPP[5];

    array_view<const int, 1> a(5, aCPP);

    array_view<const int, 1> b(5, bCPP);

    array_view<int, 1> sum(5, sumCPP);

    sum.discard_data();

    parallel_for_each(
        sum.extent,
        [=](index<1> idx) restrict(amp)
        {
             sum[idx] = a[idx] + b[idx];
        });

    for (int i = 0; i <5; i++) {
        std::cout <<sum[i] <<"\n";
    }
}

Lambda 運算式必須包含一個索引參數,而且必須包含 restrict(amp)。 在此範例中 ,array_viewsum 物件具有1的順位。 因此,Lambda 語句的參數是 具有排名 1 的索引 物件。 在運行時間,lambda 運算式會針對array_view 物件中的每個項目執行一次。 如需詳細資訊,請參閱 Lambda 運算式語法

Function 物件

您可以將快速鍵程式代碼分解成函式物件。

class AdditionFunctionObject
{
public:
    AdditionFunctionObject(const array_view<int, 1>& a,
    const array_view<int, 1>& b,
    const array_view<int, 1>& sum)
    : a(a), b(b), sum(sum)
    {
    }

    void operator()(index<1> idx) restrict(amp)
    {
        sum[idx] = a[idx] + b[idx];
    }

private:
    array_view<int, 1> a;
    array_view<int, 1> b;
    array_view<int, 1> sum;
};

void AddArraysWithFunctionObject() {
    int aCPP[] = {1, 2, 3, 4, 5};
    int bCPP[] = {6, 7, 8, 9, 10};
    int sumCPP[5];

    array_view<const int, 1> a(5, aCPP);

    array_view<const int, 1> b(5, bCPP);

    array_view<int, 1> sum(5, sumCPP);

    sum.discard_data();

    parallel_for_each(
        sum.extent,
        AdditionFunctionObject(a, b, sum));

    for (int i = 0; i <5; i++) {
        std::cout <<sum[i] <<"\n";
    }
}

函式對象必須包含建構函式,而且必須包含函數調用運算元的多載。 函數調用運算子必須包含一個索引參數。 函式對象的實例會當做第二個自變數傳遞至 parallel_for_each 方法。 在此範例中,會將三 array_view對象傳遞至函式物件建構函式。 array_view 物件sum排名為1。 因此,函數調用運算符的參數是 具有排名 1 的索引 物件。 在運行時間,函式會針對array_view 物件中的每個項目執行一次。 如需詳細資訊,請參閱C++標準連結庫中的函數調用和函式物件。

C++ AMP-Restricted 函式

您可以藉由建立受限制的函式,並從 Lambda 表達式或函式物件呼叫它,進一步考慮快速鍵程序代碼。 下列程式代碼範例示範如何從 Lambda 運算式呼叫受限制的函式。

void AddElementsWithRestrictedFunction(index<1> idx, array_view<int, 1> sum, array_view<int, 1> a, array_view<int, 1> b) restrict(amp)
{
    sum[idx] = a[idx] + b[idx];
}

void AddArraysWithFunction() {

    int aCPP[] = {1, 2, 3, 4, 5};
    int bCPP[] = {6, 7, 8, 9, 10};
    int sumCPP[5];

    array_view<int, 1> a(5, aCPP);

    array_view<int, 1> b(5, bCPP);

    array_view<int, 1> sum(5, sumCPP);

    sum.discard_data();

    parallel_for_each(
        sum.extent,
        [=](index<1> idx) restrict(amp)
        {
            AddElementsWithRestrictedFunction(idx, sum, a, b);
        });

    for (int i = 0; i <5; i++) {
        std::cout <<sum[i] <<"\n";
    }
}

受限制的函式必須包含restrict(amp)並符合限制中所述的限制(C++ AMP)。

另請參閱

C++ AMP (C++ Accelerated Massive Parallelism)
Lambda 運算式語法
函式呼叫
C++ 標準程式庫的函式物件
restrict (C++ AMP)