Jestem nowy w C, C++ i OpenCL i robię, co w mojej mocy, aby się ich nauczyć w tej chwili. Oto istniejąca funkcja języka C++, którą próbuję wymyślić, jak połączyć się z OpenCL, korzystając z powiązań C lub C++.Jak przekazywać i uzyskiwać dostęp wektorów C++ do jądra OpenCL?
#include <vector>
using namespace std;
class Test {
private:
double a;
vector<double> b;
vector<long> c;
vector<vector<double> > d;
public:
double foo(long x, double y) {
// mathematical operations
// using x, y, a, b, c, d
// and also b.size()
// to calculate return value
return 0.0;
}
};
Ogólnie moje pytanie brzmi, jak przekazać wszystkich członków klasy, że ta funkcja ma dostęp do wiązania i jądra. Rozumiem, jak przekazywać wartości skalarne, ale wartości wektorów, których nie jestem pewien. Czy jest jakiś sposób, aby przekazać wskaźniki do każdego z powyższych elementów lub odwzorować je w pamięci, aby widok OpenCL był zsynchronizowany z pamięcią hosta? W podziale moje pytania są jak poniżej.
- Jak przekazać człon b i c do wiązania i jądra, biorąc pod uwagę, że mają one zmienny rozmiar?
- Jak przekazać element członkowski d, ponieważ jest dwuwymiarowy?
- Jak uzyskać dostęp do tych członków z poziomu jądra i jakie typy będą zadeklarowane w argumentach do jądra? Czy po prostu użyjesz notacji indeksu tablicowego, np. B [0], aby uzyskać dostęp?
- Jak mogę wywołać operację równoważną b.size() w ramach funkcji jądra, czy też nie powinienem i zamiast tego przekazać rozmiar z wiązania do jądra jako dodatkowy argument? Co się stanie, jeśli się zmieni?
Naprawdę doceniłbym przykład kodu źródłowego kodu C lub C++ oraz kodu źródłowego w odpowiedziach.
Wielkie dzięki.
'using namespace std;' - Nie rób tego w nagłówku, nigdy. –
@EdS. dlaczego miałoby to być? – dominicbri7
@ dominicbri7: Ponieważ zanieczyszczasz globalną przestrzeń nazw dla wszystkich, którzy zawierają twój nagłówek. Może nie chcę, aby 'std' był importowany do mojej globalnej przestrzeni nazw. Może istnieje ku temu dobry powód. Nie zrobiłeś i dokonałeś wyboru dla mnie. –