2015-07-17 1 views
1

J'ai un flux CUDA que quelqu'un m'a remis - une valeur cudaStream_t. Le CUDA Runtime API ne semble pas indiquer comment je peux obtenir l'index de l'appareil auquel ce flux est associé.Les flux CUDA sont-ils associés à un périphérique? Et comment puis-je obtenir l'appareil d'un flux?

Maintenant, je sais que cudaStream_t est juste un pointeur vers une structure de flux au niveau du pilote, mais je suis hésitant à plonger dans le pilote trop. Existe-t-il une manière idiomatique de le faire? Ou une bonne raison de ne pas vouloir le faire?

Modifier: Un autre aspect de cette question est de savoir si le flux est réellement associé à un périphérique de telle sorte que le pilote CUDA peut lui-même déterminer l'identité de ce périphérique en fonction de la structure pointée.

+0

Je ne suis pas un expert CUDA et je n'ai aucune expérience pratique avec la programmation multi-GPU. Mais je m'attendrais à ce que chaque flux CUDA soit spécifique à un contexte CUDA particulier. Je m'attendrais également à ce que chaque GPU ait son propre contexte CUDA. Cela signifierait qu'un handle de flux CUDA n'est pas unique sur tous les périphériques, seulement unique pour chaque périphérique donné. Il se peut donc que vous deviez transmettre une paire {numéro de périphérique, gestionnaire de flux} dans l'application. – njuffa

+0

@njuffa: Si un flux CUDA est spécifique au contexte, et si un contexte est spécifique au périphérique, cela ne signifie-t-il pas qu'un flux CUDA gère _is_ unique sur tous les périphériques? Peut-être que je ne vous suis pas ... – einpoklum

+0

Un descripteur de flux unique sur tous les périphériques implique un "espace de nommage" global pour les descripteurs de flux. Je ne pense pas que cela existe. Donc, si vous supposez deux GPU, chacun avec son propre contexte. Le premier flux créé dans chaque contexte peut obtenir la valeur du handle 1. Quelqu'un passe un handle de flux avec la valeur 1 à votre code. À quel appareil appartient-il? Nous ne pouvons pas le dire. – njuffa

Répondre

1

En ce qui concerne les flux explicites, il appartient à l'implémentation (à ma connaissance) qu'aucune API ne fournisse cette capacité de requête potentielle aux utilisateurs; Je ne sais pas sur les capacités que le pilote peut vous fournir dans ce front, cependant, vous pouvez toujours interroger le flux.

En utilisant cudaStreamQuery, vous pouvez interroger votre flux ciblé sur votre périphérique sélectionné, si elle retourne cudaSuccess ou cudaErrorNotReady cela signifie que le flux existe sur cet appareil et si elle retourne cudaErrorInvalidResourceHandle, il signifie que ce n'est pas le cas.

+0

Est-ce que je suis sûr d'obtenir cudaErrorNotReady pour un flux de l'appareil n lors de l'interrogation avec le périphérique n 'sélectionné? – einpoklum

+0

L'un des cudaStreamQuery ou cudaErrorNotReady sera retourné à coup sûr pour le flux qui est interrogé si cela existe pour votre périphérique sélectionné. La première montre que toutes les opérations vers le flux associé sont complètes tandis que la dernière montre que ce n'est pas le cas; Quoi qu'il en soit, l'un ou l'autre des deux montre que le flux existe. Si vous obtenez cudaErrorInvalidResourceHandle sur un flux, cela signifie que le flux n'existe pas du tout. – Iman

+0

Mais le flux peut-il "exister" sur deux appareils? Pour être plus concret, supposons que, en interne, une valeur de flux soit juste un index dans le tableau de flux de son périphérique. Ainsi, le flux 0 existera toujours sur tous les appareils. Vais-je obtenir un cudaSucces de tous les GPU avec ce cudaStream_t? – einpoklum