Pytanie Unikalność urządzenia OpenCL


Czy istnieje sposób na uzyskanie OpenCL, aby dać mi listę wszystkich unikalnych urządzeń fizycznych, które mają implementację OpenCL? Wiem, jak przejrzeć listę platform / urządzeń, ale na przykład w moim przypadku mam jedną platformę dostarczoną przez firmę Intel, która zapewnia wydajną implementację urządzenia dla mojego procesora, oraz platformę APP, która zapewnia szybką implementację dla mojego GPU, ale straszna implementacja mojego procesora.

Czy istnieje sposób sprawdzenia, czy dwa urządzenia CPU są w rzeczywistości tym samym urządzeniem fizycznym, tak że mogę wybrać najbardziej wydajny i pracować z nim, zamiast używać obu tych urządzeń i zmagać się ze sobą w celu obliczenia czasu jedno fizyczne urządzenie?

Spojrzałem na CL_DEVICE_VENDOR_ID i CL_DEVICE_NAME ale nie rozwiązują moich problemów, CL_DEVICE_NAME będzie taki sam dla dwóch oddzielnych urządzeń fizycznych tego samego modelu (z dwoma GPU) i CL_DEVICE_VENDOR_ID daje mi inny identyfikator dla mojego procesora w zależności od platformy.

Idealnym rozwiązaniem byłby jakiś unikalny fizyczny identyfikator urządzenia, ale byłbym zadowolony z ręcznej zmiany konfiguracji OpenCL, aby samemu zmienić układ urządzeń (jeśli coś takiego jest możliwe).


12
2018-06-01 15:00


pochodzenie


Nie mam pytania ... więc chcesz wybrać pomiędzy dwoma procesorami z identycznymi specyfikacjami? - ardiyu07
Chcę używać wszystkich dostępnych urządzeń fizycznych (w celu łatwego zrównoleglenia) - i chcę używać tylko jednego urządzenia logicznego przez fizyczne urządzenie, w przeciwnym razie dostanę rywalizację. - Thomas


Odpowiedzi:


O ile mogę teraz zbadać tę kwestię, nie ma niezawodnego rozwiązania. Jeśli cała twoja praca jest wykonywana w ramach jednego procesu, możesz użyć kolejności wpisów zwróconych przez clGetDeviceIDs lub cl_device same wartości (w zasadzie są to wskaźniki), ale sytuacja się pogarsza, jeśli próbujesz udostępnić te identyfikatory między procesami.

Widzieć na blogu tego gościa o tym, mówiąc:

Problem polega na tym, że jeśli masz dwa identyczne układy GPU, nie możesz ich rozróżnić. Jeśli zadzwonisz clGetDeviceIDs, kolejność, w jakiej są one zwracane, jest w rzeczywistości nieokreślona, ​​więc jeśli pierwszy proces wybierze pierwsze urządzenie, a drugi zabierze drugie urządzenie, oba mogą skończyć nadpisując ten sam GPU i pozostawiając drugi bezczynny.

Zauważa jednak, że nVidia i AMD udostępniają niestandardowe rozszerzenia, cl_amd_device_topology i cl_nv_device_attribute_query. Możesz sprawdzić, czy te rozszerzenia są obsługiwane przez twoje urządzenie, a następnie użyć ich jako następujących (kod autora oryginalnego):

// This cl_ext is provided as part of the AMD APP SDK
#include <CL/cl_ext.h>

cl_device_topology_amd topology;
status = clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD,
    sizeof(cl_device_topology_amd), &topology, NULL);

if(status != CL_SUCCESS) {
    // Handle error
}

if (topology.raw.type == CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD) {
    std::cout << "INFO: Topology: " << "PCI[ B#" << (int)topology.pcie.bus
        << ", D#" << (int)topology.pcie.device << ", F#"
        << (int)topology.pcie.function << " ]" << std::endl;
}

lub (kod przeze mnie, dostosowany z powyższego posta):

#define CL_DEVICE_PCI_BUS_ID_NV  0x4008
#define CL_DEVICE_PCI_SLOT_ID_NV 0x4009

cl_int bus_id;
cl_int slot_id;

status = clGetDeviceInfo (devices[i], CL_DEVICE_PCI_BUS_ID_NV,
    sizeof(cl_int), &bus_id, NULL);
if (status != CL_SUCCESS) {
    // Handle error.
}

status = clGetDeviceInfo (devices[i], CL_DEVICE_PCI_BUS_ID_NV,
    sizeof(cl_int), &slot_id, NULL);
if (status != CL_SUCCESS) {
    // Handle error.
}

std::cout << "Topology = [" << bus_id <<
                         ":"<< slot_id << "]" << std::endl;

