diff --git a/CHANGELOG.md b/CHANGELOG.md index 03dd142..6aa9505 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +### PCB layout + +- Honor explicit `PCB_LAYOUT_SUBTREE_WORKERS`, `PCB_BOARD_PACKER_THREADS` and `PCB_POST_PLACE_THREADS` values up to the number of logical cores instead of clamping them to the default. The default stays at half the logical cores, at most 8. Requires a backend that applies the same rule. + ## 1.3.2 - 2026-10-16 ### Schematic fixes diff --git a/docs/local-development.md b/docs/local-development.md index 333bfb1..325347d 100644 --- a/docs/local-development.md +++ b/docs/local-development.md @@ -37,7 +37,7 @@ npm run test:package --workspace=mcp Для локального запуска используйте `node /absolute/path/easyeda-copilot/mcp/dist/index.js`. `npx easyeda-copilot-mcp` запускает опубликованный пакет, а не рабочую копию. -При вызове `make_pcb_layout` MCP задаёт `PCB_LAYOUT_SUBTREE_WORKERS` по половине доступных логических ядер, с пределом 8 и минимумом 1. Локальный backend использует отдельные процессы для независимых блоков; `0` отключает этот пул. Общий поиск платы и независимые геометрические оценки используют потоки Rust: `PCB_BOARD_PACKER_THREADS` по умолчанию также использует половину доступных ядер, максимум 8. Фактическое число работников ограничено числом независимых задач. Оба значения можно переопределить в окружении. `PCB_BOARD_PACKER_PROFILE=1` включает раздельные таймеры поиска, локального улучшения и исправления пересечений. После обновления нужно пересобрать native backend, MCP/скилл и перезапустить демон; опубликованная версия backend может ещё не содержать эти изменения. +При вызове `make_pcb_layout` MCP задаёт `PCB_LAYOUT_SUBTREE_WORKERS` по половине доступных логических ядер, с пределом 8 и минимумом 1. Локальный backend использует отдельные процессы для независимых блоков; `0` отключает этот пул. Общий поиск платы и независимые геометрические оценки используют потоки Rust: `PCB_BOARD_PACKER_THREADS` по умолчанию также использует половину доступных ядер, максимум 8. Фактическое число работников ограничено числом независимых задач. Оба значения можно переопределить в окружении; явное значение может превышать 8, но не число логических ядер. `PCB_BOARD_PACKER_PROFILE=1` включает раздельные таймеры поиска, локального улучшения и исправления пересечений. После обновления нужно пересобрать native backend, MCP/скилл и перезапустить демон; опубликованная версия backend может ещё не содержать эти изменения. ## Переход к релизу без публикации diff --git a/mcp/src/tools/pcb/pcb-layout.ts b/mcp/src/tools/pcb/pcb-layout.ts index 9ad8550..0c11ed5 100644 --- a/mcp/src/tools/pcb/pcb-layout.ts +++ b/mcp/src/tools/pcb/pcb-layout.ts @@ -243,10 +243,12 @@ async function runPcbLayout( context.setStage('placing'); // The published backend reads this setting when it creates its subtree pool. - const workerLimit = Math.max(1, Math.min(8, Math.floor(availableParallelism() / 2))); + // Default to half the logical cores (at most 8); an explicit override may use every core. + const cores = availableParallelism(); + const workerLimit = Math.max(1, Math.min(8, Math.floor(cores / 2))); for (const name of ['PCB_LAYOUT_SUBTREE_WORKERS', 'PCB_BOARD_PACKER_THREADS', 'PCB_POST_PLACE_THREADS']) { const configured = Number(process.env[name] ?? workerLimit); - process.env[name] = String(Number.isFinite(configured) ? Math.min(workerLimit, Math.max(0, Math.floor(configured))) : workerLimit); + process.env[name] = String(Number.isFinite(configured) ? Math.min(cores, Math.max(0, Math.floor(configured))) : workerLimit); } const result = await generatePcbLayout(input, { ...apiOptions,