From f322b1c0898a56abfe75d2df1fb098653399b2b6 Mon Sep 17 00:00:00 2001 From: Fr0zka Date: Wed, 7 Oct 2026 08:03:00 +0200 Subject: [PATCH] wip(standalone): GPU step 14 -- warm-up 2.04 -> 1.05 s; cold path now waits on streaming, not shaders Per-kernel fences in the production viewer put 1.73-1.98 s on the near-detail Flush (shader creation 17-19 ms, dispatch calls ~0): skipping only that dispatch cut idle warm-up 1.893 -> 0.521 s. Near detail rewritten with a shared owner-roughness loop and shared Perlin samples: DXBC 448,588 -> 120,860 bytes, cold first use 1,596 -> 709 ms. Warm-up median 1.052 s, yet whole view is unchanged (CPU 1.352 s vs hybrid 3.196 s): after input export the hybrid spends 1.78-2.00 s streaming 1,082 GPU + 1,144 CPU-fallback tiles. Audits: 0 diffs near/far vs CPU and WARP, hashes, walk 5,642/5,642, survival. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ --- .../gpu_field_port/CompareStep14Captures.py | 59 ++++++++ .../gpu_field_port/GpuFarViewer.h | 2 +- .../gpu_field_port/GpuFieldPort.cpp | 127 +++++++++++++----- .../gpu_field_port/RunStep14CaptureMatrix.ps1 | 80 +++++++++++ .../gpu_field_port/RunStep14CpuReference.ps1 | 63 +++++++++ .../RunStep14FinalInterleaved.ps1 | 77 +++++++++++ .../gpu_field_port/RunStep14GpuSurvival.ps1 | 59 ++++++++ .../RunStep14ShaderFirstUse.ps1 | 67 +++++++++ .../gpu_field_port/RunStep14WarmupProfile.ps1 | 83 ++++++++++++ .../gpu_field_port/STEP14_REPORT.md | 80 +++++++++++ .../precompiled/ApplyNearFieldDetailCS.cso | Bin 448588 -> 120860 bytes .../step14_capture_comparison.md | 16 +++ .../gpu_first_port/VoxelForgeGpuMesher.hlsl | 93 ++++++++++++- Standalone/Source/StandaloneViewer.cpp | 6 +- 14 files changed, 774 insertions(+), 38 deletions(-) create mode 100644 Standalone/Research/OwnerShapeWorld/gpu_field_port/CompareStep14Captures.py create mode 100644 Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14CaptureMatrix.ps1 create mode 100644 Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14CpuReference.ps1 create mode 100644 Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14FinalInterleaved.ps1 create mode 100644 Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14GpuSurvival.ps1 create mode 100644 Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14ShaderFirstUse.ps1 create mode 100644 Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14WarmupProfile.ps1 create mode 100644 Standalone/Research/OwnerShapeWorld/gpu_field_port/STEP14_REPORT.md create mode 100644 Standalone/Research/OwnerShapeWorld/gpu_field_port/step14_capture_comparison.md diff --git a/Standalone/Research/OwnerShapeWorld/gpu_field_port/CompareStep14Captures.py b/Standalone/Research/OwnerShapeWorld/gpu_field_port/CompareStep14Captures.py new file mode 100644 index 0000000..8101ae3 --- /dev/null +++ b/Standalone/Research/OwnerShapeWorld/gpu_field_port/CompareStep14Captures.py @@ -0,0 +1,59 @@ +from pathlib import Path + +import numpy as np +from PIL import Image + + +ROOT = Path(__file__).resolve().parent +VIEWS = ( + "chamber", + "tunnel", + "passage", + "far", + "passage_floor_closeup", + "tunnel_bend", + "remote_yaw0", + "remote_yaw90", + "remote_yaw180", + "remote_yaw270", +) + +rows = [] +for view in VIEWS: + cpu_path = ROOT / f"step14_cpu_{view}.png" + gpu_path = ROOT / f"step14_gpu_{view}.png" + cpu = np.asarray(Image.open(cpu_path).convert("RGB"), dtype=np.int16) + gpu = np.asarray(Image.open(gpu_path).convert("RGB"), dtype=np.int16) + if cpu.shape != gpu.shape: + raise RuntimeError(f"dimension mismatch for {view}: {cpu.shape} vs {gpu.shape}") + diff = np.abs(cpu - gpu) + pixel_max = diff.max(axis=2) + rows.append( + ( + view, + f"{cpu.shape[1]}x{cpu.shape[0]}", + float(diff.mean()), + float(np.sqrt(np.square(diff, dtype=np.float64).mean())), + float(np.count_nonzero(pixel_max) * 100.0 / pixel_max.size), + float(np.count_nonzero(pixel_max > 32) * 100.0 / pixel_max.size), + int(pixel_max.max()), + ) + ) + +lines = [ + "# Step 14 full-residency capture comparison", + "", + "All ten CPU/GPU pairs were captured after `[InitialClipmapReady]`. The files were compared numerically as RGB arrays and were not opened in an image viewer.", + "", + "| View | Size | RGB MAE | RGB RMSE | Changed pixels | Pixels max channel >32 | Max channel |", + "|---|---:|---:|---:|---:|---:|---:|", +] +for row in rows: + view, size, mae, rmse, changed, over32, maximum = row + lines.append( + f"| {view} | {size} | {mae:.4f} | {rmse:.4f} | {changed:.4f}% | {over32:.4f}% | {maximum} |" + ) + +report = ROOT / "step14_capture_comparison.md" +report.write_text("\n".join(lines) + "\n", encoding="utf-8") +print(report.read_text(encoding="utf-8"), end="") diff --git a/Standalone/Research/OwnerShapeWorld/gpu_field_port/GpuFarViewer.h b/Standalone/Research/OwnerShapeWorld/gpu_field_port/GpuFarViewer.h index 9210b8d..3b52a79 100644 --- a/Standalone/Research/OwnerShapeWorld/gpu_field_port/GpuFarViewer.h +++ b/Standalone/Research/OwnerShapeWorld/gpu_field_port/GpuFarViewer.h @@ -26,7 +26,7 @@ namespace VoxelForgeGpuFarViewer const std::filesystem::path& shaderPath,std::string& error); bool QueueFarShaderWarmup(ID3D11Device* device,ID3D11DeviceContext* context, const std::filesystem::path& shaderPath,bool dispatchShaders, - const std::string& entryFilter,std::string& error); + const std::string& entryFilter,bool fenceEachKernel,std::string& error); bool CompleteFarShaderWarmup(ID3D11Device* device,ID3D11DeviceContext* context, const std::filesystem::path& shaderPath,std::string& error); bool ReserveFarOutputPool(ID3D11Device* device,ID3D11DeviceContext* context, diff --git a/Standalone/Research/OwnerShapeWorld/gpu_field_port/GpuFieldPort.cpp b/Standalone/Research/OwnerShapeWorld/gpu_field_port/GpuFieldPort.cpp index 6d0eb53..3bcb3b3 100644 --- a/Standalone/Research/OwnerShapeWorld/gpu_field_port/GpuFieldPort.cpp +++ b/Standalone/Research/OwnerShapeWorld/gpu_field_port/GpuFieldPort.cpp @@ -628,22 +628,27 @@ namespace std::chrono::duration(std::chrono::steady_clock::now()-PipelineStart).count()); } - void QueueTinyShaderWarmup(bool dispatchShaders,const std::string& entryFilter) + void QueueTinyShaderWarmup(bool dispatchShaders,const std::string& entryFilter, + bool fenceEachKernel) { const auto WarmupStart=Clock::now(); + const auto ResourceCreateStart=Clock::now(); static constexpr std::array entries={ "EvaluateFarFieldCS","EvaluateNearFieldCS","ClassifyCS","ClassifyFarCS","ScanGroupsCS","EmitCS", "ApplyNearFieldDetailCS", "EmitNearCS","BuildFarConnectorRingsCS","EmitFarConnectorPanelsCS", "ClassifyFarSkirtsCS","ScanFarSkirtsCS","EmitFarSkirtsCS","NoiseProbeCS"}; - if(!entryFilter.empty()&&std::find(entries.begin(),entries.end(),entryFilter)==entries.end()) + const bool skipEntryFilter=entryFilter.starts_with("skip:"); + const std::string_view filteredEntry=skipEntryFilter + ?std::string_view(entryFilter).substr(5):std::string_view(entryFilter); + if(!entryFilter.empty()&&std::find(entries.begin(),entries.end(),filteredEntry)==entries.end()) throw std::runtime_error("unknown shader warmup entry: "+entryFilter); constexpr std::uint32_t sampleCount=27,cellCount=1,groupCount=1; TileConstants tile{}; tile.cells=1;tile.sampleDim=3;tile.cellCount=cellCount;tile.groupCount=groupCount; - tile.stepVoxels=entryFilter=="EmitNearCS"?1:2; - tile.nearFieldMode=(entryFilter.empty()||entryFilter=="EvaluateNearFieldCS" - ||entryFilter=="ApplyNearFieldDetailCS"||entryFilter=="EmitNearCS")?1u:0u; + tile.stepVoxels=filteredEntry=="EmitNearCS"?1:2; + tile.nearFieldMode=(entryFilter.empty()||filteredEntry=="EvaluateNearFieldCS" + ||filteredEntry=="ApplyNearFieldDetailCS"||filteredEntry=="EmitNearCS")?1u:0u; tile.voxelSizeCm=25.0f;tile.outputVertexCapacity=3; FarFieldConstants field{}; field.strataLo=-100.0f;field.strataHi=100.0f;field.strataBlend=12.0f; @@ -763,6 +768,12 @@ namespace auto noiseInputSrv=Srv(noiseInputs.Get(),noiseInput.size()); auto noiseOutputUav=Uav(noiseOutputs.Get(),noiseInput.size()); + const double resourceCreateMs=std::chrono::duration( + Clock::now()-ResourceCreateStart).count(); + if(fenceEachKernel) + std::printf("[GpuShaderWarmupProfile] stage=warmup_resource_create duration_ms=%.3f\n", + resourceCreateMs); + if(!dispatchShaders) { std::printf("[GpuShaderWarmup] resources_only=true tiny_samples=%u tiny_cells=%u dispatches=0\n", @@ -780,121 +791,174 @@ namespace context->CSSetShaderResources(0,srvCount,nullSrvs); context->CSSetUnorderedAccessViews(0,8,nullUavs,nullptr); }; - auto Dispatch=[&](ID3D11ComputeShader* shader,const char* entry) + auto Dispatch=[&](ID3D11ComputeShader* shader,const char* entry, + Clock::time_point stateStart) { - if(!entryFilter.empty()&&entryFilter!=entry)return; - if(entryFilter.empty()&&(std::string_view(entry)=="ClassifyCS" + if(!entryFilter.empty()&&!skipEntryFilter&&filteredEntry!=entry)return; + if(skipEntryFilter&&filteredEntry==entry)return; + if((entryFilter.empty()||skipEntryFilter)&&(std::string_view(entry)=="ClassifyCS" ||std::string_view(entry)=="EmitNearCS"||std::string_view(entry)=="NoiseProbeCS"))return; const auto start=Clock::now(); context->CSSetShader(shader,nullptr,0);context->Dispatch(1,1,1); ++dispatchCount; - std::printf("[GpuShaderWarmup] entry=%s dispatch_call_ms=%.3f groups=1\n",entry, - std::chrono::duration(Clock::now()-start).count()); + const double stateMs=std::chrono::duration(start-stateStart).count(); + const double dispatchMs=std::chrono::duration(Clock::now()-start).count(); + if(fenceEachKernel) + { + D3D11_QUERY_DESC eventDesc{D3D11_QUERY_EVENT,0}; + ComPtr eventQuery; + const auto queryStart=Clock::now(); + Check(device->CreateQuery(&eventDesc,&eventQuery), + (std::string("CreateQuery(shader warmup ")+entry+")").c_str()); + const double queryCreateMs=std::chrono::duration( + Clock::now()-queryStart).count(); + context->End(eventQuery.Get()); + const auto flushStart=Clock::now(); + context->Flush(); + const double flushMs=std::chrono::duration( + Clock::now()-flushStart).count(); + const auto fenceStart=Clock::now(); + for(;;) + { + const HRESULT hr=immediateContext->GetData(eventQuery.Get(),nullptr,0, + D3D11_ASYNC_GETDATA_DONOTFLUSH); + if(hr==S_OK)break; + if(FAILED(hr))throw std::runtime_error( + std::string("GetData(shader warmup ")+entry+") failed"); + if(std::chrono::duration(Clock::now()-fenceStart).count()>10.0) + throw std::runtime_error(std::string("shader warmup fence timed out: ")+entry); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + const double fenceWaitMs=std::chrono::duration( + Clock::now()-fenceStart).count(); + std::printf("[GpuShaderWarmupProfile] entry=%s state_bind_ms=%.3f first_dispatch_ms=%.3f query_create_ms=%.3f flush_ms=%.3f fence_wait_ms=%.3f fence=complete\n", + entry,stateMs,dispatchMs,queryCreateMs,flushMs,fenceWaitMs); + } + else + std::printf("[GpuShaderWarmup] entry=%s dispatch_call_ms=%.3f groups=1\n",entry,dispatchMs); }; ID3D11ShaderResourceView* evalSrvs[21]{}; evalSrvs[10]=shapeSrv.Get();evalSrvs[11]=binSrv.Get();evalSrvs[12]=shapeIdSrv.Get(); evalSrvs[13]=protectedAirSrv.Get();evalSrvs[14]=protectedSolidSrv.Get(); evalSrvs[16]=detailSrv.Get();evalSrvs[17]=proxySrv.Get(); + auto stateStart=Clock::now(); context->CSSetShaderResources(0,20,evalSrvs); ID3D11UnorderedAccessView* evalUavs[8]{}; evalUavs[1]=nearDetailBaseUav.Get(); evalUavs[5]=nearNormalUav.Get();evalUavs[6]=evalCounterUav.Get();evalUavs[7]=densityUav.Get(); context->CSSetUnorderedAccessViews(0,8,evalUavs,nullptr); - Dispatch(fieldEval.Get(),"EvaluateFarFieldCS");ClearBindings(); - Dispatch(fieldEvalNear.Get(),"EvaluateNearFieldCS");ClearBindings(); + Dispatch(fieldEval.Get(),"EvaluateFarFieldCS",stateStart);ClearBindings(); + stateStart=Clock::now(); + Dispatch(fieldEvalNear.Get(),"EvaluateNearFieldCS",stateStart);ClearBindings(); ID3D11ShaderResourceView* nearDetailSrvs[21]{}; nearDetailSrvs[13]=protectedAirSrv.Get();nearDetailSrvs[14]=protectedSolidSrv.Get(); nearDetailSrvs[16]=detailSrv.Get();nearDetailSrvs[17]=proxySrv.Get(); nearDetailSrvs[20]=nearDetailBaseSrv.Get(); + stateStart=Clock::now(); context->CSSetShaderResources(0,21,nearDetailSrvs); ID3D11UnorderedAccessView* nearDetailUavs[8]{}; nearDetailUavs[5]=nearNormalUav.Get();nearDetailUavs[7]=densityUav.Get(); context->CSSetUnorderedAccessViews(0,8,nearDetailUavs,nullptr); - Dispatch(fieldEvalNearDetail.Get(),"ApplyNearFieldDetailCS");ClearBindings(); + Dispatch(fieldEvalNearDetail.Get(),"ApplyNearFieldDetailCS",stateStart);ClearBindings(); ID3D11ShaderResourceView* classifySrvs[16]{}; classifySrvs[0]=signSrv.Get();classifySrvs[1]=triangleSrv.Get(); + stateStart=Clock::now(); context->CSSetShaderResources(0,16,classifySrvs); ID3D11UnorderedAccessView* classifyUavs[8]{}; classifyUavs[0]=caseUav.Get();classifyUavs[1]=localOffsetUav.Get();classifyUavs[2]=groupCountUav.Get(); context->CSSetUnorderedAccessViews(0,8,classifyUavs,nullptr); - Dispatch(classify.Get(),"ClassifyCS");ClearBindings(16); + Dispatch(classify.Get(),"ClassifyCS",stateStart);ClearBindings(16); ID3D11ShaderResourceView* farClassifySrvs[16]{}; farClassifySrvs[1]=triangleSrv.Get();farClassifySrvs[15]=densitySrv.Get(); + stateStart=Clock::now(); context->CSSetShaderResources(0,16,farClassifySrvs); context->CSSetUnorderedAccessViews(0,8,classifyUavs,nullptr); - Dispatch(fieldClassify.Get(),"ClassifyFarCS");ClearBindings(16); + Dispatch(fieldClassify.Get(),"ClassifyFarCS",stateStart);ClearBindings(16); ID3D11ShaderResourceView* scanSrvs[9]{};scanSrvs[8]=groupCountSrv.Get(); + stateStart=Clock::now(); context->CSSetShaderResources(0,9,scanSrvs); ID3D11UnorderedAccessView* scanUavs[8]{};scanUavs[3]=groupOffsetUav.Get();scanUavs[4]=argsUav.Get(); context->CSSetUnorderedAccessViews(0,8,scanUavs,nullptr); - Dispatch(scan.Get(),"ScanGroupsCS");ClearBindings(9); + Dispatch(scan.Get(),"ScanGroupsCS",stateStart);ClearBindings(9); ID3D11ShaderResourceView* emitSrvs[20]{}; emitSrvs[1]=triangleSrv.Get();emitSrvs[2]=densitySrv.Get();emitSrvs[3]=caseSrv.Get(); emitSrvs[4]=localOffsetSrv.Get();emitSrvs[5]=groupOffsetSrv.Get(); emitSrvs[6]=midpointIdSrv.Get();emitSrvs[7]=midpointRecordSrv.Get(); + stateStart=Clock::now(); context->CSSetShaderResources(0,20,emitSrvs); ID3D11UnorderedAccessView* emitUavs[8]{};emitUavs[5]=vertexUav.Get();emitUavs[6]=indexUav.Get(); context->CSSetUnorderedAccessViews(0,8,emitUavs,nullptr); - Dispatch(emit.Get(),"EmitCS");ClearBindings(); - Dispatch(emitNear.Get(),"EmitNearCS");ClearBindings(); + Dispatch(emit.Get(),"EmitCS",stateStart);ClearBindings(); + stateStart=Clock::now(); + Dispatch(emitNear.Get(),"EmitNearCS",stateStart);ClearBindings(); ID3D11ShaderResourceView* ringSrvs[5]={connectorPanelSrv.Get(),nullptr,shapeSrv.Get(),binSrv.Get(),shapeIdSrv.Get()}; + stateStart=Clock::now(); context->CSSetShaderResources(8,5,ringSrvs); ID3D11UnorderedAccessView* ringUavs[8]{};ringUavs[4]=argsUav.Get();ringUavs[7]=connectorRingUav.Get(); context->CSSetUnorderedAccessViews(0,8,ringUavs,nullptr); - Dispatch(connectorRings.Get(),"BuildFarConnectorRingsCS");ClearBindings(); + Dispatch(connectorRings.Get(),"BuildFarConnectorRingsCS",stateStart);ClearBindings(); ID3D11ShaderResourceView* panelSrvs[2]={connectorPanelSrv.Get(),connectorRingSrv.Get()}; + stateStart=Clock::now(); context->CSSetShaderResources(8,2,panelSrvs); ID3D11UnorderedAccessView* panelUavs[8]{};panelUavs[5]=panelVertexUav.Get();panelUavs[6]=panelIndexUav.Get(); context->CSSetUnorderedAccessViews(0,8,panelUavs,nullptr); - Dispatch(connectorPanels.Get(),"EmitFarConnectorPanelsCS");ClearBindings(); + Dispatch(connectorPanels.Get(),"EmitFarConnectorPanelsCS",stateStart);ClearBindings(); ID3D11ShaderResourceView* skirtSrvs[22]{}; skirtSrvs[10]=shapeSrv.Get();skirtSrvs[11]=binSrv.Get();skirtSrvs[12]=shapeIdSrv.Get(); skirtSrvs[13]=protectedAirSrv.Get();skirtSrvs[14]=protectedSolidSrv.Get();skirtSrvs[19]=vertexSrv.Get(); skirtSrvs[21]=skirtProbeSrv.Get(); + stateStart=Clock::now(); context->CSSetShaderResources(0,22,skirtSrvs); ID3D11UnorderedAccessView* classifySkirtUavs[8]{}; classifySkirtUavs[0]=skirtScratchUav.Get();classifySkirtUavs[2]=skirtProbeUav.Get(); classifySkirtUavs[4]=argsUav.Get(); context->CSSetUnorderedAccessViews(0,8,classifySkirtUavs,nullptr); - Dispatch(classifyFarSkirts.Get(),"ClassifyFarSkirtsCS");ClearBindings(); + Dispatch(classifyFarSkirts.Get(),"ClassifyFarSkirtsCS",stateStart);ClearBindings(); ID3D11UnorderedAccessView* scanSkirtUavs[8]{}; + stateStart=Clock::now(); scanSkirtUavs[0]=skirtScratchUav.Get();scanSkirtUavs[4]=argsUav.Get(); context->CSSetUnorderedAccessViews(0,8,scanSkirtUavs,nullptr); - Dispatch(scanFarSkirts.Get(),"ScanFarSkirtsCS");ClearBindings(); + Dispatch(scanFarSkirts.Get(),"ScanFarSkirtsCS",stateStart);ClearBindings(); + stateStart=Clock::now(); context->CSSetShaderResources(0,22,skirtSrvs); ID3D11UnorderedAccessView* emitSkirtUavs[8]{}; emitSkirtUavs[0]=skirtScratchUav.Get();emitSkirtUavs[4]=argsUav.Get(); emitSkirtUavs[5]=panelVertexUav.Get();emitSkirtUavs[6]=panelIndexUav.Get(); context->CSSetUnorderedAccessViews(0,8,emitSkirtUavs,nullptr); - Dispatch(emitFarSkirts.Get(),"EmitFarSkirtsCS");ClearBindings(); + Dispatch(emitFarSkirts.Get(),"EmitFarSkirtsCS",stateStart);ClearBindings(); ID3D11ShaderResourceView* noiseSrvs[10]{};noiseSrvs[9]=noiseInputSrv.Get(); + stateStart=Clock::now(); context->CSSetShaderResources(0,10,noiseSrvs); ID3D11UnorderedAccessView* noiseUavs[8]{};noiseUavs[6]=noiseOutputUav.Get(); context->CSSetUnorderedAccessViews(0,8,noiseUavs,nullptr); - Dispatch(noiseProbe.Get(),"NoiseProbeCS");ClearBindings(10); + Dispatch(noiseProbe.Get(),"NoiseProbeCS",stateStart);ClearBindings(10); ID3D11Buffer* nullConstants[3]{};context->CSSetConstantBuffers(0,3,nullConstants); context->CSSetShader(nullptr,nullptr,0); - D3D11_QUERY_DESC eventDesc{D3D11_QUERY_EVENT,0}; - Check(device->CreateQuery(&eventDesc,&shaderWarmupCompletion),"CreateQuery(shader warmup completion)"); - context->End(shaderWarmupCompletion.Get());context->Flush(); + if(!fenceEachKernel) + { + D3D11_QUERY_DESC eventDesc{D3D11_QUERY_EVENT,0}; + Check(device->CreateQuery(&eventDesc,&shaderWarmupCompletion),"CreateQuery(shader warmup completion)"); + context->End(shaderWarmupCompletion.Get());context->Flush(); + } if(dispatchShaders&&dispatchCount==0) throw std::runtime_error("shader warmup selected no dispatches"); - std::printf("[GpuShaderWarmup] dispatched=%u selected=%s tiny_samples=%u tiny_cells=%u queue_ms=%.3f completion=pending\n", + std::printf("[GpuShaderWarmup] dispatched=%u selected=%s tiny_samples=%u tiny_cells=%u queue_ms=%.3f completion=%s\n", dispatchCount,entryFilter.empty()?"production":entryFilter.c_str(),sampleCount,cellCount, - std::chrono::duration(Clock::now()-WarmupStart).count()); + std::chrono::duration(Clock::now()-WarmupStart).count(), + fenceEachKernel?"per_kernel_fenced":"pending"); } bool CompleteTinyShaderWarmup() @@ -3219,11 +3283,12 @@ namespace VoxelForgeGpuFarViewer bool QueueFarShaderWarmup(ID3D11Device* device,ID3D11DeviceContext* context, const std::filesystem::path& shaderPath,bool dispatchShaders, - const std::string& entryFilter,std::string& error) + const std::string& entryFilter,bool fenceEachKernel,std::string& error) { try { - GetFarViewerRunner(device,context,shaderPath).QueueTinyShaderWarmup(dispatchShaders,entryFilter); + GetFarViewerRunner(device,context,shaderPath).QueueTinyShaderWarmup( + dispatchShaders,entryFilter,fenceEachKernel); return true; } catch(const std::exception& e){error=e.what();return false;} diff --git a/Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14CaptureMatrix.ps1 b/Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14CaptureMatrix.ps1 new file mode 100644 index 0000000..2a66bf5 --- /dev/null +++ b/Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14CaptureMatrix.ps1 @@ -0,0 +1,80 @@ +[CmdletBinding()] +param([string]$ExecutableName='VoxelForgeGpuFieldStep14Warmup.exe') + +$ErrorActionPreference='Stop' +$HostProcess=Get-Process -Id $PID +$HostProcess.PriorityClass='BelowNormal' +$HostProcess.ProcessorAffinity=[IntPtr]0xFF00 +$StandaloneRoot=[IO.Path]::GetFullPath((Join-Path $PSScriptRoot '..\..\..')) +$ExecutablePath=Join-Path $StandaloneRoot ('bin\'+$ExecutableName) +if([IO.Path]::GetFileName($ExecutableName)-ne$ExecutableName-or[IO.Path]::GetExtension($ExecutableName)-ne'.exe') +{throw 'ExecutableName must be an executable filename.'} +if(-not(Test-Path -LiteralPath $ExecutablePath -PathType Leaf)){throw "Viewer not found: $ExecutablePath"} +$Views=@( + @{Name='chamber';Camera='-11.75,-123.25,-19.85,0,0'}, + @{Name='tunnel';Camera='-11.75,-123.25,-19.85,90,0'}, + @{Name='passage';Camera='-39.19,6.27,-28.51,63,0'}, + @{Name='far';Camera='-11.61244,-118.2212,-19.8452,0,0'}, + @{Name='passage_floor_closeup';Camera='-39.19,6.27,-25.51,63,-25'}, + @{Name='tunnel_bend';Camera='-198.97,-99.57,-45.58,33.59,23.17'}, + @{Name='remote_yaw0';Camera='500,0,0,0,0'}, + @{Name='remote_yaw90';Camera='500,0,0,90,0'}, + @{Name='remote_yaw180';Camera='500,0,0,180,0'}, + @{Name='remote_yaw270';Camera='500,0,0,270,0'} +) +$EightGB=8L*1024L*1024L*1024L +foreach($View in $Views) +{ + foreach($Mode in @('cpu','gpu')) + { + $Stem="step14_${Mode}_$($View.Name)" + $CaptureName="$Stem.png" + $Arguments=@('--clip-radius=3','--workers=8','--quit-after-clipmap','--capture-after-clipmap', + "--camera=$($View.Camera)","--$Mode-far", + "--capture=Research/OwnerShapeWorld/gpu_field_port/$CaptureName") + $StdoutPath=Join-Path $PSScriptRoot ($Stem+'.stdout.log') + $StderrPath=Join-Path $PSScriptRoot ($Stem+'.stderr.log') + $CapturePath=Join-Path $PSScriptRoot $CaptureName + Write-Output "STEP14_CAPTURE mode=$Mode view=$($View.Name) affinity=0xFF00 command=`"$ExecutablePath`" $($Arguments -join ' ')" + for($Attempt=0;$Attempt-lt2;$Attempt++) + { + if($Attempt-gt0) + {Write-Output '0xC0000142 encountered; waiting 60 seconds before the single permitted retry.';Start-Sleep -Seconds 60} + Remove-Item -LiteralPath $StdoutPath,$StderrPath -Force -ErrorAction SilentlyContinue + $Child=Start-Process -FilePath $ExecutablePath -ArgumentList $Arguments -WorkingDirectory $StandaloneRoot ` + -WindowStyle Hidden -PassThru -RedirectStandardOutput $StdoutPath -RedirectStandardError $StderrPath + $PeakPrivate=0L;$OverMemoryLimit=$false + try + { + while(-not$Child.HasExited) + { + $Child.Refresh();if($Child.HasExited){break} + $Child.PriorityClass='BelowNormal';$Child.ProcessorAffinity=[IntPtr]0xFF00 + $PeakPrivate=[Math]::Max($PeakPrivate,$Child.PrivateMemorySize64) + if($PeakPrivate-ge$EightGB) + {$OverMemoryLimit=$true;$Child.Kill();$Child.WaitForExit();break} + Start-Sleep -Milliseconds 100 + } + } + finally + { + if(-not$Child.HasExited){$Child.Kill();$Child.WaitForExit()} + } + $Child.WaitForExit();$Child.Refresh();$ChildExitCode=[int]$Child.ExitCode + if($ChildExitCode-eq-1073741502-and$Attempt-eq0){continue} + if($ChildExitCode-eq-1073741502){throw '0xC0000142 repeated after its single permitted retry.'} + if($OverMemoryLimit){throw "Capture viewer stopped at the 8 GiB private-memory ceiling: $Stem"} + $LogText=Get-Content -LiteralPath $StdoutPath -Raw + if(-not$LogText.Contains('[InitialClipmapReady]')-or-not(Test-Path -LiteralPath $CapturePath -PathType Leaf)) + {throw "Full-residency capture missing: $Stem; exit=$ChildExitCode"} + $Memory=[regex]::Match($LogText,'(?m)^\[GpuFarMemory\] dxgi_local_sampled_peak_mb=([0-9.]+)') + $CombinedGB=$PeakPrivate/1GB + if($Memory.Success){$CombinedGB=($PeakPrivate+[double]$Memory.Groups[1].Value*1MB)/1GB} + if($CombinedGB-ge8.0){throw "Capture exceeded conservative private + DXGI-local 8 GiB ceiling: $Stem ($CombinedGB GiB)"} + $Ready=[regex]::Match($LogText,'(?m)^\[InitialClipmapReady\] ([0-9.]+) s') + Write-Output "STEP14_CAPTURE_DONE mode=$Mode view=$($View.Name) ready_s=$($Ready.Groups[1].Value) peak_private_gb=$([math]::Round($PeakPrivate/1GB,2)) conservative_private_plus_dxgi_gb=$([math]::Round($CombinedGB,2)) path=$CapturePath exit=$ChildExitCode" + if($ChildExitCode-ne0){throw "Capture viewer returned $ChildExitCode`: $Stem"} + break + } + } +} diff --git a/Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14CpuReference.ps1 b/Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14CpuReference.ps1 new file mode 100644 index 0000000..64fef33 --- /dev/null +++ b/Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14CpuReference.ps1 @@ -0,0 +1,63 @@ +[CmdletBinding()] +param([string]$ExecutableName='VoxelForgeGpuFieldStep14Warmup.exe') + +$ErrorActionPreference='Stop' +$HostProcess=Get-Process -Id $PID +$HostProcess.PriorityClass='BelowNormal' +$HostProcess.ProcessorAffinity=[IntPtr]0xFF00 +$StandaloneRoot=[IO.Path]::GetFullPath((Join-Path $PSScriptRoot '..\..\..')) +$ExecutablePath=Join-Path $StandaloneRoot ('bin\'+$ExecutableName) +if([IO.Path]::GetFileName($ExecutableName)-ne$ExecutableName-or[IO.Path]::GetExtension($ExecutableName)-ne'.exe') +{throw 'ExecutableName must be an executable filename.'} +if(-not(Test-Path -LiteralPath $ExecutablePath -PathType Leaf)){throw "Viewer not found: $ExecutablePath"} +$Reference=$null +foreach($Workers in @(1,8)) +{ + $Name="step14_cpu_reference_w$Workers" + $StdoutPath=Join-Path $PSScriptRoot ($Name+'.stdout.log') + $StderrPath=Join-Path $PSScriptRoot ($Name+'.stderr.log') + $Arguments=@('--stream-benchmark','--shape-world','--force-generate','--stream-hash', + '--clip-radius=3',"--workers=$Workers") + Write-Output "STEP14_CPU_REFERENCE workers=$Workers affinity=0xFF00 priority=BelowNormal command=`"$ExecutablePath`" $($Arguments -join ' ')" + for($Attempt=0;$Attempt-lt2;$Attempt++) + { + if($Attempt-gt0) + {Write-Output '0xC0000142 encountered; waiting 60 seconds before the single permitted retry.';Start-Sleep -Seconds 60} + Remove-Item -LiteralPath $StdoutPath,$StderrPath -Force -ErrorAction SilentlyContinue + $Child=Start-Process -FilePath $ExecutablePath -ArgumentList $Arguments -WorkingDirectory $StandaloneRoot ` + -WindowStyle Hidden -PassThru -RedirectStandardOutput $StdoutPath -RedirectStandardError $StderrPath + $PeakPrivate=0L;$OverMemoryLimit=$false + try + { + while(-not$Child.HasExited) + { + $Child.Refresh();if($Child.HasExited){break} + $Child.PriorityClass='BelowNormal';$Child.ProcessorAffinity=[IntPtr]0xFF00 + $PeakPrivate=[Math]::Max($PeakPrivate,$Child.PrivateMemorySize64) + if($Child.PrivateMemorySize64-ge(8L*1GB)) + {$OverMemoryLimit=$true;$Child.Kill();$Child.WaitForExit();break} + Start-Sleep -Milliseconds 100 + } + } + finally + { + if(-not$Child.HasExited){$Child.Kill();$Child.WaitForExit()} + } + $Child.WaitForExit();$Child.Refresh();$ChildExitCode=[int]$Child.ExitCode + if($ChildExitCode-eq-1073741502-and$Attempt-eq0){continue} + if($ChildExitCode-eq-1073741502){throw '0xC0000142 repeated after its single retry; stopping.'} + if($OverMemoryLimit){throw "CPU reference stopped at the 8 GiB private-memory ceiling: W$Workers"} + $LogText=Get-Content -LiteralPath $StdoutPath -Raw + $Stream=[regex]::Match($LogText,'(?m)^\[StreamFullClipmap\].*generated=2226/2226.*density_hash=(0x[0-9a-fA-F]+) mesh_hash=(0x[0-9a-fA-F]+) payload_hash=(0x[0-9a-fA-F]+) topology_hash=(0x[0-9a-fA-F]+)') + $Walkability=[regex]::Match($LogText,'(?m)^\[Walkability\] PASS 5642/5642') + if(-not$Stream.Success-or-not$Walkability.Success) + {throw "CPU reference failed full-generation/hash/walkability checks for W$Workers; exit=$ChildExitCode"} + $Hashes=@($Stream.Groups[1].Value.ToLowerInvariant(),$Stream.Groups[2].Value.ToLowerInvariant(), + $Stream.Groups[3].Value.ToLowerInvariant(),$Stream.Groups[4].Value.ToLowerInvariant()) + if($null-eq$Reference){$Reference=$Hashes} + elseif(($Reference-join'|')-ne($Hashes-join'|')){throw 'CPU hashes differ between W1 and W8.'} + Write-Output "STEP14_CPU_REFERENCE_RESULT workers=$Workers hashes=$($Hashes -join ',') walkability=5642/5642 peak_private_gb=$([math]::Round($PeakPrivate/1GB,2)) exit=$ChildExitCode" + if($ChildExitCode-ne0){throw "CPU reference returned $ChildExitCode`: W$Workers"} + break + } +} diff --git a/Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14FinalInterleaved.ps1 b/Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14FinalInterleaved.ps1 new file mode 100644 index 0000000..d4ba776 --- /dev/null +++ b/Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14FinalInterleaved.ps1 @@ -0,0 +1,77 @@ +[CmdletBinding()] +param([string]$ExecutableName='VoxelForgeGpuFieldStep14Warmup.exe') + +$ErrorActionPreference='Stop' +$HostProcess=Get-Process -Id $PID +$HostProcess.PriorityClass='BelowNormal' +$HostProcess.ProcessorAffinity=[IntPtr]0xFF00 +$StandaloneRoot=[IO.Path]::GetFullPath((Join-Path $PSScriptRoot '..\..\..')) +$ExecutablePath=Join-Path $StandaloneRoot ('bin\'+$ExecutableName) +if([IO.Path]::GetFileName($ExecutableName)-ne$ExecutableName-or[IO.Path]::GetExtension($ExecutableName)-ne'.exe') +{throw 'ExecutableName must be an executable filename.'} +if(-not(Test-Path -LiteralPath $ExecutablePath -PathType Leaf)){throw "Viewer not found: $ExecutablePath"} + +$Runs=@( + @{Mode='cpu';Name='step14_race_cpu_A'}, + @{Mode='gpu';Name='step14_race_gpu_A'}, + @{Mode='gpu';Name='step14_race_gpu_B'}, + @{Mode='cpu';Name='step14_race_cpu_B'} +) +$EightGB=8L*1024L*1024L*1024L +foreach($Run in $Runs) +{ + $Arguments=@('--clip-radius=3','--workers=8','--quit-after-clipmap',"--$($Run.Mode)-far") + if($Run.Mode-eq'gpu'){$Arguments+='--gpu-far-no-present-hold'} + $StdoutPath=Join-Path $PSScriptRoot ($Run.Name+'.stdout.log') + $StderrPath=Join-Path $PSScriptRoot ($Run.Name+'.stderr.log') + Write-Output "STEP14_RACE_RUN mode=$($Run.Mode) name=$($Run.Name) priority=BelowNormal affinity=0xFF00 workers=8 command=`"$ExecutablePath`" $($Arguments -join ' ')" + for($Attempt=0;$Attempt-lt2;$Attempt++) + { + if($Attempt-gt0) + {Write-Output '0xC0000142 encountered; waiting 60 seconds before the single permitted retry.';Start-Sleep -Seconds 60} + Remove-Item -LiteralPath $StdoutPath,$StderrPath -Force -ErrorAction SilentlyContinue + $HostRunClock=[Diagnostics.Stopwatch]::StartNew() + $Child=Start-Process -FilePath $ExecutablePath -ArgumentList $Arguments -WorkingDirectory $StandaloneRoot ` + -WindowStyle Hidden -PassThru -RedirectStandardOutput $StdoutPath -RedirectStandardError $StderrPath + $PeakPrivate=0L;$OverMemoryLimit=$false + try + { + while(-not$Child.HasExited) + { + $Child.Refresh();if($Child.HasExited){break} + $Child.PriorityClass='BelowNormal';$Child.ProcessorAffinity=[IntPtr]0xFF00 + $PeakPrivate=[Math]::Max($PeakPrivate,$Child.PrivateMemorySize64) + if($Child.PrivateMemorySize64-ge$EightGB) + {$OverMemoryLimit=$true;$Child.Kill();$Child.WaitForExit();break} + Start-Sleep -Milliseconds 50 + } + } + finally + { + if(-not$Child.HasExited){$Child.Kill();$Child.WaitForExit()} + } + $Child.WaitForExit();$Child.Refresh();$HostRunClock.Stop();$HostRunMs=$HostRunClock.Elapsed.TotalMilliseconds + $ViewerExitCode=[int]$Child.ExitCode + if($ViewerExitCode-eq-1073741502-and$Attempt-eq0){continue} + if($ViewerExitCode-eq-1073741502){throw '0xC0000142 repeated after its single retry; stopping.'} + if($OverMemoryLimit){throw "Viewer stopped at the 8 GiB private-memory ceiling: $($Run.Name)"} + $LogText=Get-Content -LiteralPath $StdoutPath -Raw + if(-not$LogText.Contains('[InitialClipmapReady]')) + {throw "Full clipmap was not ready in $($Run.Name); exit=$ViewerExitCode"} + $Ready=[regex]::Match($LogText,'(?m)^\[InitialClipmapReady\] ([0-9.]+) s') + $Presented=[regex]::Match($LogText,'(?m)^\[WholeViewPresented\] at_ms=([0-9.]+) present_ms=([0-9.]+).*hr=0x([0-9A-Fa-f]{8})') + if(-not$Presented.Success){throw "Whole-view present marker missing in $($Run.Name)"} + $Warmup=[regex]::Match($LogText,'(?m)^\[GpuShaderWarmup\] dispatched=[0-9]+ .*queue_ms=([0-9.]+)') + $Wait=[regex]::Match($LogText,'(?m)^\[GpuShaderWarmup\] completion_wait_ms=([0-9.]+)') + $WarmupMs=if($Warmup.Success){[double]$Warmup.Groups[1].Value+$(if($Wait.Success){[double]$Wait.Groups[1].Value}else{0.0})}else{0.0} + $Memory=[regex]::Match($LogText,'(?m)^\[GpuFarMemory\] dxgi_local_sampled_peak_mb=([0-9.]+)') + $CombinedGB=$PeakPrivate/1GB + if($Memory.Success){$CombinedGB=($PeakPrivate+[double]$Memory.Groups[1].Value*1MB)/1GB} + if($CombinedGB-ge8.0){throw "Viewer exceeded conservative private + DXGI-local 8 GiB ceiling: $($Run.Name) ($CombinedGB GiB)"} + Write-Output "STEP14_RACE_RESULT mode=$($Run.Mode) name=$($Run.Name) warmup_ms=$([math]::Round($WarmupMs,3)) ready_ms=$([math]::Round([double]$Ready.Groups[1].Value*1000,3)) viewer_whole_view_present_return_ms=$($Presented.Groups[1].Value) present_ms=$($Presented.Groups[2].Value) present_hr=0x$($Presented.Groups[3].Value.ToUpperInvariant()) host_process_exit_ms=$([math]::Round($HostRunMs,3)) peak_private_gb=$([math]::Round($PeakPrivate/1GB,2)) conservative_private_plus_dxgi_gb=$([math]::Round($CombinedGB,2)) exit=$ViewerExitCode" + $Controls=[regex]::Match($LogText,'(?m)^\[ProcessControls\].*') + if($Controls.Success){Write-Output $Controls.Value} + if($ViewerExitCode-ne0){throw "Viewer returned $ViewerExitCode`: $($Run.Name)"} + break + } +} diff --git a/Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14GpuSurvival.ps1 b/Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14GpuSurvival.ps1 new file mode 100644 index 0000000..6140ba7 --- /dev/null +++ b/Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14GpuSurvival.ps1 @@ -0,0 +1,59 @@ +[CmdletBinding()] +param([string]$ExecutableName='VoxelForgeGpuFieldStep14Warmup.exe') + +$ErrorActionPreference='Stop' +$HostProcess=Get-Process -Id $PID +$HostProcess.PriorityClass='BelowNormal' +$HostProcess.ProcessorAffinity=[IntPtr]0xFF00 +$StandaloneRoot=[IO.Path]::GetFullPath((Join-Path $PSScriptRoot '..\..\..')) +$ExecutablePath=Join-Path $StandaloneRoot ('bin\'+$ExecutableName) +if([IO.Path]::GetFileName($ExecutableName)-ne$ExecutableName-or[IO.Path]::GetExtension($ExecutableName)-ne'.exe') +{throw 'ExecutableName must be an executable filename.'} +if(-not(Test-Path -LiteralPath $ExecutablePath -PathType Leaf)){throw "Viewer not found: $ExecutablePath"} +$Arguments=@('--clip-radius=3','--workers=8','--quit-after-clipmap','--gpu-far-audit','--gpu-far-prewarm') +$Name='step14_gpu_survival' +$StdoutPath=Join-Path $PSScriptRoot ($Name+'.stdout.log') +$StderrPath=Join-Path $PSScriptRoot ($Name+'.stderr.log') +$EightGB=8L*1024L*1024L*1024L +Write-Output "STEP14_SURVIVAL_RUN command=`"$ExecutablePath`" $($Arguments -join ' ')" +for($Attempt=0;$Attempt-lt2;$Attempt++) +{ + if($Attempt-gt0) + {Write-Output '0xC0000142 encountered; waiting 60 seconds before the single permitted retry.';Start-Sleep -Seconds 60} + Remove-Item -LiteralPath $StdoutPath,$StderrPath -Force -ErrorAction SilentlyContinue + $Child=Start-Process -FilePath $ExecutablePath -ArgumentList $Arguments -WorkingDirectory $StandaloneRoot ` + -WindowStyle Hidden -PassThru -RedirectStandardOutput $StdoutPath -RedirectStandardError $StderrPath + $PeakPrivate=0L;$OverMemoryLimit=$false + try + { + while(-not$Child.HasExited) + { + $Child.Refresh();if($Child.HasExited){break} + $Child.PriorityClass='BelowNormal';$Child.ProcessorAffinity=[IntPtr]0xFF00 + $PeakPrivate=[Math]::Max($PeakPrivate,$Child.PrivateMemorySize64) + if($Child.PrivateMemorySize64-ge$EightGB) + {$OverMemoryLimit=$true;$Child.Kill();$Child.WaitForExit();break} + Start-Sleep -Milliseconds 100 + } + } + finally + { + if(-not$Child.HasExited){$Child.Kill();$Child.WaitForExit()} + } + $Child.WaitForExit();$Child.Refresh();$ChildExitCode=[int]$Child.ExitCode + if($ChildExitCode-eq-1073741502-and$Attempt-eq0){continue} + if($ChildExitCode-eq-1073741502){throw '0xC0000142 repeated after its single retry; stopping.'} + if($OverMemoryLimit){throw 'GPU survival audit stopped at the private-memory ceiling.'} + $LogText=Get-Content -LiteralPath $StdoutPath -Raw + if(-not$LogText.Contains('[InitialClipmapReady]')){throw "GPU survival audit did not reach full residency; exit=$ChildExitCode"} + $Audit=[regex]::Match($LogText,'(?m)^\[GpuFarSurvivalAudit\].*status=(PASS|FAIL)') + $Memory=[regex]::Match($LogText,'(?m)^\[GpuFarMemory\] dxgi_local_sampled_peak_mb=([0-9.]+)') + if(-not$Audit.Success){throw 'GPU survival audit result marker missing.'} + $DxgiMB=if($Memory.Success){[double]$Memory.Groups[1].Value}else{0.0} + $CombinedGB=($PeakPrivate+$DxgiMB*1MB)/1GB + if($CombinedGB-ge8.0){throw "GPU survival exceeded conservative private + DXGI-local 8 GiB ceiling: $CombinedGB GiB"} + Write-Output "STEP14_SURVIVAL_RESULT audit=$($Audit.Groups[1].Value) peak_private_gb=$([math]::Round($PeakPrivate/1GB,2)) dxgi_local_peak_mb=$DxgiMB conservative_private_plus_dxgi_gb=$([math]::Round($CombinedGB,2)) exit=$ChildExitCode stdout=$StdoutPath stderr=$StderrPath" + if($Audit.Groups[1].Value-ne'PASS'){throw 'GPU survival audit failed.'} + if($ChildExitCode-ne0){throw "Viewer returned $ChildExitCode"} + break +} diff --git a/Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14ShaderFirstUse.ps1 b/Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14ShaderFirstUse.ps1 new file mode 100644 index 0000000..0381429 --- /dev/null +++ b/Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14ShaderFirstUse.ps1 @@ -0,0 +1,67 @@ +[CmdletBinding()] +param( + [string]$ExecutableName='VoxelForgeGpuFieldStep14Warmup.exe', + [string]$Entry='ApplyNearFieldDetailCS', + [string]$SampleName='near_detail' +) + +$ErrorActionPreference='Stop' +$HostProcess=Get-Process -Id $PID +$HostProcess.PriorityClass='BelowNormal' +$HostProcess.ProcessorAffinity=[IntPtr]0xFF00 +$StandaloneRoot=[IO.Path]::GetFullPath((Join-Path $PSScriptRoot '..\..\..')) +$ExecutablePath=Join-Path $StandaloneRoot ('bin\'+$ExecutableName) +if([IO.Path]::GetFileName($ExecutableName)-ne$ExecutableName-or[IO.Path]::GetExtension($ExecutableName)-ne'.exe') +{throw 'ExecutableName must be an executable filename.'} +if(-not(Test-Path -LiteralPath $ExecutablePath -PathType Leaf)){throw "Viewer not found: $ExecutablePath"} +if($Entry-ne'ApplyNearFieldDetailCS'){throw "Unsupported Step 14 shader entry: $Entry"} +$Name='step14_shader_'+$SampleName +$StdoutPath=Join-Path $PSScriptRoot ($Name+'.stdout.log') +$StderrPath=Join-Path $PSScriptRoot ($Name+'.stderr.log') +$Arguments=@('--workers=8','--gpu-far-warmup-only',"--gpu-far-warmup-entry=$Entry",'--gpu-far-warmup-kernel-fences') +$EightGB=8L*1024L*1024L*1024L +Write-Output "STEP14_SHADER_RUN entry=$Entry sample=$SampleName freshness=fresh_process priority=BelowNormal affinity=0xFF00 command=`"$ExecutablePath`" $($Arguments -join ' ')" +for($Attempt=0;$Attempt-lt2;$Attempt++) +{ + if($Attempt-gt0) + {Write-Output '0xC0000142 encountered; waiting 60 seconds before the single permitted retry.';Start-Sleep -Seconds 60} + Remove-Item -LiteralPath $StdoutPath,$StderrPath -Force -ErrorAction SilentlyContinue + $HostRunClock=[Diagnostics.Stopwatch]::StartNew() + $Child=Start-Process -FilePath $ExecutablePath -ArgumentList $Arguments -WorkingDirectory $StandaloneRoot ` + -WindowStyle Hidden -PassThru -RedirectStandardOutput $StdoutPath -RedirectStandardError $StderrPath + $PeakPrivate=0L;$OverMemoryLimit=$false + try + { + while(-not$Child.HasExited) + { + $Child.Refresh();if($Child.HasExited){break} + $Child.PriorityClass='BelowNormal';$Child.ProcessorAffinity=[IntPtr]0xFF00 + $PeakPrivate=[Math]::Max($PeakPrivate,$Child.PrivateMemorySize64) + if($Child.PrivateMemorySize64-ge$EightGB) + {$OverMemoryLimit=$true;$Child.Kill();$Child.WaitForExit();break} + Start-Sleep -Milliseconds 50 + } + } + finally + { + if(-not$Child.HasExited){$Child.Kill();$Child.WaitForExit()} + } + $Child.WaitForExit();$Child.Refresh();$HostRunClock.Stop() + $ViewerExitCode=[int]$Child.ExitCode + if($ViewerExitCode-eq-1073741502-and$Attempt-eq0){continue} + if($ViewerExitCode-eq-1073741502){throw '0xC0000142 repeated after its single retry; stopping.'} + if($OverMemoryLimit){throw "Shader profile stopped at the 8 GiB private-memory ceiling: $SampleName"} + $LogText=Get-Content -LiteralPath $StdoutPath -Raw + $Create=[regex]::Match($LogText,'(?m)^\[GpuPipelineProfile\] stage=shader_object_create entry='+[regex]::Escape($Entry)+' duration_ms=([0-9.]+)') + $Profile=[regex]::Match($LogText,'(?m)^\[GpuShaderWarmupProfile\] entry='+[regex]::Escape($Entry)+' .*') + $Warmup=[regex]::Match($LogText,'(?m)^\[GpuShaderWarmup\] dispatched=1 selected='+[regex]::Escape($Entry)+'.*queue_ms=([0-9.]+)') + $Memory=[regex]::Match($LogText,'(?m)^\[GpuFarMemory\] dxgi_local_sampled_peak_mb=([0-9.]+)') + if(-not$Create.Success-or-not$Profile.Success-or-not$Warmup.Success) + {throw "Isolated profile markers missing for $Entry; exit=$ViewerExitCode"} + $CombinedGB=$PeakPrivate/1GB + if($Memory.Success){$CombinedGB=($PeakPrivate+[double]$Memory.Groups[1].Value*1MB)/1GB} + if($CombinedGB-ge8.0){throw "Shader profile exceeded private + DXGI-local 8 GiB ceiling: $SampleName ($CombinedGB GiB)"} + Write-Output "STEP14_SHADER_RESULT entry=$Entry sample=$SampleName object_create_ms=$($Create.Groups[1].Value) profile_ms=$($Profile.Groups[0].Value) isolated_queue_ms=$($Warmup.Groups[1].Value) host_process_exit_ms=$([math]::Round($HostRunClock.Elapsed.TotalMilliseconds,3)) peak_private_gb=$([math]::Round($PeakPrivate/1GB,2)) conservative_private_plus_dxgi_gb=$([math]::Round($CombinedGB,2)) exit=$ViewerExitCode" + if($ViewerExitCode-ne0){throw "Viewer returned $ViewerExitCode for $SampleName"} + break +} diff --git a/Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14WarmupProfile.ps1 b/Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14WarmupProfile.ps1 new file mode 100644 index 0000000..1c74ba2 --- /dev/null +++ b/Standalone/Research/OwnerShapeWorld/gpu_field_port/RunStep14WarmupProfile.ps1 @@ -0,0 +1,83 @@ +[CmdletBinding()] +param([string]$ExecutableName='VoxelForgeGpuFieldStep14Warmup.exe',[switch]$SkipControlOnly,[string]$Label='profile') + +$ErrorActionPreference='Stop' +$HostProcess=Get-Process -Id $PID +$HostProcess.PriorityClass='BelowNormal' +$HostProcess.ProcessorAffinity=[IntPtr]0xFF00 +$StandaloneRoot=[IO.Path]::GetFullPath((Join-Path $PSScriptRoot '..\..\..')) +$ExecutablePath=Join-Path $StandaloneRoot ('bin\'+$ExecutableName) +if([IO.Path]::GetFileName($ExecutableName)-ne$ExecutableName-or[IO.Path]::GetExtension($ExecutableName)-ne'.exe') +{throw 'ExecutableName must be an executable filename.'} +if(-not(Test-Path -LiteralPath $ExecutablePath -PathType Leaf)){throw "Viewer not found: $ExecutablePath"} + +$Runs=@( + @{Name="step14_${Label}_workers_active";Idle=$false;WarmupOnly=$false}, + @{Name="step14_${Label}_workers_idle";Idle=$true;WarmupOnly=$false}, + @{Name="step14_${Label}_skip_near_detail";Idle=$true;WarmupOnly=$true} +) +if($SkipControlOnly){$Runs=@($Runs[2])} +$EightGB=8L*1024L*1024L*1024L +foreach($Run in $Runs) +{ + if($Run.WarmupOnly) + {$Arguments=@('--workers=8','--gpu-far-warmup-only','--gpu-far-warmup-kernel-fences', + '--gpu-far-warmup-entry=skip:ApplyNearFieldDetailCS')} + else + { + $Arguments=@('--clip-radius=3','--workers=8','--quit-after-clipmap','--gpu-far', + '--gpu-far-warmup-kernel-fences') + if($Run.Idle){$Arguments+='--gpu-far-warmup-before-workers'} + } + $StdoutPath=Join-Path $PSScriptRoot ($Run.Name+'.stdout.log') + $StderrPath=Join-Path $PSScriptRoot ($Run.Name+'.stderr.log') + Write-Output "STEP14_PROFILE_RUN name=$($Run.Name) cpu_workers_idle=$($Run.Idle.ToString().ToLowerInvariant()) priority=BelowNormal affinity=0xFF00 command=`"$ExecutablePath`" $($Arguments -join ' ')" + for($Attempt=0;$Attempt-lt2;$Attempt++) + { + if($Attempt-gt0) + {Write-Output '0xC0000142 encountered; waiting 60 seconds before the single permitted retry.';Start-Sleep -Seconds 60} + Remove-Item -LiteralPath $StdoutPath,$StderrPath -Force -ErrorAction SilentlyContinue + $HostRunClock=[Diagnostics.Stopwatch]::StartNew() + $Child=Start-Process -FilePath $ExecutablePath -ArgumentList $Arguments -WorkingDirectory $StandaloneRoot ` + -WindowStyle Hidden -PassThru -RedirectStandardOutput $StdoutPath -RedirectStandardError $StderrPath + $PeakPrivate=0L;$OverMemoryLimit=$false + try + { + while(-not$Child.HasExited) + { + $Child.Refresh();if($Child.HasExited){break} + $Child.PriorityClass='BelowNormal';$Child.ProcessorAffinity=[IntPtr]0xFF00 + $PeakPrivate=[Math]::Max($PeakPrivate,$Child.PrivateMemorySize64) + if($Child.PrivateMemorySize64-ge$EightGB) + {$OverMemoryLimit=$true;$Child.Kill();$Child.WaitForExit();break} + Start-Sleep -Milliseconds 50 + } + } + finally + { + if(-not$Child.HasExited){$Child.Kill();$Child.WaitForExit()} + } + $Child.WaitForExit();$Child.Refresh();$HostRunClock.Stop() + $ViewerExitCode=[int]$Child.ExitCode + if($ViewerExitCode-eq-1073741502-and$Attempt-eq0){continue} + if($ViewerExitCode-eq-1073741502){throw '0xC0000142 repeated after its single retry; stopping.'} + if($OverMemoryLimit){throw "Profile process stopped at the 8 GiB private-memory ceiling: $($Run.Name)"} + $LogText=Get-Content -LiteralPath $StdoutPath -Raw + if(-not$Run.WarmupOnly-and-not$LogText.Contains('[InitialClipmapReady]')) + {throw "Full clipmap did not become ready in $($Run.Name); exit=$ViewerExitCode"} + if(-not$LogText.Contains('[GpuShaderWarmupProfile] stage=warmup_resource_create')) + {throw "Warmup profile markers are missing in $($Run.Name); exit=$ViewerExitCode"} + $Warmup=[regex]::Match($LogText,'(?m)^\[GpuShaderWarmup\] dispatched=[0-9]+ .*queue_ms=([0-9.]+) completion=per_kernel_fenced') + $Ready=[regex]::Match($LogText,'(?m)^\[InitialClipmapReady\] ([0-9.]+) s') + $Memory=[regex]::Match($LogText,'(?m)^\[GpuFarMemory\] dxgi_local_sampled_peak_mb=([0-9.]+)') + if(-not$Warmup.Success-or(-not$Run.WarmupOnly-and-not$Ready.Success)) + {throw "Warmup or ready timing missing in $($Run.Name)"} + $CombinedGB=$PeakPrivate/1GB + if($Memory.Success){$CombinedGB=($PeakPrivate+[double]$Memory.Groups[1].Value*1MB)/1GB} + if($CombinedGB-ge8.0){throw "Warmup profile exceeded private + DXGI-local 8 GiB ceiling: $($Run.Name) ($CombinedGB GiB)"} + $ReadyMs=if($Ready.Success){[math]::Round([double]$Ready.Groups[1].Value*1000,3)}else{'not_applicable'} + Write-Output "STEP14_PROFILE_RESULT name=$($Run.Name) cpu_workers_idle=$($Run.Idle.ToString().ToLowerInvariant()) warmup_ms=$($Warmup.Groups[1].Value) ready_ms=$ReadyMs host_process_exit_ms=$([math]::Round($HostRunClock.Elapsed.TotalMilliseconds,3)) peak_private_gb=$([math]::Round($PeakPrivate/1GB,2)) conservative_private_plus_dxgi_gb=$([math]::Round($CombinedGB,2)) exit=$ViewerExitCode" + if($ViewerExitCode-ne0){throw "Viewer returned $ViewerExitCode`: $($Run.Name)"} + break + } +} diff --git a/Standalone/Research/OwnerShapeWorld/gpu_field_port/STEP14_REPORT.md b/Standalone/Research/OwnerShapeWorld/gpu_field_port/STEP14_REPORT.md new file mode 100644 index 0000000..71f4d12 --- /dev/null +++ b/Standalone/Research/OwnerShapeWorld/gpu_field_port/STEP14_REPORT.md @@ -0,0 +1,80 @@ +# GPU port, step 14: warm-up attribution and near-detail compile cost + +Date: 2026-10-07. All edits and generated artifacts are under `Standalone\`. MSVC builds used `/MP8`; viewer and probe processes ran hidden at BelowNormal priority and affinity `0xFF00`. No `0xC0000142` retry was needed, maximum conservative private plus DXGI-local memory was 5.44 GiB, and no cache or driver settings were changed. No viewer remained open, and no full-size capture was opened in an image viewer. No commit, push, or stash was made. + +## Result + +The production warm-up was not the sum of isolated shader first-use times. In the production queue, `ApplyNearFieldDetailCS` accounts for most of the first-use stall, and its driver submission cost is paid on the immediate-context `Flush`. Creating its shader object, making warm-up resources, binding state, dispatching, and waiting on the final event are all small by comparison. A control that creates every shader object and warm-up resource but skips only the near-detail dispatch cuts the warm-up substantially; the connector-ring dispatch then becomes the next visible first-use stall. + +The near-detail HLSL now shares the anchored/direct owner-roughness loop body and evaluates standard/ridged fractal outputs from the same Perlin samples. The Step 13 `ApplyNearFieldDetailCS` bytecode was 448,588 bytes; the Step 14 bytecode is 120,860 bytes, a 73.1% reduction. Its isolated first-use queue fell from 1,595.548 ms to 709.471 ms, a 55.5% reduction. + +Production warm-up fell from the Step 13 median of 2,041.698 ms to 1,052.313 ms. Whole-view readiness did not improve with it: the Step 14 interleaved race measured 1.352 s CPU versus 3.196 s hybrid. Most shader warm-up overlaps CPU shape compilation; the remaining hybrid floor is the tile stream after warm-up. + +## Warm-up attribution + +The viewer now has an opt-in `--gpu-far-warmup-kernel-fences` profile. It records pipeline shader-object creation, warm-up resource creation, resource/state binding, each first dispatch, event-query creation, `Flush`, and completion fence, in production dispatch order. The normal production queue remains batched and uses one final event. `--gpu-far-warmup-before-workers` runs the same path before CPU generation workers start. + +Baseline Step 13 shader, per-kernel fenced: + +| Stage | CPU workers active | CPU workers idle | +|---|---:|---:| +| Shader pipeline creation, all entries | 52.733 ms | 61.128 ms | +| `ApplyNearFieldDetailCS` shader-object creation | 16.586 ms | 18.803 ms | +| Warm-up resource creation | 2.356 ms | 2.395 ms | +| Near-detail state binding | 0.005 ms | 0.006 ms | +| Near-detail dispatch call | 0.002 ms | 0.003 ms | +| Near-detail `Flush` | **1,980.816 ms** | **1,734.219 ms** | +| Near-detail completion fence | 7.101 ms | 8.804 ms | +| Entire fenced warm-up | 2,139.680 ms | 1,892.968 ms | + +The skip control used the same shader-object creation and resources, then fenced all production entries except `ApplyNearFieldDetailCS`. Its idle-worker queue was 520.764 ms; `BuildFarConnectorRingsCS` took 363.553 ms in `Flush`. With near detail dispatched first, that ring `Flush` was under 0.4 ms in both baseline profiles. This demonstrates why adding isolated cold costs overcounts production: the entries share driver-side first-use work. The near-detail dispatch accounts for the majority of the warm-up, while the connector ring is the secondary cold entry. + +The final Step 14 per-kernel profile measured near-detail `Flush` at 964.597 ms with workers active and 667.969 ms with workers idle. The corresponding complete fenced queues were 1,138.410 ms and 837.211 ms. The final skip-near-detail control was 535.680 ms, with a 382.239 ms connector-ring `Flush`. + +The evidence identifies first-use driver work on the shader submission path: direct dispatch calls remain about 0.002–0.006 ms, object creation is milliseconds, resource creation is about 2 ms, and the long delay lands in `Flush`; the skip control removes that dispatch while leaving object creation intact. The D3D11 API does not expose a driver compiler timer, so the exact internal AMD operation cannot be separated from other driver translation/validation work. The measured behavior is consistent with synchronous first-use shader translation/compilation at `Flush`, serialized by the per-entry control. + +## Near-detail restructuring + +- Kept the generic looped value-noise routine introduced in Step 13. +- Replaced separate anchored (step 8) and direct (step 2) owner-roughness call paths with a `[loop]` over those two sample modes. The direct sample is still skipped when passage influence is at or below 0.40. +- Added `NearOwnerFractalPair`, which computes the standard and ridged accumulators from one Perlin sample per octave. The owner noise type selects the same prior output, including the averaged type. +- `ApplyNearFieldDetailCS` does not call `NearFieldDensityAt` or the root-refinement helper, so root refinement was not part of this kernel and was not removed. + +The isolated shader profile after both changes reported object creation 5.831 ms, state binding 0.001 ms, dispatch 0.003 ms, `Flush` 689.707 ms, event wait 16.272 ms, and queue 709.471 ms. The event wait includes the profiling loop's 1 ms polling interval; it is not a GPU execution-time estimate. + +## Correctness, survival, and captures + +- Whole near audit: **960/960 tiles**, zero hardware topology differences, zero WARP topology differences, zero differences across **229,376 protected cells**, and bit-identical repeated GPU output. +- Whole far audit: **1,114** eligible tiles, 152 near-transition tiles skipped, zero hardware and WARP topology differences, zero differences across **127,401 protected cells** and **353 thin-feature cells**, and bit-identical repeated GPU output. +- CPU reference at 1 and 8 workers: identical density `0xdb2991c73215af4c`, mesh `0x8236c5edd7fc8e4f`, payload `0x4c48fa75a543d58e`, topology `0xbea22e76b34a4dfc`; walkability **5,642/5,642**. +- Full-residency GPU survival audit passed at **5.08 GiB** conservative private plus DXGI-local memory. +- All ten 1280×800 CPU/GPU capture pairs reached full residency. Numeric RGB results exactly match the Step 13 comparison: MAE range **0.0484–1.6092**; the highest combined private plus DXGI-local sample was **5.44 GiB**. See [step14_capture_comparison.md](step14_capture_comparison.md). The PNGs were compared as arrays and not viewed. + +## Interleaved whole-view race + +Order was CPU A, GPU A, GPU B, CPU B. All runs used 8 workers. The GPU warm-up numbers below are the normal batched production path without per-kernel fences. + +| Run | Warm-up | Viewer ready / present return | Host process exit | +|---|---:|---:|---:| +| CPU A | — | 1,353 ms | 1,522.097 ms | +| GPU A | 1,048.305 ms | 3,084 ms | 3,235.229 ms | +| GPU B | 1,056.321 ms | 3,308 ms | 3,466.244 ms | +| CPU B | — | 1,350 ms | 1,471.182 ms | + +Median viewer readiness was **1.352 s CPU vs 3.196 s hybrid**: CPU leads by **1.845 s / 2.36×**. Median host-clock process exit was **1.497 s CPU vs 3.351 s hybrid**: CPU leads by **1.854 s / 2.24×**. Median warm-up was **1.052 s**, about 0.989 s below Step 13. `Present` returned `DXGI_STATUS_OCCLUDED`, so these clocks measure readiness and API return, not physical scanout. + +The warm-up overlaps shape compilation: GPU shape compilation took 835–903 ms while a 1.048–1.056 s warm-up ran. After GPU input export completed at 1.302–1.306 s, whole-view readiness took another 1.778–2.003 s. Those runs queued 1,082 GPU tiles in 35 batches and kept 1,144 CPU fallback tiles; CPU input preparation was 112–119 ms wall time and measured GPU dispatch timestamps summed to 200–216 ms. The current floor is therefore the post-warm-up hybrid tile stream and CPU fallback/submission path, not near-detail compilation alone. The GPU path still loses the whole-view race. + +## Lower-priority coverage case + +The direct-GPU `(6,2,0,lod3)` coverage issue remains open. The viewer's established CPU fallback for remote LOD3/4 remains enabled; this step's whole-far audit skips near transitions and does not claim direct LOD3/4 coverage parity. The prior diagnostic and capture evidence remains in [STEP9_REPORT.md](STEP9_REPORT.md). + +## Reproduction artifacts + +- Warm-up controls: [RunStep14WarmupProfile.ps1](RunStep14WarmupProfile.ps1) and `step14_profile_*` / `step14_final_*` logs. +- Near shader compile and first-use: [CompileStep14Shader.ps1](CompileStep14Shader.ps1), [RunStep14ShaderFirstUse.ps1](RunStep14ShaderFirstUse.ps1), and the `step14_shader_*.stdout.log` files. +- Agreement: `step14_whole_near_agreement.stdout.log`, `step14_whole_far_agreement.stdout.log`. +- CPU reference: [RunStep14CpuReference.ps1](RunStep14CpuReference.ps1) and `step14_cpu_reference_w*.stdout.log`. +- Survival: [RunStep14GpuSurvival.ps1](RunStep14GpuSurvival.ps1) and `step14_gpu_survival.stdout.log`. +- Captures: [RunStep14CaptureMatrix.ps1](RunStep14CaptureMatrix.ps1), [CompareStep14Captures.py](CompareStep14Captures.py), and `step14_capture_comparison.md`. +- Race: [RunStep14FinalInterleaved.ps1](RunStep14FinalInterleaved.ps1) and `step14_race_*.stdout.log`. diff --git a/Standalone/Research/OwnerShapeWorld/gpu_field_port/precompiled/ApplyNearFieldDetailCS.cso b/Standalone/Research/OwnerShapeWorld/gpu_field_port/precompiled/ApplyNearFieldDetailCS.cso index 14abb089d6e157c9f901ac0ea70db9bb10760fb2..f79aa298b24084cd8788424b1f5b2afb3e3cfc59 100644 GIT binary patch literal 120860 zcmeFaf2=0gdEYm8R=a!m6-82Vs!*2_Gvcai`ch7olCr$Mvc*}F+9A@63DeeMN~Rq<8V|nK{qz?|IITIWzCvhd=V*Lx1bcFZ^Gh ze)o;n{txGV`&&QtZ=U(^M$0^@0AMR`kwje=5*_%jozP{lj0YPT&7&f_^;E|2d2k zAIbk86Liri&t1Cy$n~o?_MW)0_vG2j*GK1%UcGYpNopS6yK(9AmG@tIZtwcjoPTi7 zq%J-2(|b>v?6c3Q%Gn;g^z`0eeCpaWH&p$>tJgnq>B_@`Qx7f5&26PdiiJTYYCGANXls>VNySV}9C|`v2AHJ1hCXPkU1TcPs&;UD}cQ->vFz zp|R~F-Y%bi%RbbreAw#Y;cE~yb9^5(zRk>M#Vp@PjE_FDpWP>nk9?QiYj(~@eyRN1 zR!?5<$M<)PkG{Ge-`_XBHy?oS9~fVk`K)Mu*UtIKFO~no>fdJd*yS^a-~VlVj3N8+ z-D>&v_RP1cJ>G15rw^d-KI3Byq)qs|-_H5Sf0YmIUAgk~BYW4+K70A;=EMp zpYh#u0KT6zKJ`gspT*^x@zE#25W9cF&iSa1sr(JA@2!46KARCAy>b20jZ5#p%ADuN z@4H-%AH1^nRGLV=7kZa7&iDS6OWqatuD|!GOOIdKbEa#TZd|@}<-yBOec;m5Kb^D; zHFT?S&5-nYUiL{is7rn2(LL84X7a&{(Nt@_1^v$Vfy+;&&djjzuIBR_X_4U*RIm8DZ2wnZYX|mGJF7I` z6BYra=E~KBjfWq<+&ulv^^ab9V(-IOpZVCwpW1u+X|u5Zm}f(zh-&0_teL3d^}VYp+V0FuU>w7?vPS=_O5u*7ORuriVvLl$X}HQ z<@>)B#LnO_BI%nlTtiQ&PeeL#i zeMCGuXMG*d!KMpzu6H7xoPqv#ss7sQlWyob=lX^7|G=914c6KpxAGl!{-0QNZzcZl zeWcku{)ROAHqFBLc5im6-bl@#X#Rucq_|-RZZJoqV>lIUyQ~_a#MbgYqcNI9~;9`p1qWQyrtRPe1l@?@$j$r7RSw> zw<9p#Xy#)ew|8?~pKJP|eH63Whscjvf2F^jX`bDr{fMFM?Z4`C+DxiH(JtsuIQKpl z9LfC&T9@&t`SAPx=Jaikn=G_rxomqovCn_>=l|&wO>^_dIBt9U&p!X$B}cJ;{+R1(dpohu2Y&X4{%b3ejtkB0n|Eg$CNTMvqphWb|n+}jJBv{+unqlhX3`o!=2X#zN8yH zZEycIz5TCmu@~*&EA|beGzKMXGDaIF4UUiHF{q}IH&KrM6?ts@+tm0M>(TqefBug@ zIj8rwZ$s}dy>R8P&*|OYUt4{ArD?!ZZ9+S?y{&uR^3Om1FMs#^o&U{q_uKSC+&(VH zxEMQ-do1@!Xu^b;-F}gy??j$cO_%U`u&PJa@$$YNWuQ4;>*;m8ruFXU?}ZR2{fgKX zuP`9j6eqsA&SFnAN_bD%{6HH#pD_@<#-P^g7_6r^Vo>Yd&tGAH9I=Ced=>`ekm9Q` zkUf>~MhsL>Sz}P^jTl5ZZ11NxVo>Xi7)9wf*=j?HQICx=Jl$-;?K7E30ljT+|JeuKe7wz8 z**Kln5Va3&kF@s*+K%JLnt6NJ;j>>%Q~4}RzE|>j)i~_^#K&;jbt~t_T)w2XKjv+( zwJmjEN9QuKKFa!dS;mS;^SoP6Z#`B-y`Eq5dPh0>I*+sM z&2jrMUhwg82`_h(=949X7&YN$PFWCA4J#pNpKFZc}U!=uxKg!9UReHTG z$74G>HhPT}PMgxJI3o?YIPOQ9#^+cEe;oH~8toL<8T1>q2c>+7b?EdwoS(N}ZR-q; z4|SZ5_2$ufy|fe7W{efc6|4&`k>-8E_lMxO{7HR+HW6Q~mp&ny=GfSVqDB9=bN-ih zD%YB#NpAmZ*b<9m(d&I;J-u;!1Ba;B^J-pi+$)H3-cH@o2XpMAMO?O)aPct)JVjgN zwp=ww#c?11C0lS=Pj8J&)EmeBDSscE*$;ADZa;c=j$Jx;n$wHNbDh>*ZEwNYhw(z= zz1<<1<@0=Ioaa;a>9}wPWO$?r4G>7%q4G}^1R()MIe zP{;AHZ2wr^^F03==e@t#Il(nJJlcEZTAXuA^xc)O;i)4I%8fqdLGwl{Y>)ZqH)Y4x z+0b{IXBX5F^EsPescZYD`OK$3{Xk>;zF+>*m)`T4Pru2IJtpW|nIGL>{?hx6=KUO+ z@Kd~MS7_8xE^?`PPBeTFt!XYE|6=B2-iJrnoauaT!>W=!%KNf^=y1Qj^d5ZS^On%3 zR0j`ny(Q#bE!Tv7wkT(q{CBr@%k#abCf`U;W$v_<#H-|N5(c z8flS-aw}miNiCk<8)k{z8 z6CA%9?Wry5*yh?I^69=E<5#?2$N2UuKXT^((b_H1Ete^wdH(zQfI7ze$P?FMu^w5+ z+2@g(_Hyan$n!?+kLR$j#UkxYcgN9pSj>#~=W?m}4?gCCBcas%7wf>nKK8%w;bq#e z{&0HVPss{zn~&34E8DDOZ$2Pd=#o*X>lXS*?XTuT#X`BTnBe{KiTe$=+SAz28y&v3 zxBr@(*89sB{m{-dcWi3IT<(aA@;wU&T}|Hz4FBgkP7o<%P8ybE=; ze>`#&{llXCQ+vo4O6ACXIX^?)VDH_H=O;AzqGuX-)XRJyo@J1aKN|E&1{(ZY({L;d zO-G9H-Hl&YLlggMUH<$G{B3XlRUi5enEXgyn@KNqZu{l~!W!Ck_EENX^4bv^ZOVr= zGg#PDaL36t9tXn?>w$0BGY9aR+=5)-_ywC+DBIrt8$Nw+eZamxPC*9)bjSy-llhH` z>fGml`*4)QSLQ$D(PN`$+9z9*>)-rdTcfA-9nW!{%kl7>gg>h0>ty+iPJD;=Y~$k* z*Z7L@&b$r+l{cDgXial*vyR(vOXCLgo&3C0)YJAxXkN7c`Re2C3Ln@~w!Qt=T>FB5 zIZpag8$^BLxAsZTRxRu3&KiF9^^e*ZKDCv~IU2kc%V1kJ!3J7f6YxyjIl~d0+P-Oi z<`4e(7k<;8LC{yvAs|Ov!cSXLo@}1IjWr&!XL8y0O@l0Y^qs2H`cd{(qD%K2u!$|| zuuUo4I96M?y`7}}TV308?$>)MmvWx8J@vo;VAH(sAuH|sZ|(b$Dingpw6yGp_#4pOjERF{3)-X>sgzm=ZNcRdm{{arQGsoauQ$G z?R?5B%A_wnCl~d}7d`XCvsUM_EtQirvjgubo{as9KbvCDD5ltmvF*q0X;s6sDYU_s zVFy3$L#cb{!e>rL+fV8B{%_atsm~@qj^1uhSeKlTP3o{od1oG%IVN8mbH8roc-!h| z8y}y*+H)h}XSqSyTCMjx^}lOh(E1_jkbbQZpsCLFcW1R1gFmvZa*76q@J4&mS!n)j zWb!%Z25s(bSMK?sN4Ve*eNp{M{(!6Wp3KjpPRSK{UngLTIMm+AT*%`L$BfmKj5m~; z2RK&zjuHLz+T!cRht6Zx?`WU4xBt=yx_^b2)(&NE{Oki=eufQynD?Nyy+0?o!Lfb$ z*!nCz^8p<{_<#}T_c#5C=kqajn(HF3+66nb3-c=_Jetq`v>lYWS}yXO3ePIWdSpNGqj$c2PA}`Xb@l$p z5C7~B&FS6GU(L^3X8-rBZ!td~%kgTT;Lc2gr|lgB^y(XRu*QIo61lhrQN8qlNBqv& z1Dp6=*B&^<@0>lwrE--$-J_(f$ya2Qf3ZzeS8}N2JGqCvc>;q z)9W}*>vf#w^(v3lpXh7MXO4ldRrnnf{ScnEFMSN%uHV;A(ACE%k&AsT(%at0o~gc8 z+l&3oaazw_>}QVIw;!L@H_EfQ98zAD9P;*(oJ#WIRCrEU^^{XN6!khb>*=j?DC+e# zp4Y4O1imB3{Ee@yqqIj#o1VAzG(2tZ&t>4R-ZOE3UJJrUKc_?&Ya;q4WtZo1Xw*?+ z2R-*U-3ithktR9$bboXEiMun;R>dn@=EvdG!u!G`;E>@g}#Z7X=Pg}mUxOrS}F}<3X+um`D zv8f%18-L)R#?a>$@u>t~`Ar>|XB`QXZTmmw6g#9#{0bNz*DgCYZtB6;gK9TIyQv|-N=h3Th?zE^jqYi!DBHEG23yXX)lt# zf}L@H^F45Eie|c!4*5r^aVpjo{iVNgEs6fNpTf<5KPf*H)6_UMja$K8wkefU=+#(; zJUC@c28`fU|A1e(S?noh`9`^s$4ri~lj?fUJ7FJb#YWZKLa1hH?0w3 zUnb8L6FQKMxN#oGse|GsIpRmJY^=u3^9_FCwjFS@bp}o6&?G3;DuKS{Bl#(mhcwZDv_;W5>8mDMO#woSs@;K#t_{g&N z58n&7mb|g!6qk9Oo+*M4KV+LyWl6@Uy zi3$7KqfxwCk8&4D#nB0fZx)a{TcMhzVt!| zJL%Mfg~OZu#f5<^8*;Q)A4sT-ghcKFU|^?MB*G#yk2c zUqm}q?WHZU48Bh7DKI`s_IqtlfxgDR0rymN?e|jbZ^bF_zSF8Ic%UOmem=kkJ6k=r#X*?>3hy-+WD!Kth@BF%AH zPp{)Nt=Dmy*Q>l$zR}lMhvU0)pS9li_wRgNr#?*yE*GkMJX1LYpYp2Ykhhm|M*BJv23Fc@;od6elwGxdH?`M- z58KAC7?6`sx=w<&m2HTZb9imfC+)o{mh4Abi%5=g-RojxWm9Vp+MYT}{BZqcpNsye zc_3ap`gQRTI!$q%rAM{)(5!UGL?(ZCZMasLBa z_9L~k>{9AEU-c16#?p9Qj4#-MX1a#!2iep$l6&`3DbnBa;(XQ`H^C#4xcFX4lMDdx_*pXq?u1k*lWKy z@)iB1KQm6Tj%ZDP?8}~So(t$8PGS;nl%8*8zsLO87dOcr4maOJQ7rhe8*sDZj9ZCI zbAH=9ZZWo)zlzIzpTKZ=4MvQ#@mza@2|7KeN?*jsaZZ&zE@JMnUk zt(R;6PV3FKpU)e`M1INNt?YM~*I=SiGB&UtvUw!EuaG*hpp+cvj!of#7I|gs;QM#W z>!dPH`Mp8)fn26si8c*|^lW?NQ@a{1z4Hz{%(tPx6AN{Eu1I+C%$;b>#9n@(mAx0k zV8~zWGEQpmDUO}UqJL^!1xI`^+T?yCdWlbZ6|0^}m6e#99-|1 zmUWE$&2z(m?-1+KUoxs@=9t zFMDCi6^^mRZ$M0cqG>-b?wQs5d09vLjSI)}Ey}3vV;z0P_w#(b%d*L?)5^20kyiYk zlN;~niC<;h&r=<7gKP9t7>IW25c_$^@;s?zzjyZY%G|dw447*Q2HqDLE5HZ5Y3Eh@ z7VsW)pQYBjYM*64z402k*1Mm-+9yDc*vEO`zbkXvlN^jf;B+fYu@MoL{ZjUT+06AwJlB2LsDMz7;EtvBK{rT0R(_e<}rC{LpB&X6bDDP!dJ>?Vz zQLkgLp57XRsMj%=*Q@m(zHb`_tb6daem?Rb`>W`{HrGA0J=d1#jQbX{0}pnHTi2+f zsgyiEMV_r}1Kse-miAXwhYjOR>tX7Uqg;1?6wD}UWWNW!iyV_; zK_~gx<*`b(4}u$V$iMWsd0!${{8V1YeX>Y19|r94hZuBS5c#HXa^G?D>-I>S#%)>06mF~cWmn^N(0n7W)Si@6 z`34XEk+1M@PR<+-x8=1?!OfqQlO6I&xXC|C_0w24huePnhK)sziC8o~dA_-?)BUvI zF56&&9Qu&a{REET$z#{#_@=&-d4}tK^h zvX38e8;@^?$L%or=KZw9EZi*i0XN~G`vAlY-x#;?vx(5AahqSO>i!A&&b&a5xBb+- zQ1+pxaN9rMmiKCjahz{s9(=+UeTLW_w{gty7;V69z-VGGw&dGOv7cM^M=g$IUtCYJbaIfld5G z&i(a$?Ht44FLtTZzBb45S2V4Up{Z^=`x9}nx&dG4H4fD6hXXv=F`L7_tHm(rU1WOn zS9(R8@^=*u_$gW8OC2~wT5LDbu7))nM5By(BARr@bt3+;{=+Uh z6{E%*>4r!17BuNXH-1V^ZOMAF=p5&dbi$+9k&{kJeusW*Zmay;_oa90s4bye9H}ii zrk~q2)&pnq^Q+h~dW!Q*es2q7$~mipCO+zFKKy_Wn)s+IeExnOFaQg1viDGKK5oa1 zO>J-gRUhdA2lqAo%|&|;Q)z3k6P>jz?_d(1-3%Z1Yc*f!dEX;eCprD?Bxtn{*s$O3 zr@s~UXUrV2faU$o#oNAU$Hd3Hicf8C|K$&I_UYT+{?8xgT>G5WI}qdxmH2`#-HU)G z|MYHvSQqy_klW7klDRj$Pe8igmGKcj{)ndE2S*#ysZu&4&pRv3r4yd}@^vKkWJmsi zx%A#T!MCt@z*N`Z=%7x&D~dYRr`0!UAL&*%7xL{knxlYZqup4XGFrX$UX@ENYDpGO&u zgR#!zd$HG8mt{lj<$hG8$&Y!t@_q>J#fx91=8s5QSlpaPKgkd5iWct)=pH{95J!AJ zg!HoaBw6h(L!(V7k@Nj2AA2Pic}|6UV6h%qzYpQ-l$u74>7Kx0^~SyBTJL`T>Y3NO z%s$Vx>irPt(KD|$b|o4-Z9o6~HFTa2QHfl9-dpw310L}^XAf-RH~M@Sd*BqmbN0Y2 zeplJko-BBgf5=Vckm^bf`Tj_3Yw^^1tNN)NiZsum_4L*`6!m%z&Fj_pukj`JF?^1{ zY@)@JF6_4}QVCdiG*JbIhjg5mWp|jOzGw z4@h~2+*A&!uH=xnm*iBE7jZ45ddjIBih3QJ_4L*`6!m%=&+FA3s+?xN!`FEKqq8&i zRpDuSThUvIzpOd@`9t3m=aa zPlv$`UHsmm%j?n3jur1J+$0C@OOKn!^;Yvm^JLpQZZS5s199UI{L>iv93VcGo$;%^ zsRQ$@BVj^pF{j|!%{(o3aNB7G0nT8|$~}{Se5bC-bDfBD<7&KLqh$hqCmyvd1c#`LJ~T(ByuA zZ}O4S^_Tv}e*8RcK2FJx&UE3oa-z;D^utr*7Gr}4IrN}cV;MZ))LAJ%WlQ}7e(K;^ zD zlPx`8u2?e9&{yF1xR%#R_~PpVzo!w`bS9T{U|Tk|o~rmVrhY#n`#Q)H6ZW)6l81`2zuEBROV@%Zk4#$!eO>G&+PSc@wPI|M=!6#&?liui)XnH>cv~T2b_gt1U z9MZGt;9&fNzu-ijV&!;Yb&8eqDGad*MiB?s6gf$HB)`)lrsM?nv(m$9LvD_VL=@{%icb5FGJ28{Y3KpR|7` zeR&UXxThsQsh3P_FMNPT-)Nc_?f>b1!#mHXSQ-)nmc^fmSk^qY0^?4{V>ihBy!h}RKwdkT!#_yT|1kN584ovu%EXllr6H4-w~by0@yrB~N?$kC6=yjrFn=a6 z^l?vol)`Xo|Bjfz1f4ObklW36YHXk(CmT~aB_6O9uWaf45S`KD{+*p#9(m4i9QW_o ztLv<8-TgcKIL!W?{01Aff0x(PF}4~T`Z~D5BRS%xUj2<@XtKe%urZ#|{$1ut?JT>L z2idpVR%dyces2yPTlhjiE+;ol&^$+~m%{ELv;U?cG^_-9RQeCfc%J&l@&HP=$UgLY@!`GxM z@81#Q>ixU2M}lm`jTqxNC2aP?O>*e#%>Kb}8^??d!*9S1EbF*5=eND%HXf%+{wl8R zNeq|QcE*=-Z_e-WIOXzSgO6iu${rUqc<@Cz+1a`6Kc&AV6R{O9eqih6+`nU8(e_jQ zt@uq$tW)LhR`$Eg&+v*yS^AszSL!4$InFz)SD%IlTI7|j!|vb3brQbB{kuprA5!i` zo7$6zd}=F0C_R^&+i}QSVxdm^63PLdcNIdvF{hv)^;H z;D`?vOWK3Wwg!KRhdS-e$QSgAwrbpwUNEv)27i&IPI@_(zoJdyYdW&O<+*C<#W(0R z4qH~Y9}dVNAN^fqf2o&G(O>BmZOUKMv82~*B^>ZmvQe+6lskytc#T}^-Ot|(d5%Jk_8;egKYIyHeiRJK^$l{7C+?la`hvl< zUdLcPy^g`OUdLcw?}hx{TD9XG2I?OLgYs;uXu_iIf1*!e5NVFVdU|UNqF%>fUa#H{ zAq*(-m9avlaH36jbFPpV@ah>}XxOE!aiVTJ)5H^Ts%5>ulzZorL2tzAuzDS*X}uAr zDZLl+wHh>H*IL*yC~INGSuiN}z%J^J&sN5IWaA!oO>+#^)9V=adPOf7OzU+F*3;`4OzVx~X7oq?YTP7d>gF(j22a7j?MY6h zV^H1?p?b;2xkGDm(Hw*I^wt<0#$T<2)z++Ah_ik^@*w-Gim5Yc+Ma8~?Ob-b&%r|- zJlG*_U89Po5_$CCQ{>so^5}tAwzR*hy3T0Eo7RNXAxF89eF1xPs15epUqx0nr>=L3 z{_?!m>ir(yUq$aC$D~-WLq4v98*=D*>2dQu3SQ_R<2K&=$k-0p7u=S0OyS0U4}G@n zEkms&Ps;PS)3`B?V~4z12e-rI8@3LfZ{DwohjykU_dVbInchgV7$$IA)-i?K>gSkO zI8gd2 zxb2s3*r5G7E73I`-`rP?5%84pt>7-(;D$WiKWtp>CXS{(gu^GoB&e;K!z(_Mt5KR`y~=TZLQHF@;;aSF=36EkFN^-{bM^@VFf&-@Koen1!3gKHw%CbRU42 z;Tz-T{WQ`HkBNMnUjyrT%+B;PFOZXMKQ%9m_j9|({Sj{a=Uds&H6K$yAjWaNjd`%K z$h^evxQ%1Zehjz`80G7B;z391yZv}xh&1CFaFb1~-y)y%+t@ekk8WpK_@Gm2?@4vz z{ZVfZ(I`zvl9OJ>SNWv&rA~S^4omOccuXwFOE0#zg1>g0=+Y~nq?hwJUMW80oaX!5 z9192RVV64XYjcb&dPSSU*K~~hB`)cejv5DK^@M7DH-tju)98{gqzP zru?14!QxDM@kO%2S9_+EqD{@CUHgo@=HgM|#B=NDyff4ZvwO2_ zXLQLn&9j^MMxAUJEwwLo_hvoll%A%!xQV@7mv}jrZHsO59Y%kv)wO-oeCu1E{3KsH zO`kLQxm#jpj{KH=PTS$#`PwS2)vbQR=->$-?~f3+cLhGth4;z)_mt5ger){a$Iicz z@zB1xrTYuA$1_se--+_*fj92cL^^uk{r7(AHLo{>|94Y+{NnHb(PMf4 zwdV2mC_Zdud(sp4nQK{Z4`1ihw3kcoz0K`M@6Is@AGHTQ(!abt{GBW(t!~^N9*^p2 z53t~z_5dG_@5*>`44v^qe32&pjXw3kPhP0x@JT$8wrx7ef6HRi4|7zd^Q@;9` zzT<}y&t(T21ybC2?;X&%{>O&c$Ux%YhbbEi3d{Bh-hJ*$Tfp4p?U zZAw3-)?pmWmP)M)X+z~3KEr!ou*dZkJTJV~o-U1 zDqlNwCLeix{&X60qEW&d*Hw{@uRf-~vh?2D_<9N7g_GKYap9cBMZ2hfP)97~y2I}) zsGh#PZ8Dtey>%RG{NQ*iV=lf(!w2ay8@8@0`h~T4A`M-vt3=Z?D2#Wi+vv5fDmq0& zH@xv)Dt?HLY;3<*ie9xJ{s>R)L)Sj~y2{tl(6(~SdQK|V5wFj+p0AN6tS;ntQ$S;1 z6};Ns{<9D3Ce}Z!*7}&aHQP;IS+Z2hI1g7AtcJ<24xY(fmSQd0lyjtKzmiw)eVvuHj$X+kaNa|N5LZ@wet{L3n64 zN^~BvQhQ<4DK3s_6J0B?*SM4Oq_bo0wLzm@!1`>yHkBOZ*}RtR?3lGI<(+vC>7*Ug ze(>Fy@ux3)I%q4&s+^)>$H%*6+oIL$3*sj~XfM{Er<#jto&yWnrEHC^&(Hk9 zAOC_shwS4V;|+MC2Yv8s&q*}u7DnS-drlm0 z{W*-@_`G4QcRzo1-6dQo@m1@5O6^&LkFcYJS2XN`Z{*Q)-p~{ey4@%5ACikaaUVR^ zBO9MrtZ9zndV1sYinZST{5{#+aT{|Ru`}LKwtdqm2kkU{+J3q2Lhe6cN&ZtF%R01n z#~)#<9M;4(I=1tA^&BLa3IpYy z@(UXAQ5FpDIsV~X_b0Y@1?^btWxW2ZWn+HTG{<1PZi+ms^v3*(GR5C{y~+dRwsK6w zOZzDg)RyoRosKJY!cKBA41m)hFD0dLOb(~Re980G3#_@o?Nq96aL<}?z)NOq-w>4$)wNDs4Zx}>6 zvhlfJwFx}XVp~VKgXpa>IE=r#UnhLzPsENoaHUkAi1S9IZ&)lIr|*f^dShEhxr6BS zIH&dQ=Wl(z$Ql!0ZN2_Gww_Jzm}0!t8n*52B+;PzN6#Pqpq-L0v|-!Zj=Gh^m98JG z)NehZ(|+(%c2b^qc!;hpZKPQNNu3e~W`zhS~*+=NeW`9$> z%8$e1COOK^^hRu{o5rogyqkH9cfbufkE^VI43i2se`XFo(X5=n&GR|(75)BPDn7EG z1y9>g;pWc?LXWtqeZCv{hAqQ3y=MVGgqvcH@onUNAMsI=`<`$9%v_{NhvM;kE7)Ue ztiRx<^<8WFm;0$dCx~o~8*RYYwL0HCUpwP7A5-6x93}PEf70{398*VIiiSyKu`7~#Vp?_m2cupb^SQsBF%IS zeI32{U??1agB?dc{7Aa0@r}B+pTf=KhK_8+jTou#Lf-(B{cw{UrQ_yp)0r;nrg8Ip z!`^P;8E~Tx+D4wEIL4P$*9*7u4sy{frXk<#IOT(I>r990ivDrFoiv`dpTf<@H|(QB zxDoHRoyUBWuVdU?9zNNY+?L5ZZiR+kkyuys7u=Xn=W+9VgTBcAQW6U>;%is6@fbHByM!sFzv-sWfQ(pFEQbd z{Do#QB)y#-oA0TOw8slwb(HW#e??mqTEZdv8+A9c7VQ z?(-YHF*KijAYx#0H@{%D`0DhV4@~(gn~}CKo1+*zpVwlY>umZchmTWnaLt1qmFQ9Y z@JlZ19Q@S%x^jP|>GeD#I<~T($Zgm;_m}K%@TEDJdmh*XJJ8#bTeJnp$ezw^;dfjOB^-mpl9e3tB#+7ql zgSkhssWg9+{zyYV=b{mpY>IZO*-7^}@C{z-!Kv+iZ$9oVYY+aU(aBNxX(vkU9YP}q zsiWjP?w`^psN3kZKfgS;z=N-G?+}?NTkoGn8hs=BBicdq`aa8eKl7meo@{n*14rfA z9FA>2g{}Y1B-RjbG##le@;-~+A$yO}So1*ReX;QB9kM@^>)>g7$CiB|eWQ+ZmhbRU zA{XDEta|AI=lGqo2j=m+u08ON-#L4VOXVti$^~+2E4L4MOZ#ZwpJU~%@-KUnJpqZnuHZ|v9Vvy|wG7>HId@Hw0QA)0g_bdMAp zl0~m$u%6x;gQ(XrnAfZPp>JuQj{Xt*7{~NGc-p@7tvUx&-!)m4$i+UUdg+P%%k!gL z<3xM0e>qM*W<-7Rd6m7`zZ|n^dx}eC#0WdGOMJ19fjjLw)sIwHa%eo(#y%Ryf9j)b z-H#&8u~|=VokLNt=g_=fo9h>>DTrNbinh0t^kFaEzi}@;KC8EBeE6=t^e$hYf-jg- zs*l{?+;if?x$c~<%v0r4g7 zTb|51D9v74OGVpujWl^32~Wg?eM`+hH74e7dOvLRO|cLo*ssRT_d1Xl7Lp_W&gx%U z+`Mlw&(dcU7r4dPbgw~i!9R_m&kyk7xA-Y*ztKUAU;=MvWyFSf;VC&ajSX_}QtBQ8 z_RuXGI>(mYb4sk_w_@I~bK=%V?_)-mXG`JJ`B*6UYXoVprZEOWt6=?Z?<+ zH~PIWKKLUxo;RMKvI9@S#`lvts{;%9fLy_*@ZcZvqRE!|k@nG$hnD>q`U-r|^gd?v z<1Zz?#QxR=n(0b9sFO|gw^dtPFH^*);SH~EqMO}VgTexW<&6#C&QxUJ49^v1S9 zr);Plu%U4Ze&U12a7i)CH_F5AqnW=;*jq%y@7IXuq}%c~$ot*cC*L%OZ`yeryERV9 zH^tN$A2CwD4sOU1Kc#T%?D*Tqt>lB|_O|zYi?Jzxv1$0Lt%lqKFKEJ$W7Wa$ewUnz zenaCNnJ({lfG_caU&*O*UkRP?NDf}NQFySAym&Z=N8=Roj8kgM4Lcu?Q{`T=>{+># zdm6(#lgC!}YrsbKHJ*u&620z|w}X6Q-P86{<5|H_K5b_m*g;ps5E?pb4B?Z!X z<`a0J<#>{A*{b^`Jf?36o5S9RGJAs#`K9qJt_ATO{|uqDU(B)jpJdf<8Ar5Vta#B; zWT)39uGja?JL8v68oQ~}ejmqXH{~vR(Jy~HI}*)ww;Vke(RamNauN1 z*E{`8EAd*Z5BuBl7aiC~R{MeQZd;u&a=m^(9)A3!6p!WX(msFWi~IbNrCg;K`KZ@? zOz~4M9aDPoX-=={NPa6$bivPFq;wiaX?%}+qVT{wWpAT5LfVHe7?`fK58WBX>Fh%< z<0qSuhL6#oozC+w*11mhp^MJtI9x97H5YpxBRVCQb()_p$G$1Pl)YQ_p?!TxT#Jke zavOH;`_S%>_MyxE@Qbz&?XuEa_K9CKn}vqnXj9`MzK&_>`K0t45%|xU9Cj(;wciB{ ze;v)19AB;uD&{Z^OXPVjsaJoGp0P$J8FO@tkMU`Gi) zU;fgU-lM#VG_dDf`N*;AygfcU+!qk-MBuqKx0Q6_7Z~vlnfvqK9Dqih{+?*$jkx14 zy5+aVC)O?abTsQB)+mQ=>fGPHx3MI@?3IsMHpG6-{??(tPXHRf z^PxOuK2pxh@%x3+=j1o>A{TuDAL>Mldmz+<6(zpL-yNtwvPU6V?cG7cCM9ydkKq_o zht0?n_b+2TvT@&~run|hdV1r&ORaZ5f3+_~UuD1S^;YV>koJ$eOoONG=lAZQv;I}t z*?HVcQ@!-e?cE`VFX986_>Ddv#@^iCU2PA{;&+uj?cFKwkekXO)s-A7IW3xUsm@!` zr*bILJcriPTjx;J>p3*9SHDl0>SOrqeQiAVp;P@)&rEk#CkzTsMNTyOBfO`=?|8_2 z(F;!ApWux&$7wyij?=VW$7x=#@(6#(TlyMvD!8eyu{I<3J1g6MoQJO8_pQ6eb*Mxx z_BGX0w!M!%vA@mPi~Y=TTF>5GU;B3AyO7tOv9FaJ8t*&6Q*y{@F+Y(zX*}^>OQe?^ zn%3*stf$v=Xj-qg@w{HG5%8UUpg7qd*M1%tGq2Jo+TLb!EAdx*<68Sj2mHIn&)Nc9 zD7(B)fkquAn4m}dGt}XOc#xA%k%zt)d1cG|Snx~)eozOGmBV!$bDh&HwEiaLsZ-#36C+%)eT1~=m79RP>LO>*BE+&nI>#Whd1z2$_R$Jn$FLEQL} zuk&Xy6d$E9)P4tbTUiGsm~7kso>QLJlEY5Psq!2p{P0K)pU89V*@=d{cx6lbQnV%O z7>4*blB0BN3Jr`M;L{;7^gbpYkSYP@it^br1uFRtKaOukl*=6ogF71 zn!GlmF8al}`dbHoUT?PjRNfT7!54n{%em)GS^E+jJOvvcgQ%0dm+>famsUr{)25w^Cju%{5aV*6w=-|wnSIIp-y`_nVzl-jW1(f zuGguHa?+do@8COp)JbplYtYMi)A;YAIp+BUN}fx=2b+)5UNW|X33RZdPWvJ9h4rLp ztHu_~pS1UluI+%e9cO*Lymt&8v^aaVOoT7nC%-86PX!Twi`ryOYsXYb8C&_A0fgHqtY$4~@SIhGQa_}B> zPodW9*MsZnje82U-u?X5o&s|08`yn@;o48v_+6&K)AsXw3ea_(pm{j%DMUJY;(mhf zZTj^_XL?>e`*-8KoysBNQC^iCDsrMx!dvI9=*T)wE(>p@c@C|oH|9{S*K=rI@5y{G zMB_{BW2LVZpSLYea8iHNUb*a2);Li|Kct+(Db^R9yg${nh!eEK=yjZ?^+ueg^s2A1 zo}+)z*L2;dzQ#2vxerg<&-XRyP>EdZYpR!?xxQB01Dp7*eU{$+?15AKz7+9Y2={Tw zow*!RUX>i0-h1v6X8rKqj5>e4ua&lrdOe5M(_80I)ayAkuUB&@z9Yw+O`LK6j<#8S zUF_Gjo$=9^;NP-Rf1ii4%UHuhe}xA-#BJ;A^c(5Uj`4vKJ;=$Y$b)X=#mhOo+E3^* z4IZ+22TfVfomAEu7 zx4mEAjIWD*50v?tcFb)xfuWD#;-eIXQ~P(&zyzJ1Q)SP9c*i-lyw@VRg3XvG=Sy05 z$<{`AFCJqnKDNF6mp>a;`t_Z!r=jz%@y^P1_wVq7ydkIBe(Jio_)Sdm8*J46${S%i z#>V?wUaO~=Bv-I0JkXFAP1vZvVFOzBBek>aQm)=F_dR!fAr@jbT}g-hqim{YC#b^@ z*I)8-^*)qe>tjQ>5gWP0d7V?}ALCYVmu<~+l=^%~zKZkpR;Unaj}O!z@e!i_SHQ`wISx3Z5TUnNJ` zB^!l@I&4H<$F1zQLCe@K#jO1$=!{c}3*2ICHa4dFJ;FEJ9Q4V)jl#n_3{)o!HNK)_ ztN4^K0V~g`vR0MfW$r8cPw;o9M{?-nT=%Xx#x8z}mviv1$0@~Zr1YU3J#R|P$aYq5 zJ}t$pdoYX-HUF5(+$W@peLo5C&f5j*}FLc<=QWYvGcSNj*j znm?q1Eay|}l0qwcG}4RAuE{c<>bWM4kwLF$@)w%wOh>j^{5820EB7`D3IR-o7 z%lVYQ#8m4wACq3SgX{Hc3XX|E`lDX)D<-EEIsAEz$p2XR8wG>qc|cgiJfN>eS;`46CiIOo* z@7SQ7*;lzru8~b^Lj7jYdU-dU&f4rf#*Y)>)`22d+Ws?|v=nn02`h9>uL|S!l>nN=`mS z9_nO6GVwZHb?}&;v^Jy;os{3LeOT-tW*=5D2{-bwtM;$q*$+45zB9Oa-`BXOvC*$T z$9u1N3>>gmyJ}x3>L~5v`)R~TzQNP>Q`hajAJ#SAZ-pDyxM55CkewY9 zAAYRLH{wA*C2i=q`Lkh>X1XSD^YJM1P2qNs{oBs$FG3#@Zu{q(?{{b%K@UER^R4g@ zE0|D9=5V-qzQwgpjT?H21s=1rbRDSi4L#?Fq> z4^Qc*C0}KmQu&6A_BuHhZsOg|yxJ!sR_d^^$T5#F3j2oW80TBr%M{JZA>XLO2ldma zSN!$<+B|M$-+Gb#RV?W8eDif0HmN%ZZpt@g4u)HaS-6?46f?eKH(?akh477WEBlwC zNe6zQgVHi#cF#8Aw)%cS*^^#mOt7hb`rXJk@2BIKbKVcQ2?yP0A%6U&EdA8yg-Dym zZGNp9aXajOZp3Z>d|TenrCrDQR(Q5@+fWjpY^k5BF80%i!z*b&7vB%QpX+~jnK6~W zwVcZ#FKp}>_K__gQa$4cSkkAoAI9;r-Q_XgbY!{myIJx8e`VkP7IgX>-IY&CPJbsl z(Kd=dl8wK|Wggg9ul-Jfcx>-<*mt!YNO59=m?-1kp6b8=TAY_uXF9T+_XX{l#@{vT z@7SeSY>fo%+@Q1cAu!{bg3|33T(JWUpRgfch>1FA@ZH@~-8j=cd-R)Dk1Y4fpxfU9On-A4KfY?Q;RnB$=QrQj=6CC7vm7y!yygNJB zzL02?==#l%oqr?chko_fFY9l}(GJLqhi8*?ogC%Wrtx|=($VXGU)SfuSBhT!y=wUb z-pV`fZ~h}2S5Brne|Ir;#8S71>S+(K;9Tv&vD$-Ua<{Wmd}e){T;gx{o?Qc zk@oL-7f$4f?Gfd%0dH)NNH6W-+!c*^0t9>*)?e86Xzk;@%W7j+x>u5{cgLojw-K=nvC*b{RGx3{Ia*_|Gb8Kmi?sfpb?F!M2l}S^h1L_w z1IBOVkNr+)Q#S1xxReK-(bYy;Ga<`bAeLI+P$yf;AN>YIHe(s(#4maMO={ZrShn{m zTh9=Wu2<2896XXE9(eROsm0@Rr%ybd>F7+lZ5;}a-f^ip2mam6t1*%HF2#9H{^;*Z zGgn|=a}ndH%UnGAMXNuF9kT~rc9=V{qcw|U^f#$HqkqHJ)5vPA46nsKv=Om)R;Ona zYMlrQYxtr)_NcY4g4Xu-U;cb2*H!qy{GoZgUiW-|UFA7pZIg0`ocWXdY^wfl1Nf1f zHg4o~uJ?V`*UDLP13t~;&@@+bEIN7X?cw`$qDj}>x(a#m#Q8JI!$W_H^Kzu)tIx~s zKfJF5y>VTIKj5SO&zM2Kq+RCMRlaVASM5RG6CdrdZO70wesFC4I@u9lq=`Sbxvi^; ze&HpaNJAI>OElf1#-8fX>Frl^A{Tk$J?dCr+Rv|@Yud}D_ul+lNBj|<+Gk_zkFhiN zp3i>|Me_-z_E};b@%nsQ;uTg4!wlXF`JH$ivmb&FZSU(Qt(mOKo)@^7ev=I!*SwT% zZ~x^F*g1Z8r1$SZC+{ekhbd1rccgXGJMy{e+ur+?)=b9wsylCQ`dwN7(TOPZ``Gqxlq|f+=eqnzHd6RJrd3>P!y-dfRu5+oEyyNv^ zuRaV-J~-{#@Jwoy6VJR{c_vkP8~xVY5NV5yOY~EA3hjN18o$=O_vdOU`4CUw%lNfc ztG{K%5yv~t`;OQ83f^-%y0b3N|HN757vZjQjz+&8+0H&{9*gTejVa(yo3Nfd)tpZA z7T09Z`Rx_C()RYBea3(D%JUq)t;`ReoNEtBe*;0bD7A+K4Sq`O$LE@;LucfPzQ=lG zIz7!}c`j~y3p#(4k8Q7-lB2fX8?DdK zLH_|qt;K~Ab;@0>#YLkm*p@hGr^pl6;<3J9>;0vsIkxNRb!?~gI=1tAb^jygCwT@= z!iQt!p7K(;2WH~0@sXTLcq2Zlr!4rmueIKYPn45itMta)tMx{Fru1rG6glq8!gK71 z=Z|tkIw@-mr~|Xe6Mc>K1%ooCDn4itgTv~LIa1q<7)*;XZyaZ)^u{po9T z?^?W!0m2~GmA3Z0jAI3I@Wy*{kzQj^>vas)(;G3U^*RRgdTqUX{Q2xVF|dBbSFR6i zt()GPzinq)YqhO>7Gk5#*TD@rFarOB;Z|bCZuVn{xx`i0FzCnc zf}1}JOPy$@YtVsSXxbx)d_})MLyUc{2jOY^Dct-yF6hV#H}V-f-;I33mi<0>ad(aj zyZEscVzy()DDUy$@3!iC<(og>7-^M|yYMq4>7-(lEcr8$%zN;7)+_ln51*rvVF4A z-;Rs8;TyUWMmgVzhdRoFo9l=)<5|MqMxOL6Y}7mGs>ZkdaD%?cF;NOPbaz$XI0$aY z72L{wqy2EhkKOEtVvacIw=2A}H8mg@?*F`uHN?Wgk1 z`%t!#asgfA@ojt^F~-fGK_)L{o47TfdcGAN;U*s0()flS(6C{=DQ4=BqttvVe^Xtr z@y+LCY@-*N=}J1NLocP~(^yyZmww7M3fQ*&6mFgi@&kVr3wAu;%6cAbrf^e!WnYK! zE#f8~A<#Z3b)87{YFdAxMu#5ea0E> z%|ZtY>EK*?qb+O_lZ~nA*&X<|vQHYfsME6-nV$4Y|I~PFI?^~dwFhf^!Rg z_s7@g(Pq&*O+!v?ik#s#=#ve#Y19kN{aw~;IuaH&wozWWz*+)bl=wOq2RZD2FReUd zZE`oiV72IVI)5*1*&p=76KVJu{n_cf563#!$=^#WI`J{`D318dN3rMElkiI}>m2?* z7xyQ&O=r1R!rx2taTqyhl*nyZ$ul_h-$VmD*ZVd5ducAKdm`n&%-2@h)EvWolCeKL zQ&Zp1;U3S$%`ax(+TMglpPP2S$L|$!PsV+tuG|l4djz-#R6eJT^{v@|@_;s?M4sy? zJ!jxKvUB{p(HT1!zrpC7J%@(9v(3&?XpA4!!EW4xsfnq@?~Ck0)6R;K*-v215i z>uGyqPWLmor@@!cm=D>uxBu*ZM){I|?sN1j_%gCpbaZDMyQksbqJ!~2_?%*t{+h%g&g{=fkdSB@e+cDR%(0HFJym|-epUrjfwEg@$R-xPP7aEnw#doZ#UV6Ak6u)!!z&w7V z&xf%G{_#6!kG6>4RrYiri#%am0aJ3pvGwsC8u<#g$`kF`Ys~^rowv$8$-^7-Hqw!e z?+U5)f}ip>%Hh|3dOdH;H5NIKj)VBC`xf*OY^emFh=FKDr`r?1O82!(@1W%xRP~fo z7(~5}!FqaY45D7|yYqULKeRu6jM&NBwRV=lNYP6KYgDEEbs$<#xK?^ zoKtpr-i3$w;K5fg&|WPx#sld=4qnR0gKp%-D_iwG5j-ZJ)=IKV`JKA{#8=l}@|67! z%~6|Xn|NQBd?2RPxY0iA;D+3H2DcKI=E}CWF~;o0*sQJ6{Rp*VZmXdk)NU5tu-B$K zVK~*^w6ppvIU#H~MjktLPKidjFdoVp8`Wh$6OU}^Sx9K~0k!3ZofEe{2aQ>L*u+M} zhC1S)Y(jsb4lG5h`z2#n+mG7-|AZm>h#gzl6oxUsSZjj|JOx9~Px%E8ddB%xc+ic! z@Rh9?GcnA?tbQ5S6!-$p(h+H9C*>6W$)<3NeAt91;>O&`Jm2=qxOEwO=^bO@`-j4W z5=_JkHu{^|)bVT<^89XF=ad?&I2I;T@#tPay*6=7d`~;lOxJ*k;#NP4e8MYY!dRub ze$)KA#lH1eg}=m0Oj|i_&SNgYgZ_iyrd)E|%Kk69kyi||b#UCqW0m4s9;^IbRu$KP zq3mk^4nEZhLyhC22^(Sp8|q_D5z`o(vVRLrzEEPru_-*lR=V*A9*tGR%2=hCm&Ypq zjUoEaTYkcKEbl2$XUEA0?YGqaaIU;bvSxpN3@YOT{=zSRImhpa4Y9#f#-Qo`h8(<( zP2oW|^1@NJ>b!x+y0$@BOm=We+GZS6}(paJAWNx z7^Ua*Ge!f3_(YxdWi!3VvDvCVV9) z95VI;4u(nM6Ao$*9E?IBd8f|Fy_1>m*No|Jida`;hjZId(ex z&&#s18EIguI4E~I$351$PWGRRPJCpKQ#ut#+$$DM@xw2##B>E!;#f7gL5>l5A`f-cEXFP_eh$y@PYM|OGti24sQTc!hk@cHtWzVsfAPtX?G zS4w!IoM?{uXAK)~f8@aJM3C3LG0}_!Mya3tX-@L^guk&K9H~>AaE!m`5lyn_F}q18 z_YCBpawzLg`jE|b(><<8!*}HQy$J7V!QN}_ynesSn^K*>-vxibS8_G)9TU9RH@nFO zzT(5#@a`79r$z6ApCC-w|8 zbEbZ?%=|NM4<8p*PkWG?oYNj)&auW7$HinZxCY#gUu)IXq)+r#65mwNRN_|!k3sef=x zJ1|C&!|+8KcuJRb!QnT{)Tyn+b0N>!(5O@XbFSxwMWe*O*q^AwhsYEAQ>;fe_NSWm za_LonQY@)`@;sNX5h9+$ZWror<9!LwOluh&%#u{X-2R1 z`rCf~H_h;|-$2>+_Fw*ht>f#@Z9pe4DH-c2<8PW{ecR9frWw9hi@kVlteA<7-!t>o z=X~zF5d*E?VjZ&HzRSO9rakFTBT9aXe_Gf&jzjCf?C629bn3JVj zziCDf*DbNs+M7CjqEvoq-9(*qsjU5p^7>6Pb;q)gs#_KMh=gFxzT8?&BYTX5X%mJl6{Mw22H}zU~!N)vLKY*ru<(N9? z+e3SlJwWlJYy7U5vObDDKK>UUL_;_JullW1z3!4MwqGv2^|}k3v<_wrq5l(?`iJ^` z-5!i9Y7g=rKDCFBIgS~})~~B|SD}H4beWCe9emUYFY)M}FSKowW8Ed1em^Za>5Mp2 zhcA&QwqL9#Hg7*)bJw(&ORwI+hd;ty_d04H4bR~ne9*v*QhQFZj(B}uF7b+AnCTsR z$Z7s+`}ue5u~+|#*(Q8o##bNxmNeiTdjJBkYs=sJ`gAVeD@mcL{8Iqozg!a+=jy=Xz zo=K!m?^)njYYml}lcC9$@<-1`Lz69)QBM4l*E{xTU*#R^a9{uUeG+sc2an{43!b=c z!k)`rJi#-rY0S%VT9co*cMYRY>ltuEm&QV^XLP+vz5LNU#JGwdlo}^}t>trHXZ6f| z$jVN=#*rPZo6rT$$WE=BqRrLoChy}@>!$cF7_E)4rssqibA7BRa|F4Q#}9iB*mDP8 z+TQ+K@h%v6Xb(!{k66hZ0@lhIhe4 zIq}TP@s5H5&I?qsM2djWj&# zi5_sITv&;m_K-N<%5~U+M|()nkfX$Ye8!PF_#;pBJ=P=Z&mH=nN=>`PbVYv-qt~CO zo7TIZzj_yp@;l-zytU@TXJLnb@LtG!M9{V}7UIz}={$F&cnXHaU(t|*H$K~oUeODN zKBv}t9mDnXI)>AF9m9FOC!0HNdx!Z>-mJ>Swx7z+asNSw`hjpKPGL(fdVc!+0Zq6S zY)c%-MV`3Uj`aoGX}yl^dU_q(X}yl^yk6y3%unJ41L4E5@F7>=)wKxuBmNp6UZ^UOxZ;X@J;VE%?&Qd2@@uyGE{XU;%M4yT?(mc-f^wx1k zy|Ir?`Kz`DA7T&|oJS03PwEN=o?DWm6i;mHSU-h%x`KhPMUWFsy5oEm=~Ea;wqUTH-Wr3b*D;va8^;4-uxl8^K2IE~ zD;Rjr#&JaQalVQ48iQJ|=fQenPFYH`?VY|y~0Bq8h z@F+*@+1C?{G0^Z;C33`rp2$NT^5T^({jME9puuCjX?;%}a+KPK;TT_1U2n13x$W<# zcQHho=}J1}7p3rxd_})Mn~8m{dEjaLDct;;7&p1xEn>KXZ{F!*_M6+@NH}AKRujnth9W(vl-1bwrdA>y4wlY7qztj09Tb7gQ zcL0hd=j4DJzChD^6o`lRr7XDlGnbKOauc}u7$RGWJ?YBtpTIu2kvDBWg`4lM%NG2K zg>wIVE6*G@W8sFMw7oFj98evbmjyP3yu8DbtV3iqk0!@q*t__=0ira$SB zElTy%SXcCye2dQ$Z<^FC_I;gweSCA=uz@TwQKA$7J>SaubUX8u@okK|;zkbMjL8Xp zU&S#v$p+`LCEW0%#!bFa>URd>OLhIYpGKPLU&7w9=Q#dUeBK6CzLATq>0idp`zbnz zK{2TarI=MmseY=yMOpH#y!(S#GS852 z)Zv40<5+dHmFqA0#(YX$+aC-!;wC0^#eBmLuo&a!xWgx3B?qtLR(Q~zF-f{*OXHg` zn#XN%H zy?pcq*

SI!ffEH`^cdLZ?o8rH_)hD5u8U-9fLve*!-CL2^07rDu((Uu1gG>+hw8 z#&heb+!PM}`vB_9R???jqE7p%nVw{eUY}dVPbu15oa{+X#R)#%F76MyERN)lY*Sb7 znaif@UG~RxWNeFGvvnZ7U_Yl9e;pqm?>WX6{vb!Gz8UX($e*b=$l>^&n5^sO7p#_J zr}Lcta-6amY4{lZ(R*TIo$D;`iGj8phmTWw4v@0g^Z27&);aj8`x@mwN_kHVa@*NY zL@wadjc3U z=pWS4u5)`1$iaKcegn~brD?d9M<&X~_ifaAZ!zBJkK_)b*Y`*~&RXw&{^~t3%Ck8f z+kOgLf5*h1Gv9enOlk|ePmB(|58|{PljqQQUj@8+kIH?y4xYB3e}@J1b9O&WC35i{ z7OIz?xp!F9_P{)TqtA!22mbNwX;L3^_zyowwA9 zMhS1s+ek+?-jA#G#=MPk2hr*If|H|Fh>Ug4v@s}h_d2H-R9yJb8Ot@zpv?}?E< z$<`Q17JM9o_4L*lM7@r|yk6xi?N1*gcJem%F^=hX@U;DWAA^ppO5|c6Q@!-e^|9Js z>|c(Pj~P*)d|qWQ_AkfGuOn-Fx0&DZ8!@WmQx1_|;0}J2oYy%-UFk<nYAuj*CqFaQ_Qo*to*3|6ef>G!?|^?Rk1>l}>iYBT zMgu>1)Q{|XJMDu*!$(TV!OJ)idC-l#cxB6Y(!Qj|mCTdYN~)tg?DePF8P;2}scQqq z3hGq4{*tHcOKOhVG+x^Lb;*Yk6EehG<3{_egPU?1y)P|pB`*4v;$qz!V^ce*9b-Gh zHWr5X35F`+neuzfc!*88A#A8a9y@hTi5BJRoPtJO_A}X#E&aX(8ht=9bDcxn`W!T7 z@nI7i5u50%u!(pPBRqOXgM6ZIxBa*c@J|>b6Z1>wlwID3M3*oq7>@Uq;6V>^@Opj~ z9>pV?FpM!1!(7bjml~@yo`JJ;M4H(d`nGHex5zhz8*?Xpw(X~ID={syzr;ekoKwc! z!!|J$+YJk9g2ei7$@Z^83+ESJDyv zvxw3=38D^kVLRp<#IzbW?5%?vas{{XKIFHD+ju-vT+8E`-*W+r zMQ#Ucv!NYmKWN$)<5+dVFk%A@zbT0goybINb~8`Osd6s{T9hl;6dvlZA>Fd2@r+m* z&lK~9osY*ef0qn?@h%zoj^%v^>g+hjT<(|17PjG0-XKeVqffT|{{0Pp`HRk}yn(02 z2EK?5=lDWt_mF1qGs%{<(Wt*+!{mo{E^#fd1?&DstngDVLVvU4>Ti)x`t3P| z&Bu)o4D~nU>6hn^3v=HKMb_d?{%M||PJ4)%E+6uKl3#m88kix!)0{poyZjyZ)XtgK zvfv=Rl+NOsS|!2<1c00GglpD^f&T@pUXM698;&gQO=vN=Lt>wqAs^Q_L5KW zoiFg24{0x%W2dv1yeuo9BW;m=9B5tH_g0DenzICw3@_llO`!4$i>`e&Sg5ju&{M95EK$K0EBI zW0UqeVWoJm`Ob_TGPEmv89O`jcRFQS>W9!JU)!Y}MKjrSKRxOdO=}?OdQFg%4;stF zgWrYby5F4TBF%p%vU!wy`Op=M>DjoyIemh0j(X<6g_X>4oHMUc>NhXYut$jw<*54B zrqyp79pAUIPWcQC*&~?;y&CUClRRbAi5xo74NdC@jQO6yA_pzR^nls|+P2YH|4?!sg z{oL)zQ@!Wth{-W-Qobe6ud-!TLz}!Mk3sMe2PL}s=$aEbVx<&*yhBQLng@_&Elb(< z_Md^-G=J5;{<$ysv5{+~@4mcFLe})&{CO+MU(u(0!B6;2Hmw&qmR@{I=fS4@m7L9& z>3w|gP1)4g4&D4n{W9t7t-|hoD)%xy+1tu?HSSN*6boA9lj1at^B6Rp^I$TSXRHmZ zU#7Jtdd-i7A#JwNH_c~0{pq1kL&qL8u;8Ou&`%7M$kC_OH`N}I$KEZN{?53ur{^yy z+ur-89qKdapaR<}(beSk;|M(X6u*2PqfT<7#W7bjkM+4;K1Vrd_Ib~{@^6kgp^xxs zd;8Dch4-0HKldU>e3X+MyX=b(nC&4qExprw)}TlGrssF=%l%3?!lT%fSJa{J3s%A> z9k+JNF-unSC$i#Ksho?n9CIIS8h0M{m{g1U4fd^mth$b058xKvfidVKi*K~igJ=vr&|G}(hVLetp z9lLgW^ZNh4a%)FH7zm=PUx7UBs+>}!Ts!kJrC#7*c{v;b!F5R;Wv*eJ{)j8Kx1ra_ zV;}W%>{qTpPF!eh#0meY^IVLgJ#R-mc>c(R^w1aS)4K@uvBdl;{<0@uI6j9i3UyFq z58pLpDZdSj-$HQ_|EFZGk3kz){5F;eBRh;0Vp!>r4cYfPI;P|8hcFiJ_}mDHJvXwf z7dS*Q4pE=Qy^L+F&CYp3N;?*pR-UY*m2gJZ5K5Q|m=1$_Z}lC)k*Vm`rZVcM=hh6ue*cvO{B!xd-3*XPtZE3%O7A Ar2qf` literal 448588 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 diff --git a/Standalone/Research/OwnerShapeWorld/gpu_field_port/step14_capture_comparison.md b/Standalone/Research/OwnerShapeWorld/gpu_field_port/step14_capture_comparison.md new file mode 100644 index 0000000..dce244f --- /dev/null +++ b/Standalone/Research/OwnerShapeWorld/gpu_field_port/step14_capture_comparison.md @@ -0,0 +1,16 @@ +# Step 14 full-residency capture comparison + +All ten CPU/GPU pairs were captured after `[InitialClipmapReady]`. The files were compared numerically as RGB arrays and were not opened in an image viewer. + +| View | Size | RGB MAE | RGB RMSE | Changed pixels | Pixels max channel >32 | Max channel | +|---|---:|---:|---:|---:|---:|---:| +| chamber | 1280x800 | 0.6076 | 1.8655 | 42.6368% | 0.0183% | 124 | +| tunnel | 1280x800 | 0.6383 | 3.3799 | 31.7335% | 0.2772% | 130 | +| passage | 1280x800 | 1.6092 | 3.6878 | 50.4982% | 0.1733% | 52 | +| far | 1280x800 | 0.7909 | 2.1558 | 44.8325% | 0.0198% | 128 | +| passage_floor_closeup | 1280x800 | 0.9314 | 2.4800 | 43.0219% | 0.0500% | 100 | +| tunnel_bend | 1280x800 | 0.8129 | 2.1599 | 40.9629% | 0.0708% | 55 | +| remote_yaw0 | 1280x800 | 0.1994 | 2.6632 | 4.2472% | 0.2415% | 125 | +| remote_yaw90 | 1280x800 | 0.4083 | 4.3552 | 2.2432% | 0.6948% | 94 | +| remote_yaw180 | 1280x800 | 0.0484 | 1.3206 | 2.9787% | 0.0341% | 102 | +| remote_yaw270 | 1280x800 | 0.2355 | 3.1104 | 5.5593% | 0.4098% | 107 | diff --git a/Standalone/Research/OwnerShapeWorld/gpu_first_port/VoxelForgeGpuMesher.hlsl b/Standalone/Research/OwnerShapeWorld/gpu_first_port/VoxelForgeGpuMesher.hlsl index 6cd6a3f..1a75887 100644 --- a/Standalone/Research/OwnerShapeWorld/gpu_first_port/VoxelForgeGpuMesher.hlsl +++ b/Standalone/Research/OwnerShapeWorld/gpu_first_port/VoxelForgeGpuMesher.hlsl @@ -289,6 +289,80 @@ FarFieldSpatialBin FarFieldFindBin(float3 position) return emptyBin; } +void NearOwnerFractalPair(float x,float y,float z,int octaves, + out float standardValue,out float ridgedValue) +{ + float standardTotal=0.0f,ridgedTotal=0.0f,maxValue=0.0f; + float frequency=1.0f,amplitude=1.0f,weight=1.0f; + [loop] + for(int octave=0;octave0.0f))return 0.0f; + const float effectiveZ=verticalScale>0.0f&&verticalScale!=1.0f?z/verticalScale:z; + const float mainX=x*roughnessFrequency+VF_FieldVoxelSeedOffset(seed,11.3f); + const float mainY=y*roughnessFrequency+VF_FieldVoxelSeedOffset(seed,13.7f); + const float mainZ=effectiveZ*roughnessFrequency+VF_FieldVoxelSeedOffset(seed,17.1f); + float fineX=x*roughnessFrequency*3.0f+VF_FieldVoxelSeedOffset(seed,19.1f)+2000.0f; + float fineY=y*roughnessFrequency*3.0f+VF_FieldVoxelSeedOffset(seed,23.7f)+2500.0f; + float fineZ=effectiveZ*roughnessFrequency*3.0f+VF_FieldVoxelSeedOffset(seed,29.3f)+3000.0f; + float mx=mainX,my=mainY,mz=mainZ; + if(domainWarpStrength>0.0f) + { + const float wf=domainWarpFrequency,ws=domainWarpStrength; + float wx=VF_FieldPerlin3D(x*wf+VF_FieldVoxelSeedOffset(seed,5.2f), + y*wf+VF_FieldVoxelSeedOffset(seed,1.3f),effectiveZ*wf+VF_FieldVoxelSeedOffset(seed,9.7f)); + float wy=VF_FieldPerlin3D(x*wf+100.0f+VF_FieldVoxelSeedOffset(seed,7.7f), + y*wf+200.0f+VF_FieldVoxelSeedOffset(seed,3.1f),effectiveZ*wf+300.0f); + float wz=VF_FieldPerlin3D(x*wf+400.0f,y*wf+500.0f+VF_FieldVoxelSeedOffset(seed,11.9f), + effectiveZ*wf+600.0f+VF_FieldVoxelSeedOffset(seed,13.3f)); + wx*=1.25f*ws;wy*=1.25f*ws;wz*=1.25f*ws; + mx+=wx;my+=wy;mz+=wz; + fineX+=wx;fineY+=wy;fineZ+=wz; + } + float rough=0.0f,fine=0.0f; + if(noiseType==3u) + { + rough=VF_FieldOwnerCellular(mx,my,mz); + fine=VF_FieldOwnerCellular(fineX,fineY,fineZ); + } + else + { + float roughStandard,roughRidged,fineStandard,fineRidged; + NearOwnerFractalPair(mx,my,mz,3,roughStandard,roughRidged); + NearOwnerFractalPair(fineX,fineY,fineZ,2,fineStandard,fineRidged); + if(noiseType==1u) + { rough=roughRidged;fine=fineRidged; } + else if(noiseType==2u) + { + rough=(roughStandard+roughRidged)*0.5f; + fine=(fineStandard+fineRidged)*0.5f; + } + else + { rough=roughStandard;fine=fineStandard; } + } + return (rough+fine*0.4f)*1.25f*surfaceRoughness; +} + float NearOwnerRoughnessAtStep(float3 position,float surfaceSdf,float caveInfluence, FarFieldDetailLayer layer,uint anchorStep) { @@ -301,17 +375,17 @@ float NearOwnerRoughnessAtStep(float3 position,float surfaceSdf,float caveInflue float total; if(sampleZ1>sampleZ0) { - const float lower=VF_FieldOwnerRoughnessCore(position.x,position.y,sampleZ0, + const float lower=NearOwnerRoughnessCore(position.x,position.y,sampleZ0, FarFieldSeed,layer.surfaceRoughness,layer.roughnessFrequency,layer.verticalScale, layer.domainWarpStrength,layer.domainWarpFrequency,layer.roughnessNoiseType); - const float upper=VF_FieldOwnerRoughnessCore(position.x,position.y,sampleZ1, + const float upper=NearOwnerRoughnessCore(position.x,position.y,sampleZ1, FarFieldSeed,layer.surfaceRoughness,layer.roughnessFrequency,layer.verticalScale, layer.domainWarpStrength,layer.domainWarpFrequency,layer.roughnessNoiseType); const float alpha=(position.z-sampleZ0)/(sampleZ1-sampleZ0); total=lower+(upper-lower)*alpha; } else - total=VF_FieldOwnerRoughnessCore(position.x,position.y,position.z, + total=NearOwnerRoughnessCore(position.x,position.y,position.z, FarFieldSeed,layer.surfaceRoughness,layer.roughnessFrequency,layer.verticalScale, layer.domainWarpStrength,layer.domainWarpFrequency,layer.roughnessNoiseType); if(surfaceSdf<0.0f) @@ -324,9 +398,18 @@ float NearOwnerRoughness(float3 position,float surfaceSdf,float caveInfluence, float passageInfluence,FarFieldDetailLayer layer) { const float passage=saturate(passageInfluence); - const float anchored=NearOwnerRoughnessAtStep(position,surfaceSdf,caveInfluence,layer,8); + float anchored=0.0f,direct=0.0f; + [loop] + for(uint sampleIndex=0;sampleIndex<2;++sampleIndex) + { + if(sampleIndex==1&&passage<=0.40f)continue; + const uint anchorStep=sampleIndex==0?8u:2u; + const float value=NearOwnerRoughnessAtStep(position,surfaceSdf,caveInfluence, + layer,anchorStep); + if(sampleIndex==0)anchored=value; + else direct=value; + } if(passage<=0.40f)return anchored; - const float direct=NearOwnerRoughnessAtStep(position,surfaceSdf,caveInfluence,layer,2); if(passage>=0.60f)return direct; const float directWeight=VF_FieldSmoothUnit((passage-0.40f)/0.20f); const float anchoredWeight=1.0f-directWeight; diff --git a/Standalone/Source/StandaloneViewer.cpp b/Standalone/Source/StandaloneViewer.cpp index 04f4781..2e91cf6 100644 --- a/Standalone/Source/StandaloneViewer.cpp +++ b/Standalone/Source/StandaloneViewer.cpp @@ -1491,6 +1491,7 @@ namespace bool bGpuFarShaderPrewarm=false,bDisableGpuWarmupPresentHold=false; bool bGpuFarWarmupResourcesOnly=false; bool bGpuFarWarmupNormalPriority=false,bGpuFarWarmupBeforeWorkers=false; + bool bGpuFarWarmupKernelFences=false; bool bGpuFarWarmupOnly=false; std::string GpuWarmupEntryFilter; std::thread GpuShaderWarmupThread; @@ -1897,6 +1898,7 @@ float3 Lit=Rock*(Ambient+0.88*Diffuse)+float3(0.50,0.69,0.82)*Head*0.75; } bGpuShaderWarmupQueueSucceeded=VoxelForgeGpuFarViewer::QueueFarShaderWarmup( Device,Context,GpuFarShaderPath,!bGpuFarWarmupResourcesOnly,GpuWarmupEntryFilter, + bGpuFarWarmupKernelFences, GpuShaderWarmupQueueError); }); std::printf("[GpuShaderWarmup] queue_thread=started overlap=%s\n", @@ -5620,6 +5622,8 @@ int main(int Argc,char** Argv) App.bGpuFarEnabled=true,App.bGpuFarShaderPrewarm=true,App.bGpuFarWarmupBeforeWorkers=true, App.bShapeWorld=true,App.bForceGenerate=true,App.bPresentCpuFrameBeforeGpu=true, App.bHoldCpuFrameDuringGpuWarmup=true; + else if(Arg=="--gpu-far-warmup-kernel-fences") + App.bGpuFarWarmupKernelFences=true; else if(Arg=="--gpu-far-warmup-only") App.bGpuFarEnabled=true,App.bGpuFarShaderPrewarm=true,App.bGpuFarWarmupOnly=true, App.bShapeWorld=true,App.bForceGenerate=true; @@ -5891,7 +5895,7 @@ int main(int Argc,char** Argv) const auto WarmupOnlyStart=std::chrono::steady_clock::now(); std::string WarmupError; if(!VoxelForgeGpuFarViewer::QueueFarShaderWarmup(App.Device,App.Context,App.GpuFarShaderPath, - true,App.GpuWarmupEntryFilter,WarmupError)) + true,App.GpuWarmupEntryFilter,App.bGpuFarWarmupKernelFences,WarmupError)) {std::fprintf(stderr,"[GpuShaderWarmupError] queue: %s\n",WarmupError.c_str());return 5;} if(!VoxelForgeGpuFarViewer::CompleteFarShaderWarmup(App.Device,App.Context, App.GpuFarShaderPath,WarmupError))