2013-02-28 3 views
1

Supposons que j'ai un algorithme comme ceci:C++ AMP Comment retourner des valeurs dans la mémoire GPU?

array a = foo(); 
array b = bar(a); 
array c = foobar(a, b); 
array d = fbar(a, c); 

Maintenant, c'est bien sur la CPU et CUDA, où je peux avoir des fonctions qui renvoient un pointeur vers un bloc de mémoire gpu et une autre fonction consomme que valeur intermédiaire.

Comment faites-vous cela en C++ AMP? Je devine que vous devez utiliser l'objet concurrency :: array mais je ne peux pas trouver d'exemple de code pour le faire.

Répondre

1

La classe concurrency :: array est comme n'importe quelle autre classe de C++. Il n'y a pas de magie syntaxique ici. Donc, vous pouvez faire ceci:

using namespace concurrency; // because I hate typing 

array<int, 1> foo(int size) 
{ 
    return array<int, 1>(size); 
} 

array<int, 1> bar(array<int, 1> input) 
{ 
    // do something to input 
    return input; 
} 

array<int> a = bar(foo(1024)); 

Cela produit probablement des copies plus profondes que vous le souhaitez. Mais en utilisant des pointeurs ou des références de quelque manière que vous soyez à l'aise, vous y parviendrez.

Mais rien de tout cela n'est spécifique à AMP. C'est juste en utilisant C++ 11 dans ce code.

+0

Veuillez noter que la concurrence: type de tableau définit les constructeurs de déplacement, donc aucune copie supplémentaire ne se produirait. –

2

Voici un exemple réel C++ AMP:

concurrency::array<int, 1> bar(const concurrency::array<int, 1>& input) 
{ 
    parallel_for_each(b.extent, [&b, &r](concurrency::index<1> idx) 
    { 
    input[idx] = ...; 
    }); 
    return input; 
} 

Comme le souligne Simon sur tableau <> soutient déplacer ce qui devrait être tout à fait efficace. Vous pouvez envisager d'utiliser array_view pour une meilleure flexibilité de code plutôt que pour le tableau <>.

Vous pouvez également faire le ménage en déplaçant la valeur de retour de la barre au lieu de faire une copie implicite.

+0

+1 Pourquoi déplacer le retour de barre? selon la norme, RVO doit être invoqué dans ce cas, de sorte que l'exemple donné aurait raison? – aCuria

+0

J'ai mis à jour le code pour correspondre à la sémantique d'origine pour bar(). Cependant, si vous passez des entrées et des sorties, il peut être préférable d'avoir une fonction void et de supprimer le const du paramètre d'entrée. –

Questions connexes