Ich möchte den Low-Level-CUDA-Speicherzuordner (implementiert als thrust :: system :: cuda :: detail :: malloc()) überschreiben so dass es einen benutzerdefinierten Zuordner verwendet, anstatt cudaMalloc() direkt aufzurufen, wenn es auf einem Host (CPU) -Thread aufgerufen wird.Verwendung der CUDA Thrust-Ausführungsrichtlinie zum Überschreiben von Thrusts Low-Level-Gerätespeicherzuordner
Ist das möglich? Wenn ja, ist es möglich, den "Execution policy" -Mechanismus von Thrust dafür zu verwenden? Ich habe ein Modell wie folgt ausprobiert:
struct eptCGA : thrust::system::cuda::detail::execution_policy<eptCGA>
{
};
/// overload the Thrust malloc() template function implementation
template<typename eptCGA> __host__ __device__ void* malloc(eptCGA, size_t n)
{
#ifndef __CUDA_ARCH__
return MyMalloc(n); /* (called from a host thread) */
#else
return NULL; /* (called from a device GPU thread) */
#endif
}
/* called as follows, for example */
eptCGA epCGA;
thrust::remove_if(epCGA, ...);
Dies funktioniert. Aber es gibt andere Komponenten von Thrust, die auf die Low-Level-Malloc-Implementierung zugreifen, scheinbar ohne den Mechanismus der "Ausführungsrichtlinie" zu verwenden. Beispiel:
thrust::device_vector<UINT64> MyDeviceVector(...);
stellt keine Überladung mit einem "Ausführungsrichtlinie" -Parameter aus. Stattdessen wird malloc() am Ende von 15 geschachtelten Funktionsaufrufen aufgerufen, wobei eine Ausführungsrichtlinie verwendet wird, die scheinbar in einer der Schubfunktionen irgendwo in der Mitte dieses Aufrufstapels fest verdrahtet ist.
Kann jemand bitte erklären, wie der Ansatz, den ich nehme, falsch ist und erklären, was eine praktikable Implementierung tun sollte?
@RobertCrovella: Danke, aber das Codebeispiel, auf das du dich beziehst, ist älter als vier Jahre, hat Thrusts Unterstützung für Ausführungsrichtlinien vorgezogen und ist nicht wirklich aktuell, da es hauptsächlich darum geht, Thrusts temporären Pufferzuordner zu überschreiben Low-Level-Speicherzuordner. –
Ich verstehe diese Frage nicht - Ausführungsrichtlinie und der Speicherzuordner sind orthogonale Konzepte. Sie sollten nicht versuchen, irgendetwas in Schubsystem zu überladen. Wenn Sie einen benutzerdefinierten Zuordner verwenden möchten, implementieren Sie Ihr eigenes Modell von thrust :: allocator. Dafür ist es da. Was versuchst du eigentlich hier zu erreichen? – talonmies
@talonmies: Ich entschuldige mich, wenn die Frage nicht klar ist. Um eine GPU-Speicherzuordner-Implementierung zu verwenden, die cudaMalloc ersetzt, möchte ich die Thrustimplementierung an dem Punkt überschreiben, an dem sie cudaMalloc aufruft. Diese bestimmte Thrust-Implementierung unterstützt den Mechanismus der Ausführungsrichtlinie, der eine einfach zu implementierende Vorlagenüberladung ermöglicht. Das Problem dabei ist, dass verschiedene interne code-Pfade von Thrust den Parameter der Ausführungsrichtlinie nicht alle durchgehen. Insbesondere Thrusts temporärer Pufferzuordner, aber device_vector nicht. –