Ich habe es mit leeren Schleifen getestet (256 Threads x 3 Blöcke).
Zuerst habe ich habe eine einfache Schleife mit Cuda-Aufrufen geschrieben und 40.000 Iterationen pro Sekunde erhalten. Dann habe ich mein Setup geändert: Ich habe die Schleife in meine Kernelfunktion verschoben und den Aufruf __syncthreads() am Ende des Schleifenkörpers hinzugefügt. Dadurch wurde die Aktualisierungsrate auf 50.000 pro Sekunde erhöht. Kann das noch schneller gemacht werden?
Code: Select all
#include
#include
#define CHUNK_SIZE 16
struct Cell {
uint8_t type;
};
struct Chunk {
uint16_t x, y;
Cell cells[CHUNK_SIZE * CHUNK_SIZE][2];
};
__global__ void update(Chunk *chunks, unsigned long long steps) {
for (unsigned long long i = 0; i < steps; i++) {
// ...
__syncthreads();
}
}
int main(void) {
thrust::host_vector h_vec;
h_vec.push_back(Chunk { 0, 0 });
h_vec.push_back(Chunk { 10, 0 });
h_vec.push_back(Chunk { 10, 12 });
thrust::device_vector d_vec = h_vec;
Chunk *chunks = thrust::raw_pointer_cast(d_vec.data());
clock_t start = clock();
unsigned long long i = 0;
while ((clock() - start) < 5000) {
update(chunks, 100000);
i += 100000;
}
cudaDeviceSynchronize();
std::cout