2013-04-16 5 views
1

Y a-t-il un chemin à partir d'un noyau (code GPU) pour savoir sur quel périphérique le code est exécuté? Vous pouvez trouver blockIdx, threadIdx, blockDim et gridDim, mais un moyen de trouver l'identifiant de périphérique CUDA?De quel périphérique un noyau cuda s'exécute-t-il?

Pour ceux qui se demandent, je prévois de l'utiliser dans un programme OptiX pour avoir plus de contrôle sur les tampons OptiX.

+0

Vous pouvez certainement découvrir les données dont vous avez besoin sur l'hôte, puis les transmettre au noyau lorsque vous l'appelez. par exemple. 'cudaSetDevice (x); mykernel <<<...> >> (x, ...); ' –

+0

Je suis limité par l'API OptiX qui ne me donne aucun contrôle sur la façon dont le travail est réparti sur plusieurs GPU. Pourtant, je voudrais déterminer quel périphérique le RT_PROGRAM est en cours d'exécution pour des raisons de stockage de mémoire. Par conséquent, je devrais trouver ceci du côté de l'appareil/du noyau, c.-à-d. J'ai besoin d'une fonction qui est __ device __ tagged. – apartridge

+1

Vous pouvez utiliser une variable '__device__' pour stocker l'identifiant de l'appareil, puisque cela est évidemment par périphérique ... – tera

Répondre

1

Cela fonctionne dans OptiX 3.0 et 3.5 mais je ne peux pas garantir qu'il fonctionnera toujours. Nous devrions fournir une vraie API pour cela dans une future version.

namespace rti_internal_register 
{ 
    __device__ unsigned reg_device_id; 
} 

rtBuffer<uchar4, 2> output_buffer; 

RT_PROGRAM void pinhole_camera() 
{ 
    if(rti_internal_register::reg_device_id == 0) 
     output_buffer[launch_index] = make_color(make_float3(0.5, 0.0, 0.0)); 
    else 
     output_buffer[launch_index] = make_color(make_float3(0.0, 0.5, 0.0)); 
} 
Questions connexes