Ich versuche, ein CUDA-Projekt so weit wie möglich zu einem OO-Design zu machen. In dem Moment, fand die Lösung, die ich durch eine Struct unter Verwendung der Daten zu kapseln und für jede Methode, die einige GPU-Verarbeitung, die Umsetzung der drei Funktionen benötigt notwendig:Was ist die beste Möglichkeit, CUDA-Kernel zu kapseln?
- Die Methode, die durch die aufgerufen wird Objekt.
- A __ __ global Funktion, die eine __ __ Gerät Methode dieses struct nennen.
- Ein __ Gerät __ Methode innerhalb der Struktur.
Ich gebe Ihnen ein Beispiel. Nehmen wir an, ich muss eine Methode implementieren, um einen Puffer in einer Struktur zu initialisieren. Es wäre sieht aus wie etwas wie folgt aus:
struct Foo
{
float *buffer;
short2 buffer_resolution_;
short2 block_size_;
__device__ initBuffer()
{
int x = blockIdx.x * blockDim.x + threadIdx.x;
int y = blockIdx.y * blockDim.y + threadIdx.y;
int plain_index = (y * buffer_resolution.x) + x;
if(plain_index < buffer_size)
buffer[plain_index] = 0;
}
void init(const short2 &buffer_resolution, const short2 &block_size)
{
buffer_resolution_ = buffer_resolution;
block_size_ = block_size;
//EDIT1 - Added the cudaMalloc
cudaMalloc((void **)&buffer_, buffer_resolution.x * buffer_resolution.y);
dim3 threadsPerBlock(block_size.x, block_size.y);
dim3 blocksPerGrid(buffer_resolution.x/threadsPerBlock.x, buffer_resolution.y/threadsPerBlock.y)
initFooKernel<<<blocksPerGrid, threadsPerBlock>>>(this);
}
}
__global__ initFooKernel(Foo *foo)
{
foo->initBuffer();
}
Ich brauche das zu tun, weil aussieht, dass ich kippe ein __ global __ innerhalb der Struktur erklären. Ich habe diesen Weg anhand einiger Opensource-Projekte kennengelernt, aber es ist sehr schwierig, drei Funktionen zur Implementierung jeder gekapselten GPU-Methode zu implementieren. Also, meine Frage ist: Ist das der beste/einzige Ansatz möglich? Ist das überhaupt ein GÜLTIGER Ansatz?
EDIT1: Ich habe vergessen, den cudaMalloc vor dem Aufruf von initFooKernel den Puffer zuzuordnen. Behoben.
CUDA unterstützt nur interne Verbindungen, daher bin ich mir nicht sicher, welchen Vorteil Sie mit dieser Art von Design erwarten. – talonmies
Nun, ich möchte in der Lage sein, Foo-Methoden aufzurufen, auch wenn sie jeden Kernel als Standard-C++ aufrufen müssen. In diesem Fall wäre ich in der Lage, Foo f zu nennen; f.init (res, Größe); Außerdem kann ich die Strukturattribute innerhalb der __device__ Methoden verwenden. –
Ich würde gerne ein vollständiges funktionierendes Beispiel sehen, das auf dem von Ihnen geposteten Pseudocode basiert, weil ich nicht sehe, wie es funktionieren könnte. – talonmies