2011-10-01 14 views
14

Pracowałem z OpenCL nad kilkoma projektami, ale zawsze pisałem jądro jako jedną (czasem raczej dużą) funkcję. Teraz pracuję nad bardziej złożonym projektem i chciałbym udostępniać funkcje w kilku jądrach.Jak konstruować duże jądra OpenCL?

Ale przykłady, które mogę znaleźć wszystkie pokazują jądro jako pojedynczy plik (bardzo niewiele wywołaj funkcje dodatkowe). Wygląda na to, że powinno być możliwe korzystanie z wielu plików - clCreateProgramWithSource() akceptuje wiele ciągów znaków (i łączy je, jak przypuszczam) - chociaż kodpyopencl zajmuje tylko jedno źródło.

Więc chciałbym usłyszeć od kogoś z doświadczeniem w ten sposób:

  • Czy są jakieś problemy związane z wielu plików źródłowych?
  • Czy najlepszym sposobem obejścia Pyopencl jest po prostu łączenie plików?
  • Czy istnieje sposób na skompilowanie biblioteki funkcji (zamiast przekazywania źródła biblioteki dla każdego jądra, nawet jeśli nie wszystkie są używane)?
  • Jeśli konieczne jest przekazywanie źródła biblioteki za każdym razem, czy nieużywane funkcje są odrzucane (brak narzutu)?
  • Jakieś inne sprawdzone metody/sugestie?

Dzięki.

+2

Możesz utworzyć jeden plik konkatenacji zawierający #include "part1.cl" #include "part2.cl". To działa dla mnie (kompilator NVidia), chociaż prawdopodobnie wszystko jest kompilowane przy każdym uruchomieniu aplikacji. Myślę, że posiadanie biblioteki prekompilowanych funkcji to trochę sci-fi, ponieważ kod funkcji jest wstawiony do każdego jądra (dlatego nie można pisać funkcji rekursywnych). –

Odpowiedz

6

Nie sądzę, że OpenCL ma koncepcję wielu plików źródłowych w programie - program jest jedną jednostką kompilacji. Możesz jednak użyć #include i przeciągnąć nagłówki lub inne pliki .cl podczas kompilacji.

Możesz mieć wiele jąder w programie OpenCL - tak, po jednej kompilacji możesz wywołać zestaw skompilowanego jądra.

Żaden kod nieużywany - funkcje lub wszystko, co statycznie wiadomo, że jest nieosiągalne - można uznać za wyeliminowany podczas kompilacji, przy niewielkich kosztach kompilacji czasu.

+0

dzięki. to właśnie robię. ale, co frustrujące, pyopencl nie uwzględnia zawartości #include podczas buforowania jądra. więc zmiana plików "biblioteki" nie wpływa na kompilowane jądra bez ręcznego kasowania pamięci podręcznej. w każdym razie, poczekam, aby sprawdzić, czy ktoś ma lepszy pomysł, zanim uzna cię za najlepszego (i tylko!). Twoje zdrowie. –

+0

Jeśli to prawda, to składnia clCreateProgramWithSource jest dość niezręczna, nieprawdaż? To wyraźnie wymaga wielu ciągów i długości każdego z tych ciągów. Nie jestem pewien, czy to faktycznie działa (mam tutaj próbując uruchomić go działa), ale brzmi dziwnie, że nie może działać ze względu na składnię ... – user1111929

5

W OpenCL 1.2 łączysz ze sobą różne pliki obiektów.

+0

dzięki; spróbuję tego, kiedy wrócę do pracy opencl. –

Powiązane problemy