4
2018-03-15 20:06



"kolejność, w której są one zwracane, jest w rzeczywistości nieokreślona" wow! to nawet gorsze, niż się spodziewałem. W każdym razie moje pytanie dotyczyło nie tyle wielu procesów, ale więcej różnych platform odsłaniających to samo fizyczne urządzenie (np. Intel SDK i AMD SDK, które eksponują ten sam główny procesor, co urządzenie logiczne w każdej z ich platform), ale to rozszerzenie topologii rozwiązuje to również. Dziękuję za odpowiedź! - Thomas
@Thomas: Witaj! BTW, clinfo Program powinien wyświetlać identyfikatory topologii dla urządzeń nVidia i AMD. Zdecydowanie powinieneś Spójrz jak sobie z tym radzą, ich kod wydaje się lepszy niż mój. - firegurafiku


  • Jeśli masz dwa urządzenia tego samego rodzaju należące do platformy, możesz je odróżnić przez skojarzony zwrot cl_device_ids przez clGetDeviceIDs.

  • Jeśli masz urządzenia, które mogą być używane przez dwie różne platformy, możesz wyeliminować wpisy dla drugiej platformy, porównując nazwy urządzeń z CL_DEVICE_NAME.

  • Jeśli chcesz znaleźć planowaną platformę dla urządzenia, porównaj ciągi CL_PLATFORM_VENDOR i CL_DEVICE_VENDOR odpowiednio z clGetPlatformInfo () i clGetDeviceInfo.

Możesz czytać na wszystkich platformach i wszystkich powiązanych z nimi urządzeniach na oddzielnych listach specyficznych dla platformy, a następnie eliminować podwójne, porównując nazwy urządzeń na oddzielnych listach. To powinno zapewnić, że nie otrzymasz tego samego urządzenia dla różnych platform.

Na koniec możesz, na przykład, za pomocą argumentów wiersza poleceń lub pliku konfiguracyjnego podać argumenty swojej aplikacji, aby powiązać urządzenia określonego typu (procesor, GPU, akcelerator) z określoną platformą, jeśli istnieje wybór różnych platform dla danego typu urządzenia. Mam nadzieję, że to odpowie na twoje pytanie.


2
2017-11-07 13:16





w każdym razie załóżmy, że próbujesz pobrać unikalny identyfikator dla wszystkich urządzeń, tak naprawdę możesz po prostu zapytać przy pomocy clGetDeviceIDs:

cl_int clGetDeviceIDs(cl_platform_id platform,
                      cl_device_type device_type,
                      cl_uint num_entries,
                      cl_device_id *devices,
                      cl_uint *num_devices)

następnie twoja lista urządzeń zostanie wstawiona do * tablicy urządzeń, a następnie możesz zrobić clGetDeviceInfo (), aby dowiedzieć się, które urządzenie chcesz użyć.


0
2018-06-02 02:27



Chcę korzystać z nich wszystkich, ale nie chcę dostępu do żadnego fizycznego urządzenia przez wiele urządzeń logicznych. - Thomas
Jeśli nie rozumiem, że chcesz robić wielowątkowe, wszystkie urządzenia działają w tym samym czasie? jeśli tak, to możesz chcieć rzucić okiem na CUDA's Computing SDK dla OpenCL, kodu źródłowego oclMultiThreads, gdzie możesz podzielić pracę ręcznie, a następnie uruchomić je asynchronicznie z dostępnymi urządzeniami - ardiyu07
Nie, moje pytanie jest bardziej subtelne. Wiem, że mogłem wymienić wszystkie urządzenia i wielowątkowe. Problem polega jednak na tym, że pojedyncze urządzenie fizyczne (na przykład mój unikalny procesor) pojawia się jako dwa urządzenia logiczne (jeden na każdej platformie OpenCL) - wielowątkowość w stosunku do dwóch urządzeń logicznych spowoduje rywalizację o zasoby z unikatowym fizycznym procesorem (jest to jeszcze więcej prawda dla GPU), więc chcę wykryć, że te dwa urządzenia logiczne wskazują to samo fizyczne urządzenie i używają tylko jednego z nich. - Thomas
Widzę wreszcie, że mam twoje pytanie. Nie wiem, w jaki sposób podzieliłeś swoje urządzenie na partycje i kazałeś im uruchamiać ten sam program opencl, ale istnieje również sposób na podzielenie urządzenia na pod-urządzenia z rozszerzeniem OpenCL, i możesz rzucić okiem na opis tutaj: khronos.org/registry/cl/extensions/ext/.... Myślę, że obsługuje zarówno Intel, jak i AMD, ale nie gwarantuję, że jest zgodny z twoim środowiskiem. - ardiyu07