2012-12-10 5 views
5

Zgodnie z dokumentacją NVidia dla cuLaunchKernel function, kernele skompilowane z CUDA 3.2+ zawierają informacje dotyczące ich listy parametrów. Czy istnieje sposób na pobieranie tych informacji programowo z uchwytu CUfunction? Muszę znać liczbę argumentów i rozmiar każdego argumentu w bajtach jądra z jego uchwytu CUfunction. Widziałem wyżej wspomnianą dokumentację NVidii mówiącą, że te informacje istnieją, ale nie widziałem nigdzie w dokumentacji CUDA wskazującej na programowy sposób dostępu do tych informacji.Jak mogę pobrać informacje o liście parametrów dla jądra CUDA 4.0+?

Aby dodać trochę więcej wyjaśnień: Pracuję z systemem middleware. Jego frontside biblioteka zastępuje libcuda (biblioteka API sterownika) w systemie docelowym. Tylna strona działa wtedy jako demon na innym hoście, który używa zasób GPGPU i wywołuje prawdziwą libcudę na tym komputerze. Istnieją inne rozwiązania middleware, które już to robią w cuLaunchKernel, więc jest to zdecydowanie możliwe. Również sama CUDA używa tych informacji, aby wiedzieć, jak analizować parametry od wskaźnika, który przekazujesz do cuLaunchKernel.

Edytuj: Pierwotnie miałem wersję CUDA, w której wprowadzone metadane zostały nieprawidłowo podane. To było 3,2, nie 4,0, zgodnie z cuLaunchKernel documentation.

+0

CUfunction jest kernelem z prefiksem __global__. Czy potrzebujesz wielkości argumentów CUfunction? Jeśli masz jądro, możesz je znaleźć. – ahmad

+0

Tak, potrzebuję rozmiaru jego argumentów. Nie mam źródła do jądra, tylko uchwyt do niego (prawdopodobnie wrócił z poprzedniego wywołania do cuModuleGetFunction().) W szczególności potrzebuję liczby argumentów i wielkości każdego argumentu. – reirab

Odpowiedz

1

cuLaunchKernel jest przeznaczony do uruchamiania jąder, dla których znasz prototyp funkcji. Nie ma API dla "reverse engineering" prototypu funkcji.

+2

Zdarzyło mi się, że * jeśli * jądro zostało skompilowane z łączem C++, powinno być możliwe odwzorowanie zmanipulowanej nazwy symbolu z symbolu ładunku ELF urządzenia w fatbinary lub cubin. Ale jeśli jądro jest skompilowane z łączem C, które nie zadziała ...... – talonmies

+0

To prawda! :) – harrism

+0

haha, tak, niestety nie mogę założyć, że zastosowano link C++. Zgodnie z dokumentacją dla cuLaunchKernel, liczba i typ argumentów jest przechowywany jako metadane z każdym kernelem skompilowanym przy pomocy CUDA 4.0+, ale nie widziałem żadnego publicznego API do uzyskiwania dostępu do tych informacji. Metadane są takie, jak sam cuLaunchKernel analizuje argumenty i jestem świadomy innych programów pośredniczących, które obsługują cuLaunchKernel, więc musi być jakaś droga do tego. Miałem nadzieję na coś lepszego niż analizowanie samego cubina, ale może tak właśnie być. – reirab

1

Pracuję nad tym samym problemem (nie wiem, czy w międzyczasie rozwiązałeś go). Używam znanego jądra, aby zbadać, w jaki sposób używana jest che śpiczasta pamięć. To jest wersja żadne parametry:

#include<cstdio> 

extern "C" { 
    __global__ void HelloWorld(){ 
     int thid = (blockIdx.x * blockDim.x) + threadIdx.x; 
    } 
} 

To jest wersja jednego parametru i tak dalej.

#include<cstdio> 

extern "C" { 
    __global__ void HelloWorld(int a) { 
     int thid = (blockIdx.x * blockDim.x) + threadIdx.x; 
    } 
} 

Proponuję zrzucić pierwsze 1024 bajty pamięci wskazanej przez CUfunction i postępować zgodnie ze wskazówkami. Na przykład przy przesunięciu 0x30 znajduje się wskaźnik wskazujący na tabelę wskaźników. Zauważyłem, że rozmiar struktury opublikowanej przez CUfunction nie zmienia się wraz z liczbą parametrów funkcji, więc tabela, której szukamy, musi zostać polowana zgodnie ze wskazówkami.

Powiązane problemy