Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O código AMP C++ que você deseja executar no acelerador é especificado como um argumento em uma chamada para o parallel_for_each método. Você pode fornecer uma expressão lambda ou um objeto de função (functor) como esse argumento. Além disso, a expressão lambda ou o objeto de função pode chamar uma função restrita do C++ AMP. Este tópico usa um algoritmo de adição de matriz para demonstrar lambdas, objetos de função e funções restritas. O exemplo a seguir mostra o algoritmo sem código AMP C++. Duas matrizes 1-dimensionais de comprimento igual são criadas. Os elementos inteiros correspondentes são adicionados e armazenados em uma terceira matriz 1-dimensional. C++ AMP não é usado.
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";
}
}
Expressão Lambda
Usar uma expressão lambda é a maneira mais direta de usar C++ AMP para reescrever o código.
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";
}
}
A expressão lambda deve incluir um parâmetro de indexação e deve incluir restrict(amp). No exemplo, o objeto array_viewsum tem uma classificação de 1. Portanto, o parâmetro para a instrução lambda é um objeto de índice que tem classificação 1. No tempo de execução, a expressão lambda é executada uma vez para cada elemento no objeto array_view . Para obter mais informações, consulte Sintaxe de expressão do Lambda.
Objeto de função
Você pode fatorar o código do acelerador em um objeto de função.
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";
}
}
O objeto function deve incluir um construtor e deve incluir uma sobrecarga do operador de chamada de função. O operador de chamada de função deve incluir um parâmetro de indexação. Uma instância do objeto de função é passada como o segundo argumento para o método parallel_for_each . Neste exemplo, três objetos array_view são passados para o construtor do objeto de função. O objeto sum tem uma classificação de 1. Portanto, o parâmetro para o operador de chamada de função é um objeto de índice que tem classificação 1. No tempo de execução, a função é executada uma vez para cada elemento no objeto array_view . Para obter mais informações, consulte Chamada de função e objetos de função na biblioteca padrão do C++.
Função AMP-Restricted C++
Você pode decompor ainda mais o código do acelerador ao criar uma função restrita e chamá-la a partir de uma expressão lambda ou de um objeto de função. O exemplo de código a seguir demonstra como chamar uma função restrita de uma expressão 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";
}
}
A função restricted deve incluir restrict(amp) e estar em conformidade com as restrições descritas em restrict (C++ AMP).
Ver também
C++ AMP (paralelismo maciço acelerado em C++)
Sintaxe da expressão do Lambda
Chamada de função
Objetos de função na biblioteca padrão do C++
restringir (C++ AMP)