From 014881027da404e9975503aff8f955a9c7c75d3f Mon Sep 17 00:00:00 2001 From: Max Podkorytov <4273004+tenpercent@users.noreply.github.com> Date: Tue, 13 Jan 2026 18:38:57 -0600 Subject: [PATCH 1/3] add the skill for running a docker container with correct options; build and run tests in the container --- .claude/skills/ck-docker | 309 ++++++++++++++++++++++++++++++++++++ .claude/skills/ck-docker.md | 76 +++++++++ 2 files changed, 385 insertions(+) create mode 100755 .claude/skills/ck-docker create mode 100644 .claude/skills/ck-docker.md diff --git a/.claude/skills/ck-docker b/.claude/skills/ck-docker new file mode 100755 index 00000000000..83250d8f111 --- /dev/null +++ b/.claude/skills/ck-docker @@ -0,0 +1,309 @@ +#!/bin/bash +# CK Docker Skill - Build and test composable_kernel in Docker with ROCm support + +set -e + +# Find project root (where .git directory is) +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" + +# Detect git branch and sanitize for docker naming (replace / and special chars with _) +GIT_BRANCH=$(cd "${PROJECT_ROOT}" && git rev-parse --abbrev-ref HEAD 2>/dev/null | tr '/' '_' | tr -cd 'a-zA-Z0-9_-') + +# Default container name: ck__ +DEFAULT_NAME="ck_${USER}_${GIT_BRANCH}" +CONTAINER_NAME="${CK_CONTAINER_NAME:-${DEFAULT_NAME}}" + +# Help message +show_help() { + cat << EOF +CK Docker Skill - Build and test composable_kernel in Docker + +Usage: ck-docker [options] + +Commands: + start [name] Start Docker container + build [target] [--name] Build target + test [options] Run test + shell [name] Open shell in container + status [name] Check container status + stop [name] Stop and remove container + rebuild-cmake [name] Reconfigure CMake from scratch + +Examples: + ck-docker start + ck-docker build test_amdgcn_mma + ck-docker test test_amdgcn_mma --gtest_filter=*Fp16* + ck-docker shell + +Environment: + CK_CONTAINER_NAME - Override default container name (default: ck__) +EOF +} + +# Detect GPU target +detect_gpu() { + local container=$1 + docker exec ${container} bash -c " + rocminfo 2>/dev/null | grep -oP 'gfx[0-9a-z]+' | head -1 || echo 'gfx950' + " | tr -d '\r\n' +} + +# Start container +cmd_start() { + local name="${1:-${CONTAINER_NAME}}" + + if docker ps -a -f name=${name} | grep -q ${name}; then + if docker ps -f name=${name} | grep -q ${name}; then + echo "Container '${name}' is already running" + return 0 + else + echo "Starting existing container '${name}'..." + docker start ${name} + echo "Container started" + return 0 + fi + fi + + echo "Creating new Docker container '${name}'..." + docker run -d \ + --name ${name} \ + --device=/dev/kfd --device=/dev/dri \ + --security-opt seccomp=unconfined \ + --group-add video \ + -v "${PROJECT_ROOT}":/workspace \ + -w /workspace \ + rocm/composable_kernel:ck_ub24.04_rocm7.0.1 \ + tail -f /dev/null + + echo "Container '${name}' started successfully" + docker exec ${name} bash -c "echo 'Working directory:' && pwd" +} + +# Build target +cmd_build() { + local target="" + local name="${CONTAINER_NAME}" + + while [[ $# -gt 0 ]]; do + case $1 in + --name) + name="$2" + shift 2 + ;; + *) + target="$1" + shift + ;; + esac + done + + if ! docker ps -f name=${name} | grep -q ${name}; then + echo "Container '${name}' not running. Starting..." + cmd_start ${name} + fi + + if ! docker exec ${name} test -f /workspace/build/build.ninja 2>/dev/null; then + echo "Detecting GPU target..." + local gpu_target=$(detect_gpu ${name}) + + echo "Configuring build with CMake for GPU target: ${gpu_target}" + docker exec ${name} bash -c " + cd /workspace && + rm -rf build && + mkdir build && + cd build && + cmake .. -GNinja \ + -DGPU_TARGETS=${gpu_target} \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_CXX_COMPILER=/opt/rocm/llvm/bin/clang++ \ + -DBUILD_TESTING=ON 2>&1 | tail -30 + " + fi + + if [ -z "$target" ]; then + echo "Building all configured targets..." + else + echo "Building target: ${target}" + fi + + docker exec ${name} bash -c " + cd /workspace/build && + ninja ${target} 2>&1 + " + + echo "Build complete" +} + +# Run test +cmd_test() { + local test_name="" + local name="${CONTAINER_NAME}" + local test_options="" + + while [[ $# -gt 0 ]]; do + case $1 in + --name) + name="$2" + shift 2 + ;; + --gtest_*|--help) + test_options="${test_options} $1" + shift + ;; + *) + if [ -z "$test_name" ]; then + test_name="$1" + else + test_options="${test_options} $1" + fi + shift + ;; + esac + done + + if [ -z "$test_name" ]; then + echo "Error: test_name required" + echo "Usage: ck-docker test [--name container_name] [gtest_options]" + return 1 + fi + + if ! docker ps -f name=${name} | grep -q ${name}; then + echo "Error: Container '${name}' not running" + echo "Start it with: ck-docker start --name ${name}" + return 1 + fi + + if ! docker exec ${name} test -f "/workspace/build/bin/${test_name}" 2>/dev/null; then + echo "Test executable not found. Building ${test_name}..." + cmd_build ${test_name} --name ${name} + fi + + echo "Running: ${test_name} ${test_options}" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + docker exec ${name} bash -c " + cd /workspace/build && + ./bin/${test_name} ${test_options} + " +} + +# Shell +cmd_shell() { + local name="${1:-${CONTAINER_NAME}}" + + if ! docker ps -f name=${name} | grep -q ${name}; then + echo "Container '${name}' not running. Starting..." + cmd_start ${name} + fi + + echo "Opening shell in '${name}' (type 'exit' to leave)..." + docker exec -it ${name} bash +} + +# Status +cmd_status() { + local name="${1:-}" + + if [ -z "$name" ]; then + echo "Composable Kernel Docker Containers:" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + docker ps -a --filter "ancestor=rocm/composable_kernel:ck_ub24.04_rocm7.0.1" \ + --format "table {{.Names}}\t{{.Status}}\t{{.CreatedAt}}" || echo "No containers found" + else + if docker ps -f name=${name} | grep -q ${name}; then + echo "Container '${name}' is RUNNING" + docker ps -f name=${name} --format "table {{.Names}}\t{{.Status}}\t{{.Image}}" + echo "" + echo "GPU Information:" + docker exec ${name} bash -c "rocm-smi --showproductname 2>/dev/null | head -10 || echo 'No GPU detected'" + elif docker ps -a -f name=${name} | grep -q ${name}; then + echo "Container '${name}' exists but is STOPPED" + echo "Start with: ck-docker start ${name}" + else + echo "Container '${name}' does NOT exist" + echo "Create with: ck-docker start ${name}" + fi + fi +} + +# Stop +cmd_stop() { + local name="${1:-${CONTAINER_NAME}}" + + if docker ps -a -f name=${name} | grep -q ${name}; then + echo "Stopping and removing container '${name}'..." + docker stop ${name} 2>/dev/null || true + docker rm ${name} 2>/dev/null || true + echo "Container stopped and removed" + else + echo "Container '${name}' does not exist" + fi +} + +# Rebuild CMake +cmd_rebuild_cmake() { + local name="${1:-${CONTAINER_NAME}}" + + if ! docker ps -f name=${name} | grep -q ${name}; then + echo "Container '${name}' not running. Starting..." + cmd_start ${name} + fi + + echo "Detecting GPU target..." + local gpu_target=$(detect_gpu ${name}) + + echo "Reconfiguring CMake from scratch in '${name}' for GPU target: ${gpu_target}" + docker exec ${name} bash -c " + cd /workspace && + rm -rf build && + mkdir build && + cd build && + cmake .. -GNinja \ + -DGPU_TARGETS=${gpu_target} \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_CXX_COMPILER=/opt/rocm/llvm/bin/clang++ \ + -DBUILD_TESTING=ON 2>&1 | tail -30 + " + echo "CMake configuration complete for ${gpu_target}" +} + +# Main command dispatcher +case "${1:-}" in + start) + shift + cmd_start "$@" + ;; + build) + shift + cmd_build "$@" + ;; + test) + shift + cmd_test "$@" + ;; + shell) + shift + cmd_shell "$@" + ;; + status) + shift + cmd_status "$@" + ;; + stop) + shift + cmd_stop "$@" + ;; + rebuild-cmake) + shift + cmd_rebuild_cmake "$@" + ;; + help|--help|-h) + show_help + ;; + *) + echo "Unknown command: ${1:-}" + echo "" + show_help + exit 1 + ;; +esac diff --git a/.claude/skills/ck-docker.md b/.claude/skills/ck-docker.md new file mode 100644 index 00000000000..8c9887a5ccd --- /dev/null +++ b/.claude/skills/ck-docker.md @@ -0,0 +1,76 @@ +# ck-docker + +Build and test composable_kernel in Docker with ROCm support. + +## Terminal Usage + +Direct command-line usage: + +```bash +# From composable_kernel directory +.claude/skills/ck-docker start +.claude/skills/ck-docker build test_amdgcn_mma +.claude/skills/ck-docker test test_amdgcn_mma --gtest_filter=*Fp16* +.claude/skills/ck-docker status +.claude/skills/ck-docker shell + +# Or add to PATH +export PATH="$PATH:$PWD/.claude/skills" +ck-docker start +``` + +## Ask Claude + +Just ask in natural language: +- "Start the docker container" +- "Build test_amdgcn_mma" +- "Run test_amdgcn_mma with filter *Fp16*" +- "Check container status" +- "Open a shell in the container" + +## Commands + +``` +ck-docker start [name] Start Docker container +ck-docker build [target] Build target +ck-docker test [options] Run test +ck-docker shell [name] Interactive shell +ck-docker status [name] Check status +ck-docker stop [name] Stop container +ck-docker rebuild-cmake [name] Reconfigure CMake +``` + +## Configuration + +- **Image**: rocm/composable_kernel:ck_ub24.04_rocm7.0.1 +- **GPU**: Auto-detected via rocminfo (fallback: gfx950) +- **Compiler**: /opt/rocm/llvm/bin/clang++ +- **Build**: Ninja + CMake (Release) +- **Mount**: Current directory → /workspace +- **Container Name**: Auto-generated as `ck__` to avoid clashes + +## Environment + +```bash +export CK_CONTAINER_NAME=my_build # Override default container name +``` + +## Examples + +```bash +# Start container +ck-docker start + +# Build and run test +ck-docker build test_amdgcn_mma +ck-docker test test_amdgcn_mma + +# Custom container +ck-docker start my_build +ck-docker build test_amdgcn_mma --name my_build +ck-docker test test_amdgcn_mma --name my_build + +# Debug +ck-docker shell +ck-docker status +``` From 5ba39269c7c9c398e71802bb39621a3bb6a14366 Mon Sep 17 00:00:00 2001 From: Max Podkorytov <4273004+tenpercent@users.noreply.github.com> Date: Tue, 13 Jan 2026 18:54:51 -0600 Subject: [PATCH 2/3] try to handle corner cases --- .claude/skills/ck-docker | 129 ++++++++++++++++++++++-------------- .claude/skills/ck-docker.md | 4 +- 2 files changed, 82 insertions(+), 51 deletions(-) diff --git a/.claude/skills/ck-docker b/.claude/skills/ck-docker index 83250d8f111..e884b47def8 100755 --- a/.claude/skills/ck-docker +++ b/.claude/skills/ck-docker @@ -2,16 +2,26 @@ # CK Docker Skill - Build and test composable_kernel in Docker with ROCm support set -e +set -o pipefail # Find project root (where .git directory is) SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" # Detect git branch and sanitize for docker naming (replace / and special chars with _) -GIT_BRANCH=$(cd "${PROJECT_ROOT}" && git rev-parse --abbrev-ref HEAD 2>/dev/null | tr '/' '_' | tr -cd 'a-zA-Z0-9_-') +GIT_BRANCH=$(cd "${PROJECT_ROOT}" && git rev-parse --abbrev-ref HEAD 2>/dev/null | tr '/' '_' | tr -cd 'a-zA-Z0-9_-' || echo "") +# Handle edge cases: detached HEAD, empty branch name +GIT_BRANCH=${GIT_BRANCH:-unknown} +# If branch is just "HEAD" (detached state), make it more descriptive +if [ "${GIT_BRANCH}" = "HEAD" ]; then + GIT_BRANCH="detached" +fi + +# Ensure USER is set +USER_NAME=${USER:-$(whoami 2>/dev/null || echo "user")} # Default container name: ck__ -DEFAULT_NAME="ck_${USER}_${GIT_BRANCH}" +DEFAULT_NAME="ck_${USER_NAME}_${GIT_BRANCH}" CONTAINER_NAME="${CK_CONTAINER_NAME:-${DEFAULT_NAME}}" # Help message @@ -38,13 +48,20 @@ Examples: Environment: CK_CONTAINER_NAME - Override default container name (default: ck__) + CK_DOCKER_IMAGE - Override Docker image (default: rocm/composable_kernel:ck_ub24.04_rocm7.0.1) + GPU_TARGET - Override GPU target detection (e.g., gfx950, gfx942) EOF } # Detect GPU target detect_gpu() { local container=$1 - docker exec ${container} bash -c " + # Allow override via GPU_TARGET environment variable + if [ -n "${GPU_TARGET:-}" ]; then + echo "${GPU_TARGET}" + return 0 + fi + docker exec "${container}" bash -c " rocminfo 2>/dev/null | grep -oP 'gfx[0-9a-z]+' | head -1 || echo 'gfx950' " | tr -d '\r\n' } @@ -52,14 +69,17 @@ detect_gpu() { # Start container cmd_start() { local name="${1:-${CONTAINER_NAME}}" + local docker_image="${CK_DOCKER_IMAGE:-rocm/composable_kernel:ck_ub24.04_rocm7.0.1}" - if docker ps -a -f name=${name} | grep -q ${name}; then - if docker ps -f name=${name} | grep -q ${name}; then + # Check if container exists (exact match to avoid substring collisions) + if docker ps -a --filter "name=^${name}$" --format '{{.Names}}' | grep -q "^${name}$"; then + # Check if container is running + if docker ps --filter "name=^${name}$" --format '{{.Names}}' | grep -q "^${name}$"; then echo "Container '${name}' is already running" return 0 else echo "Starting existing container '${name}'..." - docker start ${name} + docker start "${name}" echo "Container started" return 0 fi @@ -67,17 +87,17 @@ cmd_start() { echo "Creating new Docker container '${name}'..." docker run -d \ - --name ${name} \ + --name "${name}" \ --device=/dev/kfd --device=/dev/dri \ --security-opt seccomp=unconfined \ --group-add video \ -v "${PROJECT_ROOT}":/workspace \ -w /workspace \ - rocm/composable_kernel:ck_ub24.04_rocm7.0.1 \ + "${docker_image}" \ tail -f /dev/null echo "Container '${name}' started successfully" - docker exec ${name} bash -c "echo 'Working directory:' && pwd" + docker exec "${name}" bash -c "echo 'Working directory:' && pwd" } # Build target @@ -98,21 +118,22 @@ cmd_build() { esac done - if ! docker ps -f name=${name} | grep -q ${name}; then + # Check if container is running (exact match) + if ! docker ps --filter "name=^${name}$" --format '{{.Names}}' | grep -q "^${name}$"; then echo "Container '${name}' not running. Starting..." - cmd_start ${name} + cmd_start "${name}" fi - if ! docker exec ${name} test -f /workspace/build/build.ninja 2>/dev/null; then + if ! docker exec "${name}" test -f /workspace/build/build.ninja 2>/dev/null; then echo "Detecting GPU target..." - local gpu_target=$(detect_gpu ${name}) + local gpu_target=$(detect_gpu "${name}") echo "Configuring build with CMake for GPU target: ${gpu_target}" - docker exec ${name} bash -c " - cd /workspace && - rm -rf build && - mkdir build && - cd build && + docker exec "${name}" bash -c " + cd /workspace || exit 1 + rm -rf /workspace/build + mkdir /workspace/build + cd /workspace/build || exit 1 cmake .. -GNinja \ -DGPU_TARGETS=${gpu_target} \ -DCMAKE_BUILD_TYPE=Release \ @@ -127,8 +148,8 @@ cmd_build() { echo "Building target: ${target}" fi - docker exec ${name} bash -c " - cd /workspace/build && + docker exec "${name}" bash -c " + cd /workspace/build || exit 1 ninja ${target} 2>&1 " @@ -139,7 +160,7 @@ cmd_build() { cmd_test() { local test_name="" local name="${CONTAINER_NAME}" - local test_options="" + local -a test_options=() while [[ $# -gt 0 ]]; do case $1 in @@ -148,14 +169,14 @@ cmd_test() { shift 2 ;; --gtest_*|--help) - test_options="${test_options} $1" + test_options+=("$1") shift ;; *) if [ -z "$test_name" ]; then test_name="$1" else - test_options="${test_options} $1" + test_options+=("$1") fi shift ;; @@ -168,55 +189,61 @@ cmd_test() { return 1 fi - if ! docker ps -f name=${name} | grep -q ${name}; then + # Check if container is running (exact match) + if ! docker ps --filter "name=^${name}$" --format '{{.Names}}' | grep -q "^${name}$"; then echo "Error: Container '${name}' not running" echo "Start it with: ck-docker start --name ${name}" return 1 fi - if ! docker exec ${name} test -f "/workspace/build/bin/${test_name}" 2>/dev/null; then + if ! docker exec "${name}" test -f "/workspace/build/bin/${test_name}" 2>/dev/null; then echo "Test executable not found. Building ${test_name}..." - cmd_build ${test_name} --name ${name} + cmd_build "${test_name}" --name "${name}" fi - echo "Running: ${test_name} ${test_options}" + echo "Running: ${test_name} ${test_options[*]}" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - docker exec ${name} bash -c " - cd /workspace/build && - ./bin/${test_name} ${test_options} - " + # Build the command with proper quoting + local cmd="cd /workspace/build && ./bin/${test_name}" + for opt in "${test_options[@]}"; do + cmd="${cmd} $(printf '%q' "$opt")" + done + docker exec "${name}" bash -c "${cmd}" } # Shell cmd_shell() { local name="${1:-${CONTAINER_NAME}}" - if ! docker ps -f name=${name} | grep -q ${name}; then + # Check if container is running (exact match) + if ! docker ps --filter "name=^${name}$" --format '{{.Names}}' | grep -q "^${name}$"; then echo "Container '${name}' not running. Starting..." - cmd_start ${name} + cmd_start "${name}" fi echo "Opening shell in '${name}' (type 'exit' to leave)..." - docker exec -it ${name} bash + docker exec -it "${name}" bash } # Status cmd_status() { local name="${1:-}" + local docker_image="${CK_DOCKER_IMAGE:-rocm/composable_kernel:ck_ub24.04_rocm7.0.1}" if [ -z "$name" ]; then echo "Composable Kernel Docker Containers:" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - docker ps -a --filter "ancestor=rocm/composable_kernel:ck_ub24.04_rocm7.0.1" \ + docker ps -a --filter "ancestor=${docker_image}" \ --format "table {{.Names}}\t{{.Status}}\t{{.CreatedAt}}" || echo "No containers found" else - if docker ps -f name=${name} | grep -q ${name}; then + # Check if container is running (exact match) + if docker ps --filter "name=^${name}$" --format '{{.Names}}' | grep -q "^${name}$"; then echo "Container '${name}' is RUNNING" - docker ps -f name=${name} --format "table {{.Names}}\t{{.Status}}\t{{.Image}}" + docker ps --filter "name=^${name}$" --format "table {{.Names}}\t{{.Status}}\t{{.Image}}" echo "" echo "GPU Information:" - docker exec ${name} bash -c "rocm-smi --showproductname 2>/dev/null | head -10 || echo 'No GPU detected'" - elif docker ps -a -f name=${name} | grep -q ${name}; then + docker exec "${name}" bash -c "rocm-smi --showproductname 2>/dev/null | head -10 || echo 'No GPU detected'" + elif docker ps -a --filter "name=^${name}$" --format '{{.Names}}' | grep -q "^${name}$"; then echo "Container '${name}' exists but is STOPPED" echo "Start with: ck-docker start ${name}" else @@ -230,10 +257,11 @@ cmd_status() { cmd_stop() { local name="${1:-${CONTAINER_NAME}}" - if docker ps -a -f name=${name} | grep -q ${name}; then + # Check if container exists (exact match) + if docker ps -a --filter "name=^${name}$" --format '{{.Names}}' | grep -q "^${name}$"; then echo "Stopping and removing container '${name}'..." - docker stop ${name} 2>/dev/null || true - docker rm ${name} 2>/dev/null || true + docker stop "${name}" 2>/dev/null || true + docker rm "${name}" 2>/dev/null || true echo "Container stopped and removed" else echo "Container '${name}' does not exist" @@ -244,20 +272,21 @@ cmd_stop() { cmd_rebuild_cmake() { local name="${1:-${CONTAINER_NAME}}" - if ! docker ps -f name=${name} | grep -q ${name}; then + # Check if container is running (exact match) + if ! docker ps --filter "name=^${name}$" --format '{{.Names}}' | grep -q "^${name}$"; then echo "Container '${name}' not running. Starting..." - cmd_start ${name} + cmd_start "${name}" fi echo "Detecting GPU target..." - local gpu_target=$(detect_gpu ${name}) + local gpu_target=$(detect_gpu "${name}") echo "Reconfiguring CMake from scratch in '${name}' for GPU target: ${gpu_target}" - docker exec ${name} bash -c " - cd /workspace && - rm -rf build && - mkdir build && - cd build && + docker exec "${name}" bash -c " + cd /workspace || exit 1 + rm -rf /workspace/build + mkdir /workspace/build + cd /workspace/build || exit 1 cmake .. -GNinja \ -DGPU_TARGETS=${gpu_target} \ -DCMAKE_BUILD_TYPE=Release \ diff --git a/.claude/skills/ck-docker.md b/.claude/skills/ck-docker.md index 8c9887a5ccd..c95ee10beda 100644 --- a/.claude/skills/ck-docker.md +++ b/.claude/skills/ck-docker.md @@ -52,7 +52,9 @@ ck-docker rebuild-cmake [name] Reconfigure CMake ## Environment ```bash -export CK_CONTAINER_NAME=my_build # Override default container name +export CK_CONTAINER_NAME=my_build # Override default container name +export CK_DOCKER_IMAGE=rocm/composable_kernel:ck_ub24.04_rocm7.0.1 # Override Docker image +export GPU_TARGET=gfx942 # Override GPU target detection ``` ## Examples From ba65875e4dc7bc73de2762d6db4708605cbea235 Mon Sep 17 00:00:00 2001 From: Max Podkorytov <4273004+tenpercent@users.noreply.github.com> Date: Tue, 13 Jan 2026 19:49:00 -0600 Subject: [PATCH 3/3] combine build and rebuild --- .claude/skills/ck-docker | 61 ++++++++++++------------------------- .claude/skills/ck-docker.md | 16 +++++----- 2 files changed, 29 insertions(+), 48 deletions(-) diff --git a/.claude/skills/ck-docker b/.claude/skills/ck-docker index e884b47def8..1217f6ae1bb 100755 --- a/.claude/skills/ck-docker +++ b/.claude/skills/ck-docker @@ -32,17 +32,17 @@ CK Docker Skill - Build and test composable_kernel in Docker Usage: ck-docker [options] Commands: - start [name] Start Docker container - build [target] [--name] Build target - test [options] Run test - shell [name] Open shell in container - status [name] Check container status - stop [name] Stop and remove container - rebuild-cmake [name] Reconfigure CMake from scratch + start [name] Start Docker container + build [target] [--reconfigure] Build target (optionally reconfigure CMake) + test [options] Run test + shell [name] Open shell in container + status [name] Check container status + stop [name] Stop and remove container Examples: ck-docker start ck-docker build test_amdgcn_mma + ck-docker build --reconfigure test_amdgcn_mma ck-docker test test_amdgcn_mma --gtest_filter=*Fp16* ck-docker shell @@ -104,6 +104,7 @@ cmd_start() { cmd_build() { local target="" local name="${CONTAINER_NAME}" + local reconfigure=false while [[ $# -gt 0 ]]; do case $1 in @@ -111,6 +112,10 @@ cmd_build() { name="$2" shift 2 ;; + --reconfigure) + reconfigure=true + shift + ;; *) target="$1" shift @@ -124,11 +129,17 @@ cmd_build() { cmd_start "${name}" fi - if ! docker exec "${name}" test -f /workspace/build/build.ninja 2>/dev/null; then + # Reconfigure CMake if requested or if build.ninja doesn't exist + if [ "$reconfigure" = true ] || ! docker exec "${name}" test -f /workspace/build/build.ninja 2>/dev/null; then echo "Detecting GPU target..." local gpu_target=$(detect_gpu "${name}") - echo "Configuring build with CMake for GPU target: ${gpu_target}" + if [ "$reconfigure" = true ]; then + echo "Reconfiguring CMake from scratch for GPU target: ${gpu_target}" + else + echo "Configuring build with CMake for GPU target: ${gpu_target}" + fi + docker exec "${name}" bash -c " cd /workspace || exit 1 rm -rf /workspace/build @@ -268,34 +279,6 @@ cmd_stop() { fi } -# Rebuild CMake -cmd_rebuild_cmake() { - local name="${1:-${CONTAINER_NAME}}" - - # Check if container is running (exact match) - if ! docker ps --filter "name=^${name}$" --format '{{.Names}}' | grep -q "^${name}$"; then - echo "Container '${name}' not running. Starting..." - cmd_start "${name}" - fi - - echo "Detecting GPU target..." - local gpu_target=$(detect_gpu "${name}") - - echo "Reconfiguring CMake from scratch in '${name}' for GPU target: ${gpu_target}" - docker exec "${name}" bash -c " - cd /workspace || exit 1 - rm -rf /workspace/build - mkdir /workspace/build - cd /workspace/build || exit 1 - cmake .. -GNinja \ - -DGPU_TARGETS=${gpu_target} \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_CXX_COMPILER=/opt/rocm/llvm/bin/clang++ \ - -DBUILD_TESTING=ON 2>&1 | tail -30 - " - echo "CMake configuration complete for ${gpu_target}" -} - # Main command dispatcher case "${1:-}" in start) @@ -322,10 +305,6 @@ case "${1:-}" in shift cmd_stop "$@" ;; - rebuild-cmake) - shift - cmd_rebuild_cmake "$@" - ;; help|--help|-h) show_help ;; diff --git a/.claude/skills/ck-docker.md b/.claude/skills/ck-docker.md index c95ee10beda..f31022e0bda 100644 --- a/.claude/skills/ck-docker.md +++ b/.claude/skills/ck-docker.md @@ -31,13 +31,12 @@ Just ask in natural language: ## Commands ``` -ck-docker start [name] Start Docker container -ck-docker build [target] Build target -ck-docker test [options] Run test -ck-docker shell [name] Interactive shell -ck-docker status [name] Check status -ck-docker stop [name] Stop container -ck-docker rebuild-cmake [name] Reconfigure CMake +ck-docker start [name] Start Docker container +ck-docker build [target] [--reconfigure] Build target (optionally reconfigure CMake) +ck-docker test [options] Run test +ck-docker shell [name] Interactive shell +ck-docker status [name] Check status +ck-docker stop [name] Stop container ``` ## Configuration @@ -67,6 +66,9 @@ ck-docker start ck-docker build test_amdgcn_mma ck-docker test test_amdgcn_mma +# Force clean CMake reconfiguration and build +ck-docker build --reconfigure test_amdgcn_mma + # Custom container ck-docker start my_build ck-docker build test_amdgcn_mma --name my_build