ex7: vibe 2

This commit is contained in:
2025-11-04 14:04:22 +01:00
parent 1f62b76347
commit 9a8239a2e4
+43 -30
View File
@@ -49,9 +49,9 @@ real_t
real_t *buffers[3] = { NULL, NULL, NULL }; // device buffers
real_t *h_buffer = NULL;
#define U_prv(i, j) buffers[0][((i) + 1) * (N + 2) + (j) + 1]
#define U(i, j) buffers[1][((i) + 1) * (N + 2) + (j) + 1]
#define U_nxt(i, j) buffers[2][((i) + 1) * (N + 2) + (j) + 1]
#define U_prv(i, j) h_buffer[((i) + 1) * (N + 2) + (j) + 1]
#define U(i, j) h_buffer[((i) + 1) * (N + 2) + (j) + 1]
#define U_nxt(i, j) h_buffer[((i) + 1) * (N + 2) + (j) + 1]
// END: T1b
#define cudaErrorCheck(ans) \
@@ -168,22 +168,35 @@ __global__ void time_step(real_t *u_prv, real_t *u, real_t *u_nxt,
// Main time integration.
void simulate(void) {
// BEGIN: T7
// Go through each time step
dim3 blockDim(16, 16);
dim3 blockDim(BLOCKX, BLOCKY);
dim3 gridDim((N + blockDim.x - 1) / blockDim.x,
(M + blockDim.y - 1) / blockDim.y);
int_t boundary_threads = M > N ? M : N;
int_t boundary_blocks = (boundary_threads + 255) / 256;
int_t boundary_blocks = (boundary_threads + BLOCKX * BLOCKY - 1) / (BLOCKX * BLOCKY);
time_step<<<gridDim, blockDim>>>(buffers[0], buffers[1], buffers[2],
M, N, c, dt, dx, dy);
// Save initial state
size_t size = (M + 2) * (N + 2) * sizeof(real_t);
cudaMemcpy(h_buffer, buffers[1], size, cudaMemcpyDeviceToHost);
domain_save(0);
boundary_condition<<<boundary_blocks, 256>>>(buffers[2], M, N);
// Go through each time step
for (int_t iteration = 1; iteration <= max_iteration; iteration++) {
time_step<<<gridDim, blockDim>>>(buffers[0], buffers[1], buffers[2],
M, N, c, dt, dx, dy);
cudaDeviceSynchronize();
boundary_condition<<<boundary_blocks, BLOCKX * BLOCKY>>>(buffers[2], M, N);
move_buffer_window();
cudaDeviceSynchronize();
move_buffer_window();
// Save snapshots at specified frequency
if (iteration % snapshot_freq == 0) {
cudaMemcpy(h_buffer, buffers[1], size, cudaMemcpyDeviceToHost);
domain_save(iteration / snapshot_freq);
}
}
// END: T7
}
@@ -191,17 +204,21 @@ void simulate(void) {
// GPU occupancy
void occupancy(void) {
// BEGIN: T8
cudaDeviceProp prop;
cudaGetDeviceProperties(&prop, 0);
cudaDeviceProp p;
cudaGetDeviceProperties(&p, 0);
dim3 blockDim(BLOCKX, BLOCKY); // 256 threads per block
dim3 blockDim(BLOCKX, BLOCKY);
int threads_per_block = blockDim.x * blockDim.y;
// Calculate grid dimensions
dim3 gridDim((N + BLOCKX - 1) / BLOCKX, (N + BLOCKY - 1) / BLOCKY);
printf("Grid size set to: (%d, %d)\n", gridDim.x, gridDim.y);
printf("Launched blocks of size: (%d, %d)\n", BLOCKX, BLOCKY);
int warps_per_block = (threads_per_block + 31) / 32;
int max_warps_per_sm = prop.maxThreadsPerMultiProcessor / 32;
int max_blocks_per_sm = prop.maxThreadsPerMultiProcessor / threads_per_block;
int max_warps_per_sm = p.maxThreadsPerMultiProcessor / 32;
int max_blocks_per_sm = p.maxThreadsPerMultiProcessor / threads_per_block;
int active_warps = max_blocks_per_sm * warps_per_block;
real_t occupancy_ratio = (real_t)active_warps / (real_t)max_warps_per_sm;
@@ -209,11 +226,7 @@ void occupancy(void) {
if (occupancy_ratio > 1.0)
occupancy_ratio = 1.0;
printf("GPU Occupancy: %.2f%%\n", occupancy_ratio * 100.0);
printf("Active warps per SM: %d\n", active_warps);
printf("Maximum warps per SM: %d\n", max_warps_per_sm);
printf("Threads per block: %d\n", threads_per_block);
printf("Max blocks per SM: %d\n", max_blocks_per_sm);
printf("Theoretical occupancy: %.6f\n", occupancy_ratio);
// END: T8
}
@@ -235,13 +248,13 @@ static bool init_cuda() {
return false;
printf("CUDA device #0:\n");
printf(" Name: %s\n", p.name);
printf(" Compute capability: %d.%d\n", p.major, p.minor);
printf(" Multiprocessors: %d\n", p.multiProcessorCount);
printf(" Warp size: %d\n", p.warpSize);
printf(" Global memory: %.1fGiB bytes\n", p.totalGlobalMem / (1024.0 * 1024.0 * 1024.0));
printf(" Per-block shared memory: %.1fKiB\n", p.sharedMemPerBlock / 1024.0);
printf(" Per-block registers: %d\n", p.regsPerBlock);
printf(" Name: %s\n", p.name);
printf(" Compute capability: %d.%d\n", p.major, p.minor);
printf(" Multiprocessors: %d\n", p.multiProcessorCount);
printf(" Warp size: %d\n", p.warpSize);
printf(" Global memory: %.1fGiB bytes\n", p.totalGlobalMem / (1024.0 * 1024.0 * 1024.0));
printf(" Per-block shared memory: %.1fKiB\n", p.sharedMemPerBlock / 1024.0);
printf(" Per-block registers: %d\n", p.regsPerBlock);
}
return true;
// END: T2