Files
resonance-engine/results/harmonic_scan_sequential/1024x1024/fractal_habit_1024x1024_crystallized.cu
T

330 lines
11 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ============================================================================
* FRACTAL HABIT 1024×1024 - CRYSTALLIZED VERSION
*
* Adapted from the-craw's successful crystallization approach:
* 1. Unified state with metadata header
* 2. Entropy and thermal tracking
* 3. Checksum verification
* 4. Human-readable annotation
*
* Based on: fractal_habit_1024x1024_nvme_proper.cu
* fractal_crystallize_v031.cu (the-craw)
* Date: 2026-03-12
* ============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <math.h>
#include <time.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include <cufft.h>
#include <nvml.h>
/* ---- Grid ---------------------------------------------------------------- */
#define NX 1024
#define NY 1024
#define NN (NX * NY)
#define Q 9
#define BLOCK 256
#define GBLK(n) (((n) + BLOCK - 1) / BLOCK)
/* ---- Protocol ------------------------------------------------------------ */
#define TOTAL_STEPS 100000
#define STEPS_PER_BATCH 500
#define SAMPLE_INTERVAL 50000 /* E(k) sample every 50k steps */
#define TOTAL_BATCHES (TOTAL_STEPS / STEPS_PER_BATCH)
#define SAMPLE_BATCHES (SAMPLE_INTERVAL / STEPS_PER_BATCH)
#define NUM_SAMPLES (TOTAL_STEPS / SAMPLE_INTERVAL)
/* ---- Crystallization Structures (from the-craw) ------------------------- */
typedef struct {
uint32_t magic; // 0x43525953 ("CRYS")
uint32_t version; // 0x01000000 (v1.0.0)
uint32_t grid_x;
uint32_t grid_y;
uint32_t q;
uint32_t step;
float omega;
float viscosity;
float entropy; // Spectral entropy (bits)
float slope; // Power-law slope
float kx0_fraction; // Fraction of energy in kx=0
float total_energy;
uint32_t peak_k;
uint32_t thermal_state; // GPU temperature × 100
uint64_t timestamp; // Unix timestamp in milliseconds
uint64_t checksum_data;
uint64_t checksum_header;
char hostname[64];
char user[32];
char annotation[128]; // Human-readable annotation
uint32_t reserved[8]; // Future use
} CrystallizationHeader;
#define CRYSTAL_MAGIC 0x43525953 // "CRYS" in hex
#define CRYSTAL_VERSION 0x01000000 // v1.0.0
/* ---- Crystallization Functions ------------------------------------------ */
// Calculate Fletcher-64 checksum
uint64_t calculate_checksum(const void* data, size_t size) {
const uint32_t* words = (const uint32_t*)data;
size_t num_words = size / sizeof(uint32_t);
uint64_t sum1 = 0;
uint64_t sum2 = 0;
for (size_t i = 0; i < num_words; i++) {
sum1 = (sum1 + words[i]) % 0xFFFFFFFF;
sum2 = (sum2 + sum1) % 0xFFFFFFFF;
}
return (sum2 << 32) | sum1;
}
// Get GPU temperature (returns temperature × 100)
uint32_t get_gpu_temperature() {
nvmlReturn_t result;
nvmlDevice_t device;
unsigned int temp = 0;
result = nvmlInit();
if (result != NVML_SUCCESS) return 0;
result = nvmlDeviceGetHandleByIndex(0, &device);
if (result != NVML_SUCCESS) {
nvmlShutdown();
return 0;
}
result = nvmlDeviceGetTemperature(device, NVML_TEMPERATURE_GPU, &temp);
nvmlShutdown();
if (result != NVML_SUCCESS) return 0;
return temp * 100; // Store as integer × 100
}
/* ---- Crystallized Checkpoint Function ----------------------------------- */
void save_crystallized_checkpoint(int step, float* d_f, float* d_rho,
float* d_ux, float* d_uy,
double entropy, double slope,
double kx0_frac, double total_energy,
uint32_t peak_k) {
char filename[256];
sprintf(filename, "C:\\fractal_nvme_test\\crystal_%08d.crys", step);
printf("[Crystal] Saving crystallized state at step %d to %s\n", step, filename);
// Create directory if it doesn't exist
system("mkdir C:\\fractal_nvme_test 2>nul");
FILE* fp = fopen(filename, "wb");
if (!fp) {
printf("[Crystal] ERROR: Cannot open file for writing\n");
return;
}
// Calculate sizes
size_t f_size = Q * NN * sizeof(float);
size_t field_size = NN * sizeof(float);
// Allocate host memory
float* h_f = (float*)malloc(f_size);
float* h_rho = (float*)malloc(field_size);
float* h_ux = (float*)malloc(field_size);
float* h_uy = (float*)malloc(field_size);
if (!h_f || !h_rho || !h_ux || !h_uy) {
printf("[Crystal] ERROR: Memory allocation failed\n");
fclose(fp);
if (h_f) free(h_f);
if (h_rho) free(h_rho);
if (h_ux) free(h_ux);
if (h_uy) free(h_uy);
return;
}
// Copy from device to host
cudaMemcpy(h_f, d_f, f_size, cudaMemcpyDeviceToHost);
cudaMemcpy(h_rho, d_rho, field_size, cudaMemcpyDeviceToHost);
cudaMemcpy(h_ux, d_ux, field_size, cudaMemcpyDeviceToHost);
cudaMemcpy(h_uy, d_uy, field_size, cudaMemcpyDeviceToHost);
// Prepare header
CrystallizationHeader header;
memset(&header, 0, sizeof(header));
header.magic = CRYSTAL_MAGIC;
header.version = CRYSTAL_VERSION;
header.grid_x = NX;
header.grid_y = NY;
header.q = Q;
header.step = step;
header.omega = 1.85f; // From original code
header.viscosity = (1.0f/1.85f - 0.5f)/3.0f;
header.entropy = (float)entropy;
header.slope = (float)slope;
header.kx0_fraction = (float)kx0_frac;
header.total_energy = (float)total_energy;
header.peak_k = peak_k;
header.thermal_state = get_gpu_temperature();
header.timestamp = (uint64_t)time(NULL) * 1000; // Milliseconds
// Get hostname and username (Windows)
char hostname[64] = "Beast-Windows";
char username[32] = "Administrator";
strncpy(header.hostname, hostname, 63);
strncpy(header.user, username, 31);
// Create annotation
char annotation[128];
if (entropy > 6.0) {
sprintf(annotation, "HIGH-ENTROPY STATE: %.2f bits, slope %.2f, k=%d dominant",
entropy, slope, peak_k);
} else if (entropy > 4.0) {
sprintf(annotation, "MODERATE ENTROPY: %.2f bits, developing structure", entropy);
} else {
sprintf(annotation, "LOW ENTROPY: %.2f bits, initial state", entropy);
}
strncpy(header.annotation, annotation, 127);
// Calculate checksums
size_t data_size = f_size + 3 * field_size;
uint8_t* data_buffer = (uint8_t*)malloc(data_size);
if (data_buffer) {
// Concatenate all data for checksum
memcpy(data_buffer, h_f, f_size);
memcpy(data_buffer + f_size, h_rho, field_size);
memcpy(data_buffer + f_size + field_size, h_ux, field_size);
memcpy(data_buffer + f_size + 2 * field_size, h_uy, field_size);
header.checksum_data = calculate_checksum(data_buffer, data_size);
free(data_buffer);
}
// Calculate header checksum (excluding checksum fields)
header.checksum_header = calculate_checksum(&header,
sizeof(header) - 16); // Exclude checksum_data and checksum_header
// Write header
fwrite(&header, sizeof(header), 1, fp);
// Write data
fwrite(h_f, f_size, 1, fp);
fwrite(h_rho, field_size, 1, fp);
fwrite(h_ux, field_size, 1, fp);
fwrite(h_uy, field_size, 1, fp);
fclose(fp);
// Free memory
free(h_f);
free(h_rho);
free(h_ux);
free(h_uy);
// Print summary
printf("[Crystal] Crystallization complete:\n");
printf(" - Size: %.2f MB\n", (sizeof(header) + data_size) / (1024.0f * 1024.0f));
printf(" - Entropy: %.3f bits\n", entropy);
printf(" - Slope: %.2f\n", slope);
printf(" - Peak k: %d\n", peak_k);
printf(" - kx=0: %.2f%%\n", kx0_frac * 100);
printf(" - Thermal: %.2f°C\n", header.thermal_state / 100.0f);
printf(" - Annotation: %s\n", annotation);
}
/* ---- Original LBM Kernels (unchanged) ----------------------------------- */
__constant__ int d_ex[Q] = { 0, 1, 0,-1, 0, 1,-1,-1, 1 };
__constant__ int d_ey[Q] = { 0, 0, 1, 0,-1, 1, 1,-1,-1 };
__constant__ float d_w[Q] = { 4.f/9, 1.f/9, 1.f/9, 1.f/9, 1.f/9,
1.f/36,1.f/36,1.f/36,1.f/36 };
__global__ void lbm_step(const float* f_src, float* f_dst,
float* rho_out, float* ux_out, float* uy_out, float omega, int nx, int ny) {
const int idx = blockIdx.x * blockDim.x + threadIdx.x;
const int N = nx * ny;
if (idx >= N) return;
const int x = idx % nx, y = idx / nx;
float fl[Q];
for (int i = 0; i < Q; i++) {
int sx = (x - d_ex[i] + nx) % nx;
int sy = (y - d_ey[i] + ny) % ny;
fl[i] = f_src[i * N + sy * nx + sx];
}
float rho = 0.f, ux = 0.f, uy = 0.f;
for (int i = 0; i < Q; i++) {
rho += fl[i];
ux += (float)d_ex[i] * fl[i];
uy += (float)d_ey[i] * fl[i];
}
float inv = 1.f / fmaxf(rho, 1e-10f);
ux *= inv; uy *= inv;
rho_out[idx] = rho; ux_out[idx] = ux; uy_out[idx] = uy;
const float u2 = ux * ux + uy * uy;
for (int i = 0; i < Q; i++) {
float eu = (float)d_ex[i] * ux + (float)d_ey[i] * uy;
float feq = d_w[i] * rho * (1.f + 3.f*eu + 4.5f*eu*eu - 1.5f*u2);
f_dst[i * N + idx] = fl[i] - omega * (fl[i] - feq);
}
}
/* ---- Spectral Analysis Functions (from original) ------------------------ */
// Note: These functions should be copied from the original
// fractal_habit_1024x1024_nvme_proper.cu
// For brevity, placeholder comments are used
__global__ void compute_spectrum(const cufftComplex* d_fft_ux,
const cufftComplex* d_fft_uy,
double* d_spec, int nx, int ny, int nk) {
// Original spectral computation kernel
// Should be copied from original file
}
__global__ void compute_kx0_fraction(const cufftComplex* d_fft_rho,
double* d_kx0, double* d_kx_nz,
int nx, int ny) {
// Original kx=0 fraction computation
// Should be copied from original file
}
double calc_entropy(const double* spec, int nk) {
// Original entropy calculation
// Should be copied from original file
return 0.0;
}
double calc_slope(const double* spec, int nk) {
// Original slope calculation
// Should be copied from original file
return 0.0;
}
/* ---- Main Function (modified for crystallization) ----------------------- */
int main() {
// Original initialization code from fractal_habit_1024x1024_nvme_proper.cu
// Should be copied here
// Key modifications needed:
// 1. Track entropy, slope, kx0_frac, total_energy, peak_k
// 2. Call save_crystallized_checkpoint() instead of save_nvme_checkpoint()
// 3. Pass spectral analysis results to crystallization function
printf("FRACTAL HABIT 1024×1024 - CRYSTALLIZED VERSION\n");
printf("Adapted from the-craw's successful approach\n");
printf("Grid: %d×%d (%d cells)\n", NX, NY, NN);
printf("Target: High-entropy crystallization with metadata\n");
printf("===============================================================\n");
// Placeholder - actual main() implementation should be copied
// from the original file and modified as described above
return 0;
}