// ==UserScript==
// @name 2D跨域优化系统 - HyperGPU Pro版 (Wasm深度协同版)
// @namespace http://tampermonkey.net/
// @version 3.3.8
// @description 高性能GPU加速处理系统,优先使用GPU,深度集成WebAssembly核心计算模块以最大化硬件加速效果,实现Wasm与GPU的预处理/后处理协同。
// @author KiwiFruit, Assistant
// @match *://*/*
// @grant none
// @license MIT
// ==/UserScript==
(function () {
'use strict';
/* global GPUBufferUsage,GPUShaderStage,GPUMapMode */
// --- 新增:Wasm 模块的 Base64 编码 ---
// *********************************************************************************
// ****** 请将下面双引号内的内容替换为您自己生成的 hypergpu_wasm_core_bg.wasm ******
// ****** 的 Base64 编码字符串。它应该是一个非常长的字符串。 ******
// *********************************************************************************
const WASM_BASE64 = `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Njg3ODg4OTkwOTE5MjkzOTQ5NTk2OTc5ODk5YXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPj0gc2l6ZSArIG1pbl9vdmVyaGVhZAAAAAAQACoAAACwBAAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IHBzaXplIDw9IHNpemUgKyBtYXhfb3ZlcmhlYWQAAAAAEAAqAAAAtgQAAA0AAABMYXp5IGluc3RhbmNlIGhhcyBwcmV2aW91c2x5IGJlZW4gcG9pc29uZWQAAEACEAAqAAAAKgAQAGcAAAAIAwAAGQAAAHJlZW50cmFudCBpbml0AACEAhAADgAAACoAEABnAAAAegIAAA0AAAAAQayFwAALHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAA1wcEbmFtZQAYF2h5cGVyZ3B1X3dhc21fY29yZS53YXNtAY4HFQFQY29yZTo6Zm10OjpudW06OmltcDo6PGltcGwgY29yZTo6Zm10OjpEaXNwbGF5IGZvciB1c2l6ZT46OmZtdDo6aDY2ODNiMjBjNzEyMDg5YWICEGdhdXNzaWFuX2JsdXJfMWQDEW11bHRpcGx5X21hdHJpY2VzBBBub3JtYWxpemVfdmVjdG9yBQ1mZnRfYnV0dGVyZmx5BhB1cGRhdGVfcGFydGljbGVzB0NzdGQ6OnBhbmlja2luZzo6YmVnaW5fcGFuaWNfaGFuZGxlcjo6e3tjbG9zdXJlfX06OmhkNmMxYjJkOTM5MjIzMWFjCDdzdGQ6OnBhbmlja2luZzo6cnVzdF9wYW5pY193aXRoX2hvb2s6Omg0ZmEzZGFlYWQ5YzRlMGE3CTZjb3JlOjpwYW5pY2tpbmc6OnBhbmljX2JvdW5kc19jaGVjazo6aDBkYjQ4YTIyMzlmN2FhNGMKEXJnYmFfdG9fZ3JheXNjYWxlCwthZGRfdmVjdG9ycwwLZG90X3Byb2R1Y3QND2FwcGx5X3RocmVzaG9sZA5DY29yZTo6Zm10OjpGb3JtYXR0ZXI6OnBhZF9pbnRlZ3JhbDo6d3JpdGVfcHJlZml4OjpoN2UxMzQ0ZDgzNmI1ODZjNQ8tY29yZTo6cGFuaWNraW5nOjpwYW5pY19mbXQ6OmhkMzA1MmEzNjYyZDUwYzk1ECxfX3J1c3RjWzUyMjRlNmI4MWNkODJhOGZdOjpydXN0X2JlZ2luX3Vud2luZBE5Y29yZTo6b3BzOjpmdW5jdGlvbjo6Rm5PbmNlOjpjYWxsX29uY2U6OmgxNTUzN2Y1OTkyYWE4YzFiEm88c3RkOjpwYW5pY2tpbmc6OmJlZ2luX3BhbmljX2hhbmRsZXI6OlN0YXRpY1N0clBheWxvYWQgYXMgY29yZTo6cGFuaWM6OlBhbmljUGF5bG9hZD46OmFzX3N0cjo6aDQ1ODMyOGY3NGYwNmE5ZWETNGNvcmU6OnBhbmljOjpQYW5pY1BheWxvYWQ6OmFzX3N0cjo6aDA2ODQ3MWY4NTY1OWU4ZDQUQnN0ZDo6c3lzOjpiYWNrdHJhY2U6Ol9fcnVzdF9lbmRfc2hvcnRfYmFja3RyYWNlOjpoNTlkNmM0MDJlNDBhMTY4NRUlX19ydXN0Y1s1MjI0ZTZiODFjZDgyYThmXTo6cnVzdF9wYW5pYwcSAQAPX19zdGFja19wb2ludGVyCRECAAcucm9kYXRhAQUuZGF0YQBwCXByb2R1Y2VycwIIbGFuZ3VhZ2UBBFJ1c3QADHByb2Nlc3NlZC1ieQMFcnVzdGMdMS44OS4wICgyOTQ4Mzg4M2UgMjAyNS0wOC0wNCkGd2FscnVzBjAuMjMuMwx3YXNtLWJpbmRnZW4HMC4yLjEwMACUAQ90YXJnZXRfZmVhdHVyZXMIKwtidWxrLW1lbW9yeSsPYnVsay1tZW1vcnktb3B0KxZjYWxsLWluZGlyZWN0LW92ZXJsb25nKwptdWx0aXZhbHVlKw9tdXRhYmxlLWdsb2JhbHMrE25vbnRyYXBwaW5nLWZwdG9pbnQrD3JlZmVyZW5jZS10eXBlcysIc2lnbi1leHQ=`;
// --- 新增结束 ---
/**
* 双向链表实现(用于LRU缓存)
*/
class DoublyLinkedList {
constructor() {
this.head = null;
this.tail = null;
this.size = 0;
this.nodes = new Map();
}
add(key) {
const node = { key, prev: null, next: null };
if (this.size === 0) {
this.head = node;
this.tail = node;
} else {
node.prev = this.tail;
this.tail.next = node;
this.tail = node;
}
this.nodes.set(key, node);
this.size++;
return node;
}
remove(node) {
if (!node) return false;
if (node.prev) {
node.prev.next = node.next;
} else {
this.head = node.next;
}
if (node.next) {
node.next.prev = node.prev;
} else {
this.tail = node.prev;
}
this.nodes.delete(node.key);
this.size--;
return true;
}
removeOldest() {
if (this.head) {
const key = this.head.key;
this.remove(this.head);
return key;
}
return null;
}
moveToTail(node) {
if (node === this.tail) return;
this.remove(node);
this.add(node.key);
}
getSize() {
return this.size;
}
}
/**
* 优先级队列实现
*/
class PriorityQueue {
constructor(maxSize = 1000) {
this.items = [];
this.maxSize = maxSize;
}
enqueue(item) {
if (this.items.length >= this.maxSize) {
this.items.sort((a, b) => a.priority - b.priority);
this.items.shift();
}
this.items.push(item);
this.bubbleUp(this.items.length - 1);
}
dequeue() {
if (this.items.length === 0) return null;
const min = this.items[0];
const end = this.items.pop();
if (this.items.length > 0) {
this.items[0] = end;
this.bubbleDown(0);
}
return min;
}
size() {
return this.items.length;
}
bubbleUp(index) {
const element = this.items[index];
while (index > 0) {
const parentIndex = Math.floor((index - 1) / 2);
const parent = this.items[parentIndex];
if (element.priority >= parent.priority) break;
this.items[index] = parent;
this.items[parentIndex] = element;
index = parentIndex;
}
}
bubbleDown(index) {
const element = this.items[index];
const length = this.items.length;
while (true) {
const leftChildIndex = 2 * index + 1;
const rightChildIndex = 2 * index + 2;
let leftChild, rightChild;
let swap = null;
if (leftChildIndex < length) {
leftChild = this.items[leftChildIndex];
if (leftChild.priority < element.priority) {
swap = leftChildIndex;
}
}
if (rightChildIndex < length) {
rightChild = this.items[rightChildIndex];
if (
(swap === null && rightChild.priority < element.priority) ||
(swap !== null && rightChild.priority < leftChild.priority)
) {
swap = rightChildIndex;
}
}
if (swap === null) break;
this.items[index] = this.items[swap];
this.items[swap] = element;
index = swap;
}
}
}
/**
* 高性能GPU加速处理系统 - Wasm GPU 深度协同优化版
* 优先使用GPU,深度集成WebAssembly核心计算模块,实现预处理/后处理协同
*/
class OptimizedGPUAccelerator {
constructor() {
// 系统状态监控
this.metrics = {
memory: { current: 0, peak: 0, threshold: 3 * 1024 * 1024 * 1024 }, // 3GB阈值
gpu: { load: 0, queueSize: 0, maxConcurrent: 8 },
scheduler: { activeTasks: 0, queueSize: 0, completed: 0, failed: 0 }
};
// 优化后的任务调度器
this.scheduler = {
queue: new PriorityQueue(1000),
active: new Map(),
maxConcurrent: 180,
processing: false,
lastCleanup: Date.now()
};
// 优化后的缓存系统
this.cache = {
storage: new Map(),
maxSize: 512 * 1024 * 1024, // 512MB缓存限制
currentSize: 0,
cleanupInterval: null,
accessStats: new Map(),
lruQueue: new DoublyLinkedList()
};
// GPU资源管理优化
this.gpu = {
device: null,
context: null,
shaderCache: new Map(),
compilationQueue: new PriorityQueue(50),
activeCompilations: 0,
maxCompilations: 5
};
// --- 新增:Wasm 模块实例 ---
this.wasm = null;
// --- 新增结束 ---
// 初始化系统
this.init();
}
async init() {
await this.initGPU();
// --- 新增:加载 Wasm 模块 ---
try {
if (WASM_BASE64 && WASM_BASE64.length > 1000) { // 简单校验
console.log("正在加载 WebAssembly 核心模块...");
// 1. Base64 解码
const wasmArrayBuffer = Uint8Array.from(atob(WASM_BASE64), c => c.charCodeAt(0));
// 2. 实例化 Wasm 模块
const wasmModule = await WebAssembly.instantiate(wasmArrayBuffer);
this.wasm = wasmModule.instance.exports; // 存储导出的函数
console.log("✅ WebAssembly 核心模块加载成功。");
} else {
console.warn("⚠️ WebAssembly Base64 字符串无效或未找到。");
}
} catch (e) {
console.error("❌ 加载 WebAssembly 模块时出错:", e);
this.wasm = null; // 确保在失败时为 null
}
// --- Wasm 加载结束 ---
this.cache.cleanupInterval = setInterval(() => {
this.aggressiveCacheCleanup();
}, 60 * 1000); // 每分钟清理一次
this.startMemoryMonitor();
this.processSchedulerQueue();
}
// 优化后的GPU初始化
async initGPU() {
try {
// 尝试WebGPU
if (navigator.gpu) {
const adapter = await navigator.gpu.requestAdapter();
if (adapter) {
this.gpu.device = await adapter.requestDevice();
this.gpu.context = 'webgpu';
console.log("WebGPU initialized successfully.");
return;
}
}
// 降级到WebGL
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl2') || canvas.getContext('webgl');
if (gl) {
this.gpu.context = 'webgl';
this.gpu.device = gl;
console.log("WebGL initialized successfully.");
return;
}
// 最终降级
this.gpu.context = 'cpu';
console.log("Falling back to CPU processing.");
} catch (e) {
console.error('GPU初始化失败:', e);
this.gpu.context = 'cpu';
}
}
// 优化后的任务调度
async scheduleTask(task) {
if (this.scheduler.queue.size() >= 1000) {
throw new Error('任务队列已满,请稍后重试');
}
if (this.metrics.memory.current > this.metrics.memory.threshold * 0.9) {
this.emergencyMemoryCleanup();
}
const priority = this.calculatePriority(task);
this.scheduler.queue.enqueue({
...task,
id: this.generateId(),
priority,
createdAt: Date.now(),
state: 'queued'
});
if (!this.scheduler.processing) {
this.processSchedulerQueue();
}
return task.id;
}
// --- 修改:优化后的优先级计算,提升 GPU 相关任务优先级 ---
calculatePriority(task) {
let priority = 0;
// 提升 GPU 友好任务的优先级
switch (task.type) {
case 'video': priority += 120; break; // 最高优先级
case 'image': priority += 100; break;
case 'matrix': priority += 80; break; // 矩阵运算通常适合 GPU
case 'vector': priority += 70; break; // 向量运算也适合 GPU/Wasm
// --- 新增:为新任务类型设置优先级 ---
case 'signal': priority += 60; break; // FFT 等信号处理
case 'physics': priority += 50; break; // 物理模拟
// --- 新增结束 ---
default: priority += 10;
}
priority -= Math.min(task.size / (1024 * 1024), 100); // 大任务稍微降级
if (task.createdAt) {
const waitTime = Date.now() - task.createdAt;
priority += Math.min(waitTime / 1000, 50); // 等待时间长的提升优先级
}
// 如果系统负载高,略微降低所有任务优先级
if (this.metrics.scheduler.activeTasks > this.scheduler.maxConcurrent * 0.8) {
priority -= 20;
}
// 如果是 GPU 任务且 GPU 负载低,可以稍微提升
if ((task.type === 'matrix' || task.type === 'image') && this.gpu.context !== 'cpu' && this.metrics.gpu.load < 5) {
priority += 10;
}
return Math.max(0, Math.min(200, priority)); // 限制在 0-200 范围内
}
// --- 修改结束 ---
// 优化后的队列处理
async processSchedulerQueue() {
if (this.scheduler.processing) return;
this.scheduler.processing = true;
try {
while (this.scheduler.queue.size() > 0 &&
this.scheduler.active.size < this.scheduler.maxConcurrent) {
const task = this.scheduler.queue.dequeue();
if (!task) break;
if (this.metrics.memory.current > this.metrics.memory.threshold * 0.95) {
this.scheduler.queue.enqueue(task);
break;
}
this.executeTask(task);
}
} finally {
this.scheduler.processing = false;
}
}
// 优化后的任务执行
async executeTask(task) {
const taskId = task.id;
this.scheduler.active.set(taskId, task);
this.metrics.scheduler.activeTasks++;
try {
const cached = this.getFromCache(task.key);
if (cached) {
this.completeTask(taskId, cached);
return;
}
const gpuResources = await this.prepareGPUResources(task);
const result = await this.processWithGPU(task, gpuResources);
// 缓存较小的结果
if (result && typeof result.size === 'number' && result.size < 10 * 1024 * 1024) {
this.addToCache(task.key, result);
}
this.completeTask(taskId, result);
} catch (error) {
console.error(`任务 ${taskId} 执行失败:`, error);
this.failTask(taskId, error);
} finally {
this.scheduler.active.delete(taskId);
this.metrics.scheduler.activeTasks--;
this.processSchedulerQueue();
}
}
getFromCache(key) {
const item = this.cache.storage.get(key);
if (item) {
this.cache.lruQueue.moveToTail(item.node);
return item.value;
}
return null;
}
// 优化后的GPU资源准备
async prepareGPUResources(task) {
const shaderKey = this.getShaderKey(task);
if (this.gpu.shaderCache.has(shaderKey)) {
return this.gpu.shaderCache.get(shaderKey);
}
if (this.gpu.activeCompilations >= this.gpu.maxCompilations) {
await new Promise(resolve => {
const checkInterval = setInterval(() => {
if (this.gpu.activeCompilations < this.gpu.maxCompilations) {
clearInterval(checkInterval);
resolve();
}
}, 100);
});
}
this.gpu.activeCompilations++;
try {
const shader = await this.compileShaderWithTimeout(task, 5000);
this.gpu.shaderCache.set(shaderKey, shader);
return shader;
} finally {
this.gpu.activeCompilations--;
}
}
// 带超时的着色器编译
async compileShaderWithTimeout(task, timeoutMs) {
return Promise.race([
this.actualCompileShader(task),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('着色器编译超时')), timeoutMs)
)
]);
}
// 实际着色器编译
async actualCompileShader(task) {
if (this.gpu.context === 'webgpu') {
return this.compileWebGPUShader(task);
} else if (this.gpu.context === 'webgl') {
return this.compileWebGLShader(task);
} else {
// CPU 降级时,可以标记使用 Wasm (如果可用)
if (this.wasm && (task.type === 'matrix' || task.type === 'vector')) {
return { type: 'cpu_wasm_ready' };
}
return this.compileCPUShader(task);
}
}
// 模拟不同GPU的编译方法 (您已实现)
async compileWebGPUShader(task) {
// 这里应包含实际的WebGPU编译逻辑
console.log('编译WebGPU着色器:', task);
return { compiled: true, type: 'webgpu' };
}
async compileWebGLShader(task) {
// 这里应包含实际的WebGL编译逻辑
console.log('编译WebGL着色器:', task);
return { compiled: true, type: 'webgl' };
}
async compileCPUShader(task) {
// 这里应包含CPU模拟的逻辑
console.log('使用CPU处理任务:', task);
return { result: 'CPU_SIMULATED', type: 'cpu' };
}
// --- 新增:使用 Wasm 执行向量加法 ---
async processVectorAddWithWasm(task) {
if (!this.wasm || !this.wasm.add_vectors) {
throw new Error("Wasm add_vectors function not available.");
}
const dataA = task.dataA || task.data; // 支持 dataA 或 data
const dataB = task.dataB || new Float32Array(dataA.length).fill(1.0); // 默认值或从task获取
if (!(dataA instanceof Float32Array) || !(dataB instanceof Float32Array)) {
throw new Error("Task data for vector add must be Float32Array.");
}
const len = dataA.length;
if (len !== dataB.length) {
throw new Error("DataA and DataB must have the same length.");
}
const bytesPerF32 = 4;
const alignment = 4;
const totalBytes = ((len * bytesPerF32 * 3) + (alignment - 1)) & ~(alignment - 1);
const sharedBuffer = new ArrayBuffer(totalBytes);
const offsetA = 0;
const offsetB = len;
const offsetResult = len * 2;
const viewA = new Float32Array(sharedBuffer, offsetA * bytesPerF32, len);
const viewB = new Float32Array(sharedBuffer, offsetB * bytesPerF32, len);
const viewResult = new Float32Array(sharedBuffer, offsetResult * bytesPerF32, len);
viewA.set(dataA);
viewB.set(dataB);
this.wasm.add_vectors(
offsetA * bytesPerF32,
offsetB * bytesPerF32,
offsetResult * bytesPerF32,
len
);
const resultData = new Float32Array(viewResult);
return {
data: resultData,
size: resultData.byteLength,
processedBy: 'wasm_cpu'
};
}
// --- 新增结束 ---
// --- 新增:使用 Wasm 执行矩阵乘法 ---
async processMatrixMultiplyWithWasm(task) {
if (!this.wasm || !this.wasm.multiply_matrices) {
throw new Error("Wasm multiply_matrices function not available.");
}
const dataA = task.dataA;
const dataB = task.dataB;
if (!(dataA instanceof Float32Array) || !(dataB instanceof Float32Array)) {
throw new Error("Task data for matrix multiply must be Float32Array.");
}
const n = Math.sqrt(dataA.length);
if (n * n !== dataA.length || n * n !== dataB.length) {
throw new Error("DataA and DataB must represent square matrices of the same size.");
}
const sharedBuffer = new ArrayBuffer(n * n * 4 * 3); // 3 matrices
const bytesPerF32 = 4;
const viewA = new Float32Array(sharedBuffer, 0, n * n);
const viewB = new Float32Array(sharedBuffer, n * n * bytesPerF32, n * n);
const viewResult = new Float32Array(sharedBuffer, 2 * n * n * bytesPerF32, n * n);
viewA.set(dataA);
viewB.set(dataB);
this.wasm.multiply_matrices(0, n * n * bytesPerF32, 2 * n * n * bytesPerF32, n);
const resultData = new Float32Array(viewResult);
return {
data: resultData,
size: resultData.byteLength,
processedBy: 'wasm_cpu'
};
}
// --- 新增结束 ---
// --- 新增:使用 Wasm 执行图像灰度转换 ---
async processImageGrayscaleWithWasm(task) {
if (!this.wasm || !this.wasm.rgba_to_grayscale) {
throw new Error("Wasm rgba_to_grayscale function not available.");
}
const rgbaData = task.rgbaData || task.data; // 支持 rgbaData 或 data
if (!(rgbaData instanceof Float32Array) || rgbaData.length % 4 !== 0) {
throw new Error("Task rgbaData must be a Float32Array with length multiple of 4.");
}
const pixelCount = rgbaData.length / 4;
const sharedBuffer = new ArrayBuffer(rgbaData.byteLength + pixelCount * 4); // RGBA + Gray
const bytesPerF32 = 4;
const viewRgba = new Float32Array(sharedBuffer, 0, rgbaData.length);
const viewGray = new Float32Array(sharedBuffer, rgbaData.byteLength, pixelCount);
viewRgba.set(rgbaData);
this.wasm.rgba_to_grayscale(0, rgbaData.byteLength, pixelCount);
const grayData = new Float32Array(viewGray);
return {
grayData,
size: grayData.byteLength,
processedBy: 'wasm_cpu'
};
}
// --- 新增结束 ---
// --- 新增:使用 Wasm 执行向量点积 ---
async processVectorDotProductWithWasm(task) {
if (!this.wasm || !this.wasm.dot_product) {
throw new Error("Wasm dot_product function not available.");
}
const dataA = task.dataA || task.data;
const dataB = task.dataB;
if (!(dataA instanceof Float32Array) || !(dataB instanceof Float32Array)) {
throw new Error("Task data for vector dot product must be Float32Array.");
}
const len = dataA.length;
if (len !== dataB.length) {
throw new Error("DataA and DataB must have the same length for dot product.");
}
const bytesPerF32 = 4;
const alignment = 4;
// 计算所需内存大小并进行对齐
const totalBytes = ((len * bytesPerF32 * 2) + (alignment - 1)) & ~(alignment - 1);
const sharedBuffer = new ArrayBuffer(totalBytes);
const viewA = new Float32Array(sharedBuffer, 0, len);
const viewB = new Float32Array(sharedBuffer, len * bytesPerF32, len);
viewA.set(dataA);
viewB.set(dataB);
// 调用 Wasm 函数
const result = this.wasm.dot_product(0, len * bytesPerF32, len);
// 点积返回一个标量值,我们将其包装在对象中返回
return {
result, // 这是一个 f32 数值
size: 4, // 一个 f32 的大小
processedBy: 'wasm_cpu'
};
}
// --- 新增结束 ---
// --- 新增:使用 Wasm 执行 FFT 蝶形运算 ---
// 注意:这通常是一个步骤,完整的 FFT 需要在 JS 中协调多次调用
async processFFTButterflyWithWasm(task) {
if (!this.wasm || !this.wasm.fft_butterfly) {
throw new Error("Wasm fft_butterfly function not available.");
}
// 假设 task.data 是包含复数的 Float32Array (实, 虚, 实, 虚, ...)
// task.outputData 是输出缓冲区 (可以是同一个数组的不同视图或新数组)
// task.pointIndex, task.twiddleRe, task.twiddleIm, task.stride 是参数
const inputData = task.data;
const outputData = task.outputData || new Float32Array(inputData.length);
const pointIndex = task.pointIndex || 0;
const twiddleRe = task.twiddleRe || 1.0;
const twiddleIm = task.twiddleIm || 0.0;
const stride = task.stride || 1;
if (!(inputData instanceof Float32Array) || !(outputData instanceof Float32Array)) {
throw new Error("Task data for FFT must be Float32Array.");
}
if (inputData.length !== outputData.length) {
throw new Error("Input and output data must have the same length for FFT.");
}
const bytesPerF32 = 4;
const totalBytes = inputData.byteLength + outputData.byteLength;
const sharedBuffer = new ArrayBuffer(totalBytes);
const inputOffset = 0;
const outputOffset = inputData.byteLength;
const viewInput = new Float32Array(sharedBuffer, inputOffset, inputData.length);
const viewOutput = new Float32Array(sharedBuffer, outputOffset, outputData.length);
viewInput.set(inputData);
// outputData 初始值会被 Wasm 覆盖,所以设置与否不重要
// 调用 Wasm 函数
this.wasm.fft_butterfly(inputOffset, outputOffset, pointIndex, twiddleRe, twiddleIm, stride);
// 从共享内存复制结果
outputData.set(viewOutput);
return {
outputData,
size: outputData.byteLength,
processedBy: 'wasm_cpu'
};
}
// --- 新增结束 ---
// --- 新增:使用 Wasm 执行图像高斯模糊 (1D) ---
async processImageGaussianBlur1DWithWasm(task) {
if (!this.wasm || !this.wasm.gaussian_blur_1d) {
throw new Error("Wasm gaussian_blur_1d function not available.");
}
// 假设 task.rgbaData 是 RGBA 图像数据
// task.kernel 是高斯核 Float32Array
// task.width 是图像宽度
// task.channel 是要处理的通道 (0-3)
const rgbaData = task.rgbaData || task.data;
const kernel = task.kernel;
const width = task.width;
const channel = task.channel !== undefined ? task.channel : 0; // 默认处理 R 通道
if (!(rgbaData instanceof Float32Array) || !(kernel instanceof Float32Array)) {
throw new Error("Task rgbaData and kernel must be Float32Array.");
}
if (kernel.length % 2 === 0) {
throw new Error("Kernel size must be odd.");
}
// 简单验证宽度
if (rgbaData.length !== width * 4) {
console.warn("RGBA data length does not match width * 4. Processing as a single row.");
// 或者抛出错误,取决于设计
}
const bytesPerF32 = 4;
const totalBytes = rgbaData.byteLength + kernel.byteLength + rgbaData.byteLength; // 输入 + 核 + 输出
const sharedBuffer = new ArrayBuffer(totalBytes);
const inputOffset = 0;
const kernelOffset = rgbaData.byteLength;
const outputOffset = kernelOffset + kernel.byteLength;
const viewInput = new Float32Array(sharedBuffer, inputOffset, rgbaData.length);
const viewKernel = new Float32Array(sharedBuffer, kernelOffset, kernel.length);
const viewOutput = new Float32Array(sharedBuffer, outputOffset, rgbaData.length);
viewInput.set(rgbaData);
viewKernel.set(kernel);
// 调用 Wasm 函数
this.wasm.gaussian_blur_1d(inputOffset, outputOffset, width, kernelOffset, kernel.length, channel);
// 从共享内存复制结果
const resultData = new Float32Array(viewOutput);
return {
resultData, // 返回处理后的整行数据
size: resultData.byteLength,
processedBy: 'wasm_cpu'
};
}
// --- 新增结束 ---
// --- 新增:使用 Wasm 执行粒子系统更新 ---
async processUpdateParticlesWithWasm(task) {
if (!this.wasm || !this.wasm.update_particles) {
throw new Error("Wasm update_particles function not available.");
}
// 假设 task.positions, task.velocities, task.accelerations 是 Float32Array
// task.particleCount 是粒子数
// task.deltaTime 是时间步长
const positions = task.positions;
const velocities = task.velocities;
const accelerations = task.accelerations;
const particleCount = task.particleCount || (positions.length / 2);
const deltaTime = task.deltaTime || 0.016; // 默认 ~60fps
if (!(positions instanceof Float32Array) ||
!(velocities instanceof Float32Array) ||
!(accelerations instanceof Float32Array)) {
throw new Error("Task positions, velocities, and accelerations must be Float32Array.");
}
if (positions.length !== velocities.length || velocities.length !== accelerations.length) {
throw new Error("Positions, velocities, and accelerations arrays must have the same length.");
}
if (positions.length !== particleCount * 2) {
throw new Error("Array lengths must be 2 * particleCount.");
}
const bytesPerF32 = 4;
const totalBytes = (positions.byteLength + velocities.byteLength + accelerations.byteLength);
const sharedBuffer = new ArrayBuffer(totalBytes);
const posOffset = 0;
const velOffset = positions.byteLength;
const accOffset = velOffset + velocities.byteLength;
const viewPositions = new Float32Array(sharedBuffer, posOffset, positions.length);
const viewVelocities = new Float32Array(sharedBuffer, velOffset, velocities.length);
const viewAccelerations = new Float32Array(sharedBuffer, accOffset, accelerations.length);
viewPositions.set(positions);
viewVelocities.set(velocities);
viewAccelerations.set(accelerations);
// 调用 Wasm 函数
this.wasm.update_particles(posOffset, velOffset, accOffset, particleCount, deltaTime);
// 从共享内存复制更新后的数据
positions.set(viewPositions);
velocities.set(viewVelocities);
// accelerations 通常不变,不需要复制回来
// 返回更新后的数据(通常调用者持有原始引用,所以不需要返回)
// 但为了接口一致性,可以返回一个确认对象
return {
result: { positions, velocities }, // 将其封装为一个属性
size: positions.byteLength + velocities.byteLength,
processedBy: 'wasm_cpu'
};
}
// --- 新增结束 ---
// --- 修改:优化后的任务处理,优先 GPU,集成 Wasm 协同 ---
async processWithGPU(task, gpuResources) {
// --- 修改:优先使用 GPU ---
if (this.gpu.context === 'webgpu') {
return await this.processWithWebGPU(task, gpuResources);
} else if (this.gpu.context === 'webgl') {
return await this.processWithWebGL(task, gpuResources);
} else {
// CPU 降级处理路径
if (this.wasm) {
try {
console.log("🚀 CPU降级,尝试使用 WebAssembly 处理任务:", task.type, task.operation);
if (task.type === 'vector' && task.operation === 'add') {
return await this.processVectorAddWithWasm(task);
} else if (task.type === 'matrix' && task.operation === 'multiply') {
return await this.processMatrixMultiplyWithWasm(task);
} else if (task.type === 'image' && task.operation === 'grayscale') {
return await this.processImageGrayscaleWithWasm(task);
}
// --- 新增:处理新的 Wasm 任务 ---
else if (task.type === 'vector' && task.operation === 'dot_product') {
return await this.processVectorDotProductWithWasm(task);
} else if (task.type === 'signal' && task.operation === 'fft_butterfly') {
return await this.processFFTButterflyWithWasm(task);
} else if (task.type === 'image' && task.operation === 'gaussian_blur_1d') {
return await this.processImageGaussianBlur1DWithWasm(task);
} else if (task.type === 'physics' && task.operation === 'update_particles') {
return await this.processUpdateParticlesWithWasm(task);
}
// --- 新增结束 ---
console.log("ℹ️ 无匹配的 Wasm 实现,继续到 JS CPU 模拟。");
} catch (e) {
console.error("Wasm 处理出错,回退到 JS CPU:", e);
}
}
console.log("🐢 使用 JS CPU 模拟处理任务:", task.type);
return this.processWithCPU(task, gpuResources);
}
}
// --- 修改结束 ---
// --- 修改:WebGPU 处理,集成 Wasm 预处理/后处理 ---
async processWithWebGPU(task, gpuResources) {
console.log('使用WebGPU资源执行任务:', task.type, task.operation);
let processedData = task.data;
let preprocessedBy = null;
let postprocessedBy = null;
let finalResultData, finalResultSize;
// --- 新增:Wasm 预处理 ---
// 示例:对向量数据进行预处理 (标准化)
if (this.wasm && task.type === 'vector' && task.needsWasmPreprocess) {
try {
console.log(" -> 使用 Wasm 进行数据预处理 (标准化)...");
const len = processedData.length;
const sharedBuffer = new ArrayBuffer(len * 4 * 2); // 原数据 + 结果
const viewIn = new Float32Array(sharedBuffer, 0, len);
const viewOut = new Float32Array(sharedBuffer, len * 4, len);
viewIn.set(processedData);
// 假设 Wasm 有一个 normalize_vector 函数 (需要在 Rust 中实现并导出)
if (this.wasm.normalize_vector) {
this.wasm.normalize_vector(0, len * 4, len);
processedData = new Float32Array(viewOut);
preprocessedBy = 'wasm';
console.log(" -> Wasm 预处理完成。");
} else {
console.warn(" -> Wasm normalize_vector 函数不可用。");
}
} catch (e) {
console.error(" -> Wasm 预处理失败:", e);
}
}
// --- Wasm 预处理结束 ---
// --- 原有 WebGPU 核心逻辑 (模拟) ---
// *********************************************************************************
// ****** 这里应该包含实际的 WebGPU API 调用代码。 ******
// ****** 例如:创建缓冲区、着色器模块、绑定组、管道、编码器、命令缓冲区等。******
// ****** 目前是模拟代码。 ******
// *********************************************************************************
console.log(' -> 执行 WebGPU 核心计算 (模拟)...');
// 实际的 WebGPU API 调用代码
let gpuResultData = new Float32Array(1000); // 默认结果
let gpuResultSize = gpuResultData.byteLength;
try {
// 检查 WebGPU 支持
if (!navigator.gpu) {
throw new Error('WebGPU not supported');
}
// 请求适配器和设备
const adapter = await navigator.gpu.requestAdapter();
if (!adapter) {
throw new Error('No appropriate GPUAdapter found');
}
const device = await adapter.requestDevice();
// 创建缓冲区
const inputBuffer = device.createBuffer({
size: processedData.byteLength,
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
mappedAtCreation: true
});
new Float32Array(inputBuffer.getMappedRange()).set(processedData);
inputBuffer.unmap();
const outputBuffer = device.createBuffer({
size: gpuResultData.byteLength,
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC
});
const resultBuffer = device.createBuffer({
size: gpuResultData.byteLength,
usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST
});
// 简单的计算着色器代码 (需要根据实际需求调整)
const shaderCode = `
@group(0) @binding(0) var<storage, read> input: array<f32>;
@group(0) @binding(1) var<storage, read_write> output: array<f32>;
@compute @workgroup_size(1)
fn main(@builtin(global_invocation_id) global_id: vec3<u32>) {
let index = global_id.x;
if (index < arrayLength(&input)) {
output[index] = input[index] * 2.0; // 示例计算
}
}
`;
// 创建着色器模块
const shaderModule = device.createShaderModule({
code: shaderCode
});
// 创建绑定组布局和绑定组
const bindGroupLayout = device.createBindGroupLayout({
entries: [
{
binding: 0,
visibility: GPUShaderStage.COMPUTE,
buffer: {
type: 'read-only-storage'
}
},
{
binding: 1,
visibility: GPUShaderStage.COMPUTE,
buffer: {
type: 'storage'
}
}
]
});
const bindGroup = device.createBindGroup({
layout: bindGroupLayout,
entries: [
{
binding: 0,
resource: {
buffer: inputBuffer
}
},
{
binding: 1,
resource: {
buffer: outputBuffer
}
}
]
});
// 创建管道布局和计算管道
const pipelineLayout = device.createPipelineLayout({
bindGroupLayouts: [bindGroupLayout]
});
const computePipeline = device.createComputePipeline({
layout: pipelineLayout,
compute: {
module: shaderModule,
entryPoint: 'main'
}
});
// 创建命令编码器和计算通道
const commandEncoder = device.createCommandEncoder();
const computePass = commandEncoder.beginComputePass();
computePass.setPipeline(computePipeline);
computePass.setBindGroup(0, bindGroup);
computePass.dispatchWorkgroups(Math.ceil(processedData.length / 64));
computePass.end();
// 复制结果到可读缓冲区
commandEncoder.copyBufferToBuffer(outputBuffer, 0, resultBuffer, 0, gpuResultData.byteLength);
// 提交命令
const commandBuffer = commandEncoder.finish();
device.queue.submit([commandBuffer]);
// 读取结果
await resultBuffer.mapAsync(GPUMapMode.READ);
const result = resultBuffer.getMappedRange();
gpuResultData = new Float32Array(result);
resultBuffer.unmap();
gpuResultSize = gpuResultData.byteLength;
} catch (e) {
console.error(' -> WebGPU 计算失败:', e);
}
// --- 原有 WebGPU 核心逻辑结束 ---
// --- 新增:Wasm 后处理 ---
// 示例:对 GPU 计算结果进行后处理 (应用阈值)
if (this.wasm && task.type === 'vector' && task.needsWasmPostprocess) {
try {
console.log(" -> 使用 Wasm 进行结果后处理 (应用阈值)...");
const len = gpuResultData.length;
const sharedBuffer = new ArrayBuffer(len * 4 * 2);
const viewIn = new Float32Array(sharedBuffer, 0, len);
const viewOut = new Float32Array(sharedBuffer, len * 4, len);
viewIn.set(gpuResultData);
// 假设 Wasm 有一个 apply_threshold 函数 (需要在 Rust 中实现并导出)
if (this.wasm.apply_threshold) {
const threshold = task.threshold || 0.5;
// 简化处理:假设阈值通过共享内存传递或在 Wasm 内部处理
// 这里直接调用,具体实现取决于 Wasm 函数签名
this.wasm.apply_threshold(0, len * 4, len);
gpuResultData = new Float32Array(viewOut);
gpuResultSize = gpuResultData.byteLength;
postprocessedBy = 'wasm';
console.log(" -> Wasm 后处理完成。");
} else {
console.warn(" -> Wasm apply_threshold 函数不可用。");
}
} catch (e) {
console.error(" -> Wasm 后处理失败:", e);
}
}
// --- Wasm 后处理结束 ---
finalResultData = gpuResultData;
finalResultSize = gpuResultSize;
return {
data: finalResultData,
size: finalResultSize,
processedBy: 'webgpu',
preprocessedBy: preprocessedBy,
postprocessedBy: postprocessedBy
};
}
// --- 修改结束 ---
// --- 修改:WebGL 处理,集成 Wasm 预处理/后处理 (逻辑同 WebGPU) ---
async processWithWebGL(task, gpuResources) {
console.log('使用WebGL资源执行任务:', task.type, task.operation);
let processedData = task.data;
let preprocessedBy = null;
let postprocessedBy = null;
let finalResultData, finalResultSize;
// --- 新增:Wasm 预处理 (示例) ---
if (this.wasm && task.type === 'image' && task.needsWasmPreprocess) {
try {
console.log(" -> 使用 Wasm 进行 WebGL 数据预处理 (灰度转换)...");
// 直接调用已有的 Wasm 灰度转换函数作为预处理示例
const grayTask = { rgbaData: processedData };
const grayResult = await this.processImageGrayscaleWithWasm(grayTask);
processedData = grayResult.grayData;
preprocessedBy = 'wasm';
console.log(" -> Wasm WebGL 预处理完成。");
} catch (e) {
console.error(" -> Wasm WebGL 预处理失败:", e);
}
}
// --- Wasm 预处理结束 ---
// --- 原有 WebGL 核心逻辑 (模拟) ---
// *********************************************************************************
// ****** 这里应该包含实际的 WebGL API 调用代码。 ******
// ****** 例如:创建着色器、程序、缓冲区、纹理、帧缓冲区,绘制调用等。 ******
// ****** 目前是模拟代码。 ******
// *********************************************************************************
console.log(' -> 执行 WebGL 核心渲染/计算 (模拟)...');
// 实际的 WebGL API 调用代码
let glResultData = new Float32Array(500); // 默认结果
let glResultSize = glResultData.byteLength;
try {
// 创建 WebGL2 上下文
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl2');
if (!gl) {
throw new Error('WebGL2 not supported');
}
// 顶点着色器源码
const vertexShaderSource = `#version 300 es
in vec4 a_position;
void main() {
gl_Position = a_position;
}
`;
// 片段着色器源码 (需要根据实际需求调整)
const fragmentShaderSource = `#version 300 es
precision highp float;
out vec4 outColor;
void main() {
outColor = vec4(1.0, 0.0, 0.0, 1.0); // 红色
}
`;
// 创建着色器函数
function createShader(gl, type, source) {
const shader = gl.createShader(type);
gl.shaderSource(shader, source);
gl.compileShader(shader);
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
console.error('着色器编译失败:', gl.getShaderInfoLog(shader));
gl.deleteShader(shader);
return null;
}
return shader;
}
// 创建程序函数
function createProgram(gl, vertexShader, fragmentShader) {
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
console.error('程序链接失败:', gl.getProgramInfoLog(program));
gl.deleteProgram(program);
return null;
}
return program;
}
// 创建着色器和程序
const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
const program = createProgram(gl, vertexShader, fragmentShader);
if (!program) {
throw new Error('无法创建 WebGL 程序');
}
// 使用程序
gl.useProgram(program);
// 创建顶点数据 (示例)
const positions = new Float32Array([
0.0, 0.0,
0.0, 0.5,
0.5, 0.0
]);
// 创建缓冲区
const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);
// 获取顶点属性位置
const positionAttributeLocation = gl.getAttribLocation(program, 'a_position');
// 启用顶点属性数组
gl.enableVertexAttribArray(positionAttributeLocation);
// 设置顶点属性指针
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);
// 清除画布
gl.clearColor(0, 0, 0, 0);
gl.clear(gl.COLOR_BUFFER_BIT);
// 绘制
gl.drawArrays(gl.TRIANGLES, 0, 3);
// 读取像素 (示例)
const pixels = new Float32Array(500);
gl.readPixels(0, 0, canvas.width, canvas.height, gl.RGBA, gl.FLOAT, pixels);
glResultData = pixels;
glResultSize = glResultData.byteLength;
} catch (e) {
console.error(' -> WebGL 渲染/计算失败:', e);
}
// --- 原有 WebGL 核心逻辑结束 ---
// --- 新增:Wasm 后处理 (示例) ---
if (this.wasm && task.type === 'vector' && task.needsWasmPostprocess) { // 用 vector 任务举例后处理
try {
console.log(" -> 使用 Wasm 进行 WebGL 结果后处理 (向量加法)...");
// 用一个常量向量与结果相加作为后处理示例
const addTask = { dataA: glResultData, dataB: new Float32Array(glResultData.length).fill(0.1) };
const addResult = await this.processVectorAddWithWasm(addTask);
glResultData = addResult.data;
glResultSize = addResult.size;
postprocessedBy = 'wasm';
console.log(" -> Wasm WebGL 后处理完成。");
} catch (e) {
console.error(" -> Wasm WebGL 后处理失败:", e);
}
}
// --- Wasm 后处理结束 ---
finalResultData = glResultData;
finalResultSize = glResultSize;
return {
data: finalResultData,
size: finalResultSize,
processedBy: 'webgl',
preprocessedBy: preprocessedBy,
postprocessedBy: postprocessedBy
};
}
// --- 修改结束 ---
async processWithCPU(task, gpuResources) {
// 这里应包含使用CPU资源执行计算的核心逻辑
console.log('使用CPU资源执行任务:', task, gpuResources);
// 模拟一个结果
return {
data: "CPU processed result",
size: 20,
processedBy: 'cpu'
};
}
// 优化后的缓存系统
addToCache(key, value) {
// 改进:更准确的缓存大小计算
const size = this.calculateSize(value);
if (size > this.cache.maxSize * 0.1) {
console.warn("Object too large to cache:", key, size);
return false;
}
while (this.cache.currentSize + size > this.cache.maxSize) {
if (!this.evictFromCache()) break;
}
const node = this.cache.lruQueue.add(key);
this.cache.storage.set(key, {
value,
size,
timestamp: Date.now(),
node: node
});
this.cache.currentSize += size;
return true;
}
// 优化后的缓存清理
aggressiveCacheCleanup() {
const now = Date.now();
const targetSize = this.cache.maxSize * 0.7;
while (this.cache.currentSize > targetSize && this.cache.lruQueue.getSize() > 0) {
this.evictFromCache();
}
for (const [key, item] of this.cache.storage) {
if (now - item.timestamp > 30 * 60 * 1000) {
this.removeFromCache(key);
}
}
}
// 缓存驱逐
evictFromCache() {
if (this.cache.lruQueue.getSize() === 0) return false;
const key = this.cache.lruQueue.removeOldest();
return this.removeFromCache(key);
}
// 从缓存移除
removeFromCache(key) {
const item = this.cache.storage.get(key);
if (!item) return false;
this.cache.storage.delete(key);
this.cache.currentSize -= item.size;
this.cache.lruQueue.remove(item.node);
return true;
}
// 紧急内存清理
emergencyMemoryCleanup() {
console.warn('触发紧急内存清理');
const targetSize = this.cache.maxSize * 0.5;
while (this.cache.currentSize > targetSize && this.cache.lruQueue.getSize() > 0) {
this.evictFromCache();
}
// 增强健壮性:检查 window.gc 是否存在
if (typeof window.gc === 'function') {
try {
window.gc();
} catch(e) {
console.warn("Manual GC not available or failed:", e);
}
} else {
console.warn("Manual GC (window.gc) is not available in this environment.");
}
const lowPriorityTasks = [];
while (this.scheduler.queue.size() > 0) {
const task = this.scheduler.queue.dequeue();
if (task && task.priority < 50) {
this.metrics.scheduler.failed++;
} else if (task) {
lowPriorityTasks.push(task);
}
}
lowPriorityTasks.forEach(task => this.scheduler.queue.enqueue(task));
}
// 内存监控 (增强健壮性)
startMemoryMonitor() {
setInterval(() => {
// 检查 performance.memory 是否可用
if (window.performance && window.performance.memory) {
try {
this.metrics.memory.current = window.performance.memory.usedJSHeapSize;
this.metrics.memory.peak = Math.max(
this.metrics.memory.peak,
this.metrics.memory.current
);
} catch (e) {
console.warn("Error accessing performance.memory:", e);
}
} else {
// Fallback: 使用一个简单的估计或标记为不可用
this.metrics.memory.current = this.cache.currentSize + 100 * 1024 * 1024; // 假设基础内存100MB
console.warn("performance.memory API not available. Using fallback estimation.");
}
if (this.metrics.memory.current > this.metrics.memory.threshold * 0.9) {
this.emergencyMemoryCleanup();
}
}, 5000);
}
// 辅助方法
generateId() {
return Date.now().toString(36) + Math.random().toString(36).substr(2);
}
// 改进:更准确的缓存大小计算
calculateSize(obj) {
// 优先处理TypedArray等二进制数据
if (obj && typeof obj === 'object' && obj.buffer && obj.BYTES_PER_ELEMENT) {
return obj.byteLength || 0;
}
// 处理ArrayBuffer
if (obj instanceof ArrayBuffer) {
return obj.byteLength || 0;
}
// 处理普通对象 (注意:这可能很慢且不精确)
try {
return JSON.stringify(obj).length * 2; // 粗略估算
} catch (e) {
console.warn("Could not calculate size for object, defaulting to 0:", e);
return 0;
}
}
getShaderKey(task) {
return `${task.type}_${task.operation}_${task.version || '1'}`;
}
completeTask(taskId, result) {
this.metrics.scheduler.completed++;
if (this.scheduler.active.has(taskId)) {
const task = this.scheduler.active.get(taskId);
if (task.onComplete) task.onComplete(result);
}
}
failTask(taskId, error) {
this.metrics.scheduler.failed++;
if (this.scheduler.active.has(taskId)) {
const task = this.scheduler.active.get(taskId);
if (task.onError) task.onError(error);
}
}
// 系统状态报告 (可选:添加 Wasm 状态)
getSystemStatus() {
const baseStatus = {
memory: {
current: this.formatBytes(this.metrics.memory.current),
peak: this.formatBytes(this.metrics.memory.peak),
threshold: this.formatBytes(this.metrics.memory.threshold),
usage: (this.metrics.memory.current / this.metrics.memory.threshold * 100).toFixed(1) + '%'
},
scheduler: {
activeTasks: this.metrics.scheduler.activeTasks,
queueSize: this.scheduler.queue.size(),
completed: this.metrics.scheduler.completed,
failed: this.metrics.scheduler.failed,
successRate: (this.metrics.scheduler.completed /
(this.metrics.scheduler.completed + this.metrics.scheduler.failed || 1) * 100).toFixed(1) + '%'
},
gpu: {
context: this.gpu.context,
load: this.metrics.gpu.load,
queueSize: this.gpu.compilationQueue.size(),
shaderCacheSize: this.gpu.shaderCache.size
},
cache: {
currentSize: this.formatBytes(this.cache.currentSize),
maxSize: this.formatBytes(this.cache.maxSize),
usage: (this.cache.currentSize / this.cache.maxSize * 100).toFixed(1) + '%',
itemCount: this.cache.storage.size
}
};
// --- 可选:添加 Wasm 状态 ---
if (this.wasm) {
baseStatus.wasm = {
loaded: true,
functions: Object.keys(this.wasm).length
};
} else {
baseStatus.wasm = { loaded: false };
}
// --- 可选结束 ---
return baseStatus;
}
formatBytes(bytes) {
if (bytes === 0) return '0 Bytes';
const k = 1024;
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}
}
// ==================== 主系统启动 ====================
// --- 在这里设置开关:1为开启,0为关闭 ---
const ENABLE_MONITOR_PANEL = 0; // 改为 1 则显示面板
// ---------------------------------------
(async () => {
try {
const system = new OptimizedGPUAccelerator();
// 只有在开关开启时,才创建和更新监控面板
if (ENABLE_MONITOR_PANEL) {
// 创建性能监控面板
const monitorPanel = document.createElement('div');
monitorPanel.style.cssText = `
position: fixed;
bottom: 10px;
right: 10px;
background: rgba(0, 0, 0, 0.8);
color: #00ff00;
font-family: 'Courier New', monospace;
padding: 10px;
border-radius: 5px;
z-index: 9999;
font-size: 12px;
max-width: 300px;
max-height: 400px;
overflow-y: auto;
`;
document.body.appendChild(monitorPanel);
// 每秒更新一次状态
setInterval(() => {
const status = system.getSystemStatus();
let wasmInfo = '';
if (status.wasm && status.wasm.loaded) {
wasmInfo = `<div><b>Wasm:</b> 已加载 (${status.wasm.functions} 函数)</div>`;
} else {
wasmInfo = `<div><b>Wasm:</b> 未加载</div>`;
}
monitorPanel.innerHTML = `
<h4 style="margin:0 0 5px 0;">HyperGPU Pro - 状态</h4>
<div><b>内存:</b> ${status.memory.current} (${status.memory.usage})</div>
<div><b>缓存:</b> ${status.cache.currentSize}/${status.cache.maxSize}</div>
<div><b>任务:</b> ${status.scheduler.activeTasks}运行, ${status.scheduler.queueSize}排队</div>
<div><b>GPU:</b> ${status.gpu.context}</div>
<div><b>成功率:</b> ${status.scheduler.successRate}</div>
${wasmInfo}
`;
}, 1000);
}
// --- 更新模拟任务添加,测试 GPU 优先和 Wasm 协同 ---
let taskCounter = 0;
setInterval(() => {
taskCounter++;
const rand = Math.random();
if (rand < 0.25) {
// 25% 概率:添加一个需要 GPU 处理的矩阵任务 (可能带协同)
system.scheduleTask({
type: 'matrix',
operation: 'multiply',
dataA: new Float32Array(256).map(() => Math.random()), // 16x16 矩阵
dataB: new Float32Array(256).map(() => Math.random()),
needsWasmPreprocess: taskCounter % 2 === 0, // 偶数次需要预处理
needsWasmPostprocess: taskCounter % 3 === 0, // 每3次需要后处理
size: 256 * 4 * 2
}).catch(console.error);
} else if (rand < 0.45) {
// 20% 概率:添加一个需要 GPU 处理的图像任务 (可能带协同)
// 定义 rgbaData
const rgbaData = new Float32Array(Array.from({ length: 40000 }, () => Math.random() * 100 / 100));
// 调用 scheduleTask 方法
system.scheduleTask({
type: 'image',
operation: 'filter', // 假设 WebGL 会处理 filter
data: rgbaData, // 将 rgbaData 作为 data 属性传递
needsWasmPreprocess: taskCounter % 4 === 0, // 偶数次需要灰度预处理
needsWasmPostprocess: taskCounter % 5 === 0, // 5的倍数需要后处理
size: 40000 * 4
}).catch(console.error);
} else if (rand < 0.6) {
// 15% 概率:添加一个纯 Wasm 任务 (CPU 降级时处理)
system.scheduleTask({
type: 'vector',
operation: 'add',
dataA: new Float32Array(1000).map((_, i) => Math.sin(i * 0.1) + Math.cos(taskCounter * 0.05)),
dataB: new Float32Array(1000).map((_, i) => Math.cos(i * 0.2) + Math.sin(taskCounter * 0.03)),
size: 1000 * 4 * 2
}).catch(console.error);
} else if (rand < 0.7) {
// 10% 概率:添加一个 Wasm 矩阵任务 (CPU 降级时处理)
system.scheduleTask({
type: 'matrix',
operation: 'multiply',
dataA: new Float32Array(144).map(() => Math.random() * 2 - 1), // 12x12 矩阵
dataB: new Float32Array(144).map(() => Math.random() * 2 - 1),
size: 144 * 4 * 2
}).catch(console.error);
} else if (rand < 0.8) {
// 10% 概率:添加一个 Wasm 图像任务 (CPU 降级时处理)
system.scheduleTask({
type: 'image',
operation: 'grayscale',
rgbaData: new Float32Array(10000).map(() => Math.random()), // 50x50 RGBA 图像
size: 10000 * 4
}).catch(console.error);
} else if (rand < 0.85) {
// 5% 概率:添加一个 Wasm 向量点积任务
system.scheduleTask({
type: 'vector',
operation: 'dot_product',
dataA: new Float32Array(500).map(() => Math.random()),
dataB: new Float32Array(500).map(() => Math.random()),
size: 500 * 4 * 2
}).catch(console.error);
} else if (rand < 0.9) {
// 5% 概率:添加一个 FFT 蝶形运算任务 (示例)
const fftSize = 128; // 必须是2的幂
const complexData = new Float32Array(fftSize * 2);
for(let i = 0; i < fftSize * 2; i++) {
complexData[i] = Math.random() * 2 - 1; // 随机复数
}
system.scheduleTask({
type: 'signal',
operation: 'fft_butterfly',
complexData,
pointIndex: Math.floor(Math.random() * fftSize / 2),
twiddleRe: Math.cos(Math.PI / 4), // 示例旋转因子
twiddleIm: Math.sin(Math.PI / 4),
stride: fftSize / 2,
size: complexData.byteLength
}).catch(console.error);
} else if (rand < 0.95) {
// 5% 概率:添加一个粒子更新任务
const particleCount = 100;
const positions = new Float32Array(particleCount * 2);
const velocities = new Float32Array(particleCount * 2);
const accelerations = new Float32Array(particleCount * 2);
for(let i = 0; i < particleCount * 2; i++) {
positions[i] = Math.random() * 100;
velocities[i] = (Math.random() - 0.5) * 2;
accelerations[i] = (Math.random() - 0.5) * 0.1; // 微弱重力或力
}
system.scheduleTask({
type: 'physics',
operation: 'update_particles',
positions: positions,
velocities: velocities,
accelerations: accelerations,
particleCount: particleCount,
deltaTime: 0.016,
size: positions.byteLength * 3
}).catch(console.error);
} else {
// 5% 概率:添加一个通用任务
// 添加一个通用任务
system.scheduleTask({
type: 'generic',
operation: 'process',
data: `Generic task data ${taskCounter}`, // 使用 data 属性存储模板字符串
size: 50
}).catch(console.error);
}
}, 2000); // 每2秒添加任务
// --- 模拟任务结束 ---
console.log('🚀 2D跨域优化系统 - HyperGPU Pro版 (Wasm GPU 深度协同版) 已启动。');
} catch (error) {
console.error('系统初始化失败:', error);
}
})();
})();