[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-nvidia-udf-convert-to-cuda":3,"mdc-kpc7pz-key":37,"related-repo-nvidia-udf-convert-to-cuda":1615,"related-org-nvidia-udf-convert-to-cuda":1700},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":32,"sourceUrl":35,"mdContent":36},"udf-convert-to-cuda","convert Spark UDFs to CUDA RapidsUDFs","Assists with converting a non-aggregating Apache Spark UDF to a native CUDA RapidsUDF using JNI and libcudf. This is step 2 of 3 in the UDF conversion workflow (udf-gen-test -> udf-convert-to-cuda -> udf-benchmark). Use this skill when you have a CPU UDF with a unit test and need to convert it to a native CUDA implementation. Prefer udf-convert-to-cudf unless a CUDA implementation is necessary for performance or correctness, or if requested by the user.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},"nvidia","NVIDIA","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fnvidia.png",[12,16,17,20],{"name":13,"slug":14,"type":15},"Java","java","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Engineering","engineering",{"name":21,"slug":22,"type":15},"Spark","spark",987,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fcudf-spark","2026-07-14T05:30:51.534401","CC-BY-4.0 AND Apache-2.0",289,[29,30,31,22],"big-data","gpu","rapids",{"repoUrl":24,"stars":23,"forks":27,"topics":33,"description":34},[29,30,31,22],"Spark RAPIDS plugin - accelerate Apache Spark with GPUs","https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fcudf-spark\u002Ftree\u002FHEAD\u002Fskills\u002Fudf-convert-to-cuda","---\nname: udf-convert-to-cuda\ndescription: Assists with converting a non-aggregating Apache Spark UDF to a native CUDA RapidsUDF using JNI and libcudf. This is step 2 of 3 in the UDF conversion workflow (udf-gen-test -> udf-convert-to-cuda -> udf-benchmark). Use this skill when you have a CPU UDF with a unit test and need to convert it to a native CUDA implementation. Prefer udf-convert-to-cudf unless a CUDA implementation is necessary for performance or correctness, or if requested by the user.\nlicense: CC-BY-4.0 AND Apache-2.0\nmetadata:\n  spdx-file-copyright-text: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\nmodel: inherit\n---\n\n# Convert UDF to Native CUDA RapidsUDF\n\n## Workflow\n\n- [ ] Step 1: Copy CUDA add-on templates into the udf-gen-test project\n- [ ] Step 2: Create the Java RapidsUDF\u002FJNI bridge\n- [ ] Step 3: Implement the CUDA\u002Flibcudf native function\n- [ ] Step 4: Build with the `cuda-native-udf` Maven profile\n- [ ] Step 5: Fill in the comparison test and iterate\n- [ ] Step 6: Run judge subagent if requested\n- [ ] Step 7: Review conversion\n\n**Before making any edits, create a visible TODO checklist for every workflow step in this skill and keep it updated.** Do not produce a final answer until every required checklist item is marked complete.\n\n## Prerequisites\n\n- Project directory from Step 1 (`udf-gen-test`) with a passing unit test\n- Native build tools: CMake 3.30.4+, a CUDA-compatible C++ compiler, `git`, and `unzip`\n- Docker is optional, but can be used for a stable native build environment\n\nDerive `\u003CCamelName>` and `\u003Csnake_name>` from the UDF class name.\n\n> **Note:** Commands require access to `\u002Ftmp` (Spark temp storage) and `\u002Fdev` (GPU device). If commands fail due to sandbox restrictions, re-run them unsandboxed.\n\n## Step 1: Copy CUDA Add-On Templates\n\nCopy this skill's CUDA templates into the existing project:\n```bash\ncp -r templates\u002Fcuda\u002F* \u003Cproject_root>\u002F\u003CCamelName>\u002F\nchmod +x \u003Cproject_root>\u002F\u003CCamelName>\u002Fnative\u002Fscripts\u002Fextract-cudf-libs.sh\n```\n\nThe `udf-gen-test` Maven template already contains an inactive `cuda-native-udf` profile. The native profile is activated only when you build with `-Pcuda-native-udf`.\n\nRead [NATIVE_BUILD_ENV.md](references\u002FNATIVE_BUILD_ENV.md) before changing build configuration.\nRead `examples\u002F` for native RapidsUDF examples.\n\n## Step 2: Create the RapidsUDF\u002FJNI Bridge\n\nUse `src\u002Fmain\u002Fjava\u002Fcom\u002Fudf\u002FPlaceholderUDFNameNativeRapidsUDF.java` as a starting point:\n\n1. Rename it to `\u003CCamelName>NativeRapidsUDF.java`.\n2. Rename the class to `\u003CCamelName>NativeRapidsUDF`.\n3. Copy the original CPU UDF interface and row-by-row method onto the class.\n4. Implement `evaluateColumnar` to validate column count\u002Ftypes and call the native method.\n5. Rename the native method to a descriptive operation name, e.g. `cosineSimilarityNative`.\n\nThe project joint-compiles Java, so keep this Java wrapper under `src\u002Fmain\u002Fjava\u002Fcom\u002Fudf\u002F` and register it from the Scala test. JNI can be used from Scala, but the Java wrapper keeps native symbol names and examples simpler.\nIf the Java wrapper's CPU fallback needs to call a Scala object, direct references can fail before `scala-maven-plugin` compiles the Scala classes; use reflection in the row-by-row fallback only, and keep `evaluateColumnar` on the normal JNI path.\n\nRead [JNI_CUDA_GUIDE.md](references\u002FJNI_CUDA_GUIDE.md) for the `evaluateColumnar` contract, type mapping, pointer ownership, `NativeDepsLoader`, and native memory rules.\n**Note:** memory allocations must use the active RMM resource; avoid direct usage of ad hoc CUDA or Thrust allocators.\n\n## Step 3: Implement Native CUDA Code\n\nRename and edit:\n- `native\u002Fsrc\u002Fmain\u002Fcpp\u002Fsrc\u002FPlaceholderUDFNameJni.cpp`\n- `native\u002Fsrc\u002Fmain\u002Fcpp\u002Fsrc\u002Fplaceholder_udf_name.cu`\n- `native\u002Fsrc\u002Fmain\u002Fcpp\u002Fsrc\u002Fplaceholder_udf_name.hpp`\n\nUpdate `native\u002Fsrc\u002Fmain\u002Fcpp\u002FCMakeLists.txt` `SOURCE_FILES` to match the renamed files. If libcudf ABI\u002Fversion compatibility is unclear, defer to the user.\n\nRead [JNI_CUDA_GUIDE.md](references\u002FJNI_CUDA_GUIDE.md) before writing kernels.\n\nVerify cuDF header names before choosing includes or APIs. After dependency extraction, the active header tree will be cloned under `target\u002Fcudf-repo\u002Fcpp\u002Finclude`.\n\n### Critical Requirements\n\n- **NEVER use `copyToHost()` or native methods that copy inputs from GPU to CPU.** This defeats the purpose of GPU acceleration\n- **Do NOT hardcode test values.** The RapidsUDF must implement actual business logic for ANY potential input\n\n## Step 4: Build\n\nThe native Maven profile uses the RAPIDS dependency already declared in `pom.xml`.\n\n```bash\nmvn package -Pcuda-native-udf -DskipTests\n```\n\nTo use the Docker build environment:\n```bash\ndocker build -t cuda-udf-build .\nmkdir -p \"$HOME\u002F.m2\"\ndocker run --rm --gpus all \\\n  --user \"$(id -u):$(id -g)\" \\\n  -e HOME=\u002Fworkspace \\\n  -v \"$PWD\":\u002Fworkspace \\\n  -v \"$HOME\u002F.m2\":\u002Fworkspace\u002F.m2 \\\n  -w \u002Fworkspace \\\n  cuda-udf-build \\\n  -c \"mvn -B -Dmaven.repo.local=\u002Fworkspace\u002F.m2\u002Frepository package -Pcuda-native-udf -DskipTests -Dnative.build.path=\u002Fworkspace\u002Ftarget\u002Fnative-build-docker\"\n```\n\nIf the build fails while resolving cuDF headers or RAPIDS CMake, check network access and the generated `cudf.git.branch` \u002F `rapids.cmake.branch` properties. These properties may contain either a branch or a tag.\n\n## Step 5: Build and Test\n\nFill in the target-specific TODOs in `src\u002Ftest\u002Fscala\u002Fcom\u002Fudf\u002FCudfComparisonTest.scala`:\n- Register `\u003CCamelName>NativeRapidsUDF` as the GPU implementation\n- Replace placeholder UDF names\n\nRun:\n```bash\nmvn test -Dsuites=com.udf.CudfComparisonTest -Pcuda-native-udf\n```\n\nTo run the tests inside the Docker build environment:\n\n```bash\ndocker run --rm --gpus all \\\n  --user \"$(id -u):$(id -g)\" \\\n  -e HOME=\u002Fworkspace \\\n  -v \"$PWD\":\u002Fworkspace \\\n  -v \"$HOME\u002F.m2\":\u002Fworkspace\u002F.m2 \\\n  -v \u002Fetc\u002Fpasswd:\u002Fetc\u002Fpasswd:ro \\\n  -v \u002Fetc\u002Fgroup:\u002Fetc\u002Fgroup:ro \\\n  -w \u002Fworkspace \\\n  cuda-udf-build \\\n  -c \"mvn -B -Dmaven.repo.local=\u002Fworkspace\u002F.m2\u002Frepository test -Dsuites=com.udf.CudfComparisonTest -Pcuda-native-udf -Dnative.build.path=\u002Fworkspace\u002Ftarget\u002Fnative-build-docker -DskipCudfExtraction=true\"\n```\n\nIf tests fail, iterate on the Java bridge or native implementation.\n\n### Difficult Test Failures\n\nTreat the unit test as the CPU behavior specification. Do not weaken or remove test cases silently.\n\n- Tests that check for CPU errors may not be directly applicable to a columnar implementation: the GPU path typically evaluates a whole column and may produce nulls for invalid rows instead of throwing row-level exceptions. If this causes an unavoidable mismatch, add a clear comment in the test and a `TODO\u002FNOTE` in the implementation explaining the mismatch.\n- If a test case does not pass because of inherent CUDA\u002Flibcudf\u002FAPI limitations or low-level GPU\u002FCPU semantic differences, comment out the conflicting assertion\u002Ftest only after documenting how you tried to make the behavior match and why those attempts failed. Add a note to the user.\n- If the behavior is important, common, or part of the documented input domain, **always prefer fixing the implementation** over commenting out the test case. The exception is a performance-vs-correctness tradeoff that the user explicitly approves.\n\n## Step 6: Run Judge Subagent If Requested\n\nIf the user explicitly asked for the judge, a judge subagent, or a review agent, treat that as an explicit request for delegation: you **MUST** launch a separate subagent with `model: inherit` and instruct it to use the **udf-judge-conversion** skill. Ask it to review the `UnitTest`, `CudfComparisonTest`, Java bridge, and JNI\u002FCUDA sources.\n\nIf the user did not request a judge\u002Freview agent, mark this step as skipped and continue to Step 7. If a required judge subagent is blocked by tool policy, stop and tell the user that explicit permission\u002Finstruction is needed.\n\nIf you run the judge, wait for it to complete and review its report. If the judge finds any issues, 1) fix the issues, 2) re-run the tests, and 3) re-run the judge subagent.\n\n## Step 7: Review Conversion\n\nReview your own work to ensure:\n- The test runs on the GPU and directly compares CPU-GPU outputs\n- The implementation does not overfit to test cases\n- No `copyToHost()` or row-by-row GPU-to-CPU copying is used for computation\n- No debug statements (e.g., `TableDebug.get().debug(...)`) remain in final output\n\n## Output\n\nUpon successful completion:\n- Native RapidsUDF file at `src\u002Fmain\u002Fjava\u002Fcom\u002Fudf\u002F\u003CCamelName>NativeRapidsUDF.java`\n- JNI\u002FCUDA sources under `native\u002Fsrc\u002Fmain\u002Fcpp\u002Fsrc\u002F`\n- Packaged native library in the generated UDF JAR\n- Comparison test passes\n\nThese outputs are required for **Step 3: Benchmark**.\n",{"data":38,"body":42},{"name":4,"description":6,"license":26,"metadata":39,"model":41},{"spdx-file-copyright-text":40},"Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.","inherit",{"type":43,"children":44},"root",[45,54,61,144,156,162,202,223,253,259,264,409,436,458,464,477,535,563,596,602,607,637,658,668,680,687,718,724,736,766,771,1065,1086,1092,1104,1124,1129,1158,1163,1395,1400,1406,1411,1444,1450,1493,1498,1503,1509,1514,1552,1558,1563,1598,1609],{"type":46,"tag":47,"props":48,"children":50},"element","h1",{"id":49},"convert-udf-to-native-cuda-rapidsudf",[51],{"type":52,"value":53},"text","Convert UDF to Native CUDA RapidsUDF",{"type":46,"tag":55,"props":56,"children":58},"h2",{"id":57},"workflow",[59],{"type":52,"value":60},"Workflow",{"type":46,"tag":62,"props":63,"children":66},"ul",{"className":64},[65],"contains-task-list",[67,81,90,99,117,126,135],{"type":46,"tag":68,"props":69,"children":72},"li",{"className":70},[71],"task-list-item",[73,79],{"type":46,"tag":74,"props":75,"children":78},"input",{"disabled":76,"type":77},true,"checkbox",[],{"type":52,"value":80}," Step 1: Copy CUDA add-on templates into the udf-gen-test project",{"type":46,"tag":68,"props":82,"children":84},{"className":83},[71],[85,88],{"type":46,"tag":74,"props":86,"children":87},{"disabled":76,"type":77},[],{"type":52,"value":89}," Step 2: Create the Java RapidsUDF\u002FJNI bridge",{"type":46,"tag":68,"props":91,"children":93},{"className":92},[71],[94,97],{"type":46,"tag":74,"props":95,"children":96},{"disabled":76,"type":77},[],{"type":52,"value":98}," Step 3: Implement the CUDA\u002Flibcudf native function",{"type":46,"tag":68,"props":100,"children":102},{"className":101},[71],[103,106,108,115],{"type":46,"tag":74,"props":104,"children":105},{"disabled":76,"type":77},[],{"type":52,"value":107}," Step 4: Build with the ",{"type":46,"tag":109,"props":110,"children":112},"code",{"className":111},[],[113],{"type":52,"value":114},"cuda-native-udf",{"type":52,"value":116}," Maven profile",{"type":46,"tag":68,"props":118,"children":120},{"className":119},[71],[121,124],{"type":46,"tag":74,"props":122,"children":123},{"disabled":76,"type":77},[],{"type":52,"value":125}," Step 5: Fill in the comparison test and iterate",{"type":46,"tag":68,"props":127,"children":129},{"className":128},[71],[130,133],{"type":46,"tag":74,"props":131,"children":132},{"disabled":76,"type":77},[],{"type":52,"value":134}," Step 6: Run judge subagent if requested",{"type":46,"tag":68,"props":136,"children":138},{"className":137},[71],[139,142],{"type":46,"tag":74,"props":140,"children":141},{"disabled":76,"type":77},[],{"type":52,"value":143}," Step 7: Review conversion",{"type":46,"tag":145,"props":146,"children":147},"p",{},[148,154],{"type":46,"tag":149,"props":150,"children":151},"strong",{},[152],{"type":52,"value":153},"Before making any edits, create a visible TODO checklist for every workflow step in this skill and keep it updated.",{"type":52,"value":155}," Do not produce a final answer until every required checklist item is marked complete.",{"type":46,"tag":55,"props":157,"children":159},{"id":158},"prerequisites",[160],{"type":52,"value":161},"Prerequisites",{"type":46,"tag":62,"props":163,"children":164},{},[165,178,197],{"type":46,"tag":68,"props":166,"children":167},{},[168,170,176],{"type":52,"value":169},"Project directory from Step 1 (",{"type":46,"tag":109,"props":171,"children":173},{"className":172},[],[174],{"type":52,"value":175},"udf-gen-test",{"type":52,"value":177},") with a passing unit test",{"type":46,"tag":68,"props":179,"children":180},{},[181,183,189,191],{"type":52,"value":182},"Native build tools: CMake 3.30.4+, a CUDA-compatible C++ compiler, ",{"type":46,"tag":109,"props":184,"children":186},{"className":185},[],[187],{"type":52,"value":188},"git",{"type":52,"value":190},", and ",{"type":46,"tag":109,"props":192,"children":194},{"className":193},[],[195],{"type":52,"value":196},"unzip",{"type":46,"tag":68,"props":198,"children":199},{},[200],{"type":52,"value":201},"Docker is optional, but can be used for a stable native build environment",{"type":46,"tag":145,"props":203,"children":204},{},[205,207,213,215,221],{"type":52,"value":206},"Derive ",{"type":46,"tag":109,"props":208,"children":210},{"className":209},[],[211],{"type":52,"value":212},"\u003CCamelName>",{"type":52,"value":214}," and ",{"type":46,"tag":109,"props":216,"children":218},{"className":217},[],[219],{"type":52,"value":220},"\u003Csnake_name>",{"type":52,"value":222}," from the UDF class name.",{"type":46,"tag":224,"props":225,"children":226},"blockquote",{},[227],{"type":46,"tag":145,"props":228,"children":229},{},[230,235,237,243,245,251],{"type":46,"tag":149,"props":231,"children":232},{},[233],{"type":52,"value":234},"Note:",{"type":52,"value":236}," Commands require access to ",{"type":46,"tag":109,"props":238,"children":240},{"className":239},[],[241],{"type":52,"value":242},"\u002Ftmp",{"type":52,"value":244}," (Spark temp storage) and ",{"type":46,"tag":109,"props":246,"children":248},{"className":247},[],[249],{"type":52,"value":250},"\u002Fdev",{"type":52,"value":252}," (GPU device). If commands fail due to sandbox restrictions, re-run them unsandboxed.",{"type":46,"tag":55,"props":254,"children":256},{"id":255},"step-1-copy-cuda-add-on-templates",[257],{"type":52,"value":258},"Step 1: Copy CUDA Add-On Templates",{"type":46,"tag":145,"props":260,"children":261},{},[262],{"type":52,"value":263},"Copy this skill's CUDA templates into the existing project:",{"type":46,"tag":265,"props":266,"children":271},"pre",{"className":267,"code":268,"language":269,"meta":270,"style":270},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","cp -r templates\u002Fcuda\u002F* \u003Cproject_root>\u002F\u003CCamelName>\u002F\nchmod +x \u003Cproject_root>\u002F\u003CCamelName>\u002Fnative\u002Fscripts\u002Fextract-cudf-libs.sh\n","bash","",[272],{"type":46,"tag":109,"props":273,"children":274},{"__ignoreMap":270},[275,354],{"type":46,"tag":276,"props":277,"children":280},"span",{"class":278,"line":279},"line",1,[281,287,293,298,304,310,315,320,325,330,335,340,345,349],{"type":46,"tag":276,"props":282,"children":284},{"style":283},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[285],{"type":52,"value":286},"cp",{"type":46,"tag":276,"props":288,"children":290},{"style":289},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[291],{"type":52,"value":292}," -r",{"type":46,"tag":276,"props":294,"children":295},{"style":289},[296],{"type":52,"value":297}," templates\u002Fcuda\u002F",{"type":46,"tag":276,"props":299,"children":301},{"style":300},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[302],{"type":52,"value":303},"*",{"type":46,"tag":276,"props":305,"children":307},{"style":306},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[308],{"type":52,"value":309}," \u003C",{"type":46,"tag":276,"props":311,"children":312},{"style":289},[313],{"type":52,"value":314},"project_roo",{"type":46,"tag":276,"props":316,"children":317},{"style":300},[318],{"type":52,"value":319},"t",{"type":46,"tag":276,"props":321,"children":322},{"style":306},[323],{"type":52,"value":324},">",{"type":46,"tag":276,"props":326,"children":327},{"style":289},[328],{"type":52,"value":329},"\u002F",{"type":46,"tag":276,"props":331,"children":332},{"style":306},[333],{"type":52,"value":334},"\u003C",{"type":46,"tag":276,"props":336,"children":337},{"style":289},[338],{"type":52,"value":339},"CamelNam",{"type":46,"tag":276,"props":341,"children":342},{"style":300},[343],{"type":52,"value":344},"e",{"type":46,"tag":276,"props":346,"children":347},{"style":306},[348],{"type":52,"value":324},{"type":46,"tag":276,"props":350,"children":351},{"style":289},[352],{"type":52,"value":353},"\u002F\n",{"type":46,"tag":276,"props":355,"children":357},{"class":278,"line":356},2,[358,363,368,372,376,380,384,388,392,396,400,404],{"type":46,"tag":276,"props":359,"children":360},{"style":283},[361],{"type":52,"value":362},"chmod",{"type":46,"tag":276,"props":364,"children":365},{"style":289},[366],{"type":52,"value":367}," +x",{"type":46,"tag":276,"props":369,"children":370},{"style":306},[371],{"type":52,"value":309},{"type":46,"tag":276,"props":373,"children":374},{"style":289},[375],{"type":52,"value":314},{"type":46,"tag":276,"props":377,"children":378},{"style":300},[379],{"type":52,"value":319},{"type":46,"tag":276,"props":381,"children":382},{"style":306},[383],{"type":52,"value":324},{"type":46,"tag":276,"props":385,"children":386},{"style":289},[387],{"type":52,"value":329},{"type":46,"tag":276,"props":389,"children":390},{"style":306},[391],{"type":52,"value":334},{"type":46,"tag":276,"props":393,"children":394},{"style":289},[395],{"type":52,"value":339},{"type":46,"tag":276,"props":397,"children":398},{"style":300},[399],{"type":52,"value":344},{"type":46,"tag":276,"props":401,"children":402},{"style":306},[403],{"type":52,"value":324},{"type":46,"tag":276,"props":405,"children":406},{"style":289},[407],{"type":52,"value":408},"\u002Fnative\u002Fscripts\u002Fextract-cudf-libs.sh\n",{"type":46,"tag":145,"props":410,"children":411},{},[412,414,419,421,426,428,434],{"type":52,"value":413},"The ",{"type":46,"tag":109,"props":415,"children":417},{"className":416},[],[418],{"type":52,"value":175},{"type":52,"value":420}," Maven template already contains an inactive ",{"type":46,"tag":109,"props":422,"children":424},{"className":423},[],[425],{"type":52,"value":114},{"type":52,"value":427}," profile. The native profile is activated only when you build with ",{"type":46,"tag":109,"props":429,"children":431},{"className":430},[],[432],{"type":52,"value":433},"-Pcuda-native-udf",{"type":52,"value":435},".",{"type":46,"tag":145,"props":437,"children":438},{},[439,441,448,450,456],{"type":52,"value":440},"Read ",{"type":46,"tag":442,"props":443,"children":445},"a",{"href":444},"references\u002FNATIVE_BUILD_ENV.md",[446],{"type":52,"value":447},"NATIVE_BUILD_ENV.md",{"type":52,"value":449}," before changing build configuration.\nRead ",{"type":46,"tag":109,"props":451,"children":453},{"className":452},[],[454],{"type":52,"value":455},"examples\u002F",{"type":52,"value":457}," for native RapidsUDF examples.",{"type":46,"tag":55,"props":459,"children":461},{"id":460},"step-2-create-the-rapidsudfjni-bridge",[462],{"type":52,"value":463},"Step 2: Create the RapidsUDF\u002FJNI Bridge",{"type":46,"tag":145,"props":465,"children":466},{},[467,469,475],{"type":52,"value":468},"Use ",{"type":46,"tag":109,"props":470,"children":472},{"className":471},[],[473],{"type":52,"value":474},"src\u002Fmain\u002Fjava\u002Fcom\u002Fudf\u002FPlaceholderUDFNameNativeRapidsUDF.java",{"type":52,"value":476}," as a starting point:",{"type":46,"tag":478,"props":479,"children":480},"ol",{},[481,493,505,510,523],{"type":46,"tag":68,"props":482,"children":483},{},[484,486,492],{"type":52,"value":485},"Rename it to ",{"type":46,"tag":109,"props":487,"children":489},{"className":488},[],[490],{"type":52,"value":491},"\u003CCamelName>NativeRapidsUDF.java",{"type":52,"value":435},{"type":46,"tag":68,"props":494,"children":495},{},[496,498,504],{"type":52,"value":497},"Rename the class to ",{"type":46,"tag":109,"props":499,"children":501},{"className":500},[],[502],{"type":52,"value":503},"\u003CCamelName>NativeRapidsUDF",{"type":52,"value":435},{"type":46,"tag":68,"props":506,"children":507},{},[508],{"type":52,"value":509},"Copy the original CPU UDF interface and row-by-row method onto the class.",{"type":46,"tag":68,"props":511,"children":512},{},[513,515,521],{"type":52,"value":514},"Implement ",{"type":46,"tag":109,"props":516,"children":518},{"className":517},[],[519],{"type":52,"value":520},"evaluateColumnar",{"type":52,"value":522}," to validate column count\u002Ftypes and call the native method.",{"type":46,"tag":68,"props":524,"children":525},{},[526,528,534],{"type":52,"value":527},"Rename the native method to a descriptive operation name, e.g. ",{"type":46,"tag":109,"props":529,"children":531},{"className":530},[],[532],{"type":52,"value":533},"cosineSimilarityNative",{"type":52,"value":435},{"type":46,"tag":145,"props":536,"children":537},{},[538,540,546,548,554,556,561],{"type":52,"value":539},"The project joint-compiles Java, so keep this Java wrapper under ",{"type":46,"tag":109,"props":541,"children":543},{"className":542},[],[544],{"type":52,"value":545},"src\u002Fmain\u002Fjava\u002Fcom\u002Fudf\u002F",{"type":52,"value":547}," and register it from the Scala test. JNI can be used from Scala, but the Java wrapper keeps native symbol names and examples simpler.\nIf the Java wrapper's CPU fallback needs to call a Scala object, direct references can fail before ",{"type":46,"tag":109,"props":549,"children":551},{"className":550},[],[552],{"type":52,"value":553},"scala-maven-plugin",{"type":52,"value":555}," compiles the Scala classes; use reflection in the row-by-row fallback only, and keep ",{"type":46,"tag":109,"props":557,"children":559},{"className":558},[],[560],{"type":52,"value":520},{"type":52,"value":562}," on the normal JNI path.",{"type":46,"tag":145,"props":564,"children":565},{},[566,567,573,575,580,582,588,590,594],{"type":52,"value":440},{"type":46,"tag":442,"props":568,"children":570},{"href":569},"references\u002FJNI_CUDA_GUIDE.md",[571],{"type":52,"value":572},"JNI_CUDA_GUIDE.md",{"type":52,"value":574}," for the ",{"type":46,"tag":109,"props":576,"children":578},{"className":577},[],[579],{"type":52,"value":520},{"type":52,"value":581}," contract, type mapping, pointer ownership, ",{"type":46,"tag":109,"props":583,"children":585},{"className":584},[],[586],{"type":52,"value":587},"NativeDepsLoader",{"type":52,"value":589},", and native memory rules.\n",{"type":46,"tag":149,"props":591,"children":592},{},[593],{"type":52,"value":234},{"type":52,"value":595}," memory allocations must use the active RMM resource; avoid direct usage of ad hoc CUDA or Thrust allocators.",{"type":46,"tag":55,"props":597,"children":599},{"id":598},"step-3-implement-native-cuda-code",[600],{"type":52,"value":601},"Step 3: Implement Native CUDA Code",{"type":46,"tag":145,"props":603,"children":604},{},[605],{"type":52,"value":606},"Rename and edit:",{"type":46,"tag":62,"props":608,"children":609},{},[610,619,628],{"type":46,"tag":68,"props":611,"children":612},{},[613],{"type":46,"tag":109,"props":614,"children":616},{"className":615},[],[617],{"type":52,"value":618},"native\u002Fsrc\u002Fmain\u002Fcpp\u002Fsrc\u002FPlaceholderUDFNameJni.cpp",{"type":46,"tag":68,"props":620,"children":621},{},[622],{"type":46,"tag":109,"props":623,"children":625},{"className":624},[],[626],{"type":52,"value":627},"native\u002Fsrc\u002Fmain\u002Fcpp\u002Fsrc\u002Fplaceholder_udf_name.cu",{"type":46,"tag":68,"props":629,"children":630},{},[631],{"type":46,"tag":109,"props":632,"children":634},{"className":633},[],[635],{"type":52,"value":636},"native\u002Fsrc\u002Fmain\u002Fcpp\u002Fsrc\u002Fplaceholder_udf_name.hpp",{"type":46,"tag":145,"props":638,"children":639},{},[640,642,648,650,656],{"type":52,"value":641},"Update ",{"type":46,"tag":109,"props":643,"children":645},{"className":644},[],[646],{"type":52,"value":647},"native\u002Fsrc\u002Fmain\u002Fcpp\u002FCMakeLists.txt",{"type":52,"value":649}," ",{"type":46,"tag":109,"props":651,"children":653},{"className":652},[],[654],{"type":52,"value":655},"SOURCE_FILES",{"type":52,"value":657}," to match the renamed files. If libcudf ABI\u002Fversion compatibility is unclear, defer to the user.",{"type":46,"tag":145,"props":659,"children":660},{},[661,662,666],{"type":52,"value":440},{"type":46,"tag":442,"props":663,"children":664},{"href":569},[665],{"type":52,"value":572},{"type":52,"value":667}," before writing kernels.",{"type":46,"tag":145,"props":669,"children":670},{},[671,673,679],{"type":52,"value":672},"Verify cuDF header names before choosing includes or APIs. After dependency extraction, the active header tree will be cloned under ",{"type":46,"tag":109,"props":674,"children":676},{"className":675},[],[677],{"type":52,"value":678},"target\u002Fcudf-repo\u002Fcpp\u002Finclude",{"type":52,"value":435},{"type":46,"tag":681,"props":682,"children":684},"h3",{"id":683},"critical-requirements",[685],{"type":52,"value":686},"Critical Requirements",{"type":46,"tag":62,"props":688,"children":689},{},[690,708],{"type":46,"tag":68,"props":691,"children":692},{},[693,706],{"type":46,"tag":149,"props":694,"children":695},{},[696,698,704],{"type":52,"value":697},"NEVER use ",{"type":46,"tag":109,"props":699,"children":701},{"className":700},[],[702],{"type":52,"value":703},"copyToHost()",{"type":52,"value":705}," or native methods that copy inputs from GPU to CPU.",{"type":52,"value":707}," This defeats the purpose of GPU acceleration",{"type":46,"tag":68,"props":709,"children":710},{},[711,716],{"type":46,"tag":149,"props":712,"children":713},{},[714],{"type":52,"value":715},"Do NOT hardcode test values.",{"type":52,"value":717}," The RapidsUDF must implement actual business logic for ANY potential input",{"type":46,"tag":55,"props":719,"children":721},{"id":720},"step-4-build",[722],{"type":52,"value":723},"Step 4: Build",{"type":46,"tag":145,"props":725,"children":726},{},[727,729,735],{"type":52,"value":728},"The native Maven profile uses the RAPIDS dependency already declared in ",{"type":46,"tag":109,"props":730,"children":732},{"className":731},[],[733],{"type":52,"value":734},"pom.xml",{"type":52,"value":435},{"type":46,"tag":265,"props":737,"children":739},{"className":267,"code":738,"language":269,"meta":270,"style":270},"mvn package -Pcuda-native-udf -DskipTests\n",[740],{"type":46,"tag":109,"props":741,"children":742},{"__ignoreMap":270},[743],{"type":46,"tag":276,"props":744,"children":745},{"class":278,"line":279},[746,751,756,761],{"type":46,"tag":276,"props":747,"children":748},{"style":283},[749],{"type":52,"value":750},"mvn",{"type":46,"tag":276,"props":752,"children":753},{"style":289},[754],{"type":52,"value":755}," package",{"type":46,"tag":276,"props":757,"children":758},{"style":289},[759],{"type":52,"value":760}," -Pcuda-native-udf",{"type":46,"tag":276,"props":762,"children":763},{"style":289},[764],{"type":52,"value":765}," -DskipTests\n",{"type":46,"tag":145,"props":767,"children":768},{},[769],{"type":52,"value":770},"To use the Docker build environment:",{"type":46,"tag":265,"props":772,"children":774},{"className":267,"code":773,"language":269,"meta":270,"style":270},"docker build -t cuda-udf-build .\nmkdir -p \"$HOME\u002F.m2\"\ndocker run --rm --gpus all \\\n  --user \"$(id -u):$(id -g)\" \\\n  -e HOME=\u002Fworkspace \\\n  -v \"$PWD\":\u002Fworkspace \\\n  -v \"$HOME\u002F.m2\":\u002Fworkspace\u002F.m2 \\\n  -w \u002Fworkspace \\\n  cuda-udf-build \\\n  -c \"mvn -B -Dmaven.repo.local=\u002Fworkspace\u002F.m2\u002Frepository package -Pcuda-native-udf -DskipTests -Dnative.build.path=\u002Fworkspace\u002Ftarget\u002Fnative-build-docker\"\n",[775],{"type":46,"tag":109,"props":776,"children":777},{"__ignoreMap":270},[778,806,839,872,929,947,979,1012,1030,1043],{"type":46,"tag":276,"props":779,"children":780},{"class":278,"line":279},[781,786,791,796,801],{"type":46,"tag":276,"props":782,"children":783},{"style":283},[784],{"type":52,"value":785},"docker",{"type":46,"tag":276,"props":787,"children":788},{"style":289},[789],{"type":52,"value":790}," build",{"type":46,"tag":276,"props":792,"children":793},{"style":289},[794],{"type":52,"value":795}," -t",{"type":46,"tag":276,"props":797,"children":798},{"style":289},[799],{"type":52,"value":800}," cuda-udf-build",{"type":46,"tag":276,"props":802,"children":803},{"style":289},[804],{"type":52,"value":805}," .\n",{"type":46,"tag":276,"props":807,"children":808},{"class":278,"line":356},[809,814,819,824,829,834],{"type":46,"tag":276,"props":810,"children":811},{"style":283},[812],{"type":52,"value":813},"mkdir",{"type":46,"tag":276,"props":815,"children":816},{"style":289},[817],{"type":52,"value":818}," -p",{"type":46,"tag":276,"props":820,"children":821},{"style":306},[822],{"type":52,"value":823}," \"",{"type":46,"tag":276,"props":825,"children":826},{"style":300},[827],{"type":52,"value":828},"$HOME",{"type":46,"tag":276,"props":830,"children":831},{"style":289},[832],{"type":52,"value":833},"\u002F.m2",{"type":46,"tag":276,"props":835,"children":836},{"style":306},[837],{"type":52,"value":838},"\"\n",{"type":46,"tag":276,"props":840,"children":842},{"class":278,"line":841},3,[843,847,852,857,862,867],{"type":46,"tag":276,"props":844,"children":845},{"style":283},[846],{"type":52,"value":785},{"type":46,"tag":276,"props":848,"children":849},{"style":289},[850],{"type":52,"value":851}," run",{"type":46,"tag":276,"props":853,"children":854},{"style":289},[855],{"type":52,"value":856}," --rm",{"type":46,"tag":276,"props":858,"children":859},{"style":289},[860],{"type":52,"value":861}," --gpus",{"type":46,"tag":276,"props":863,"children":864},{"style":289},[865],{"type":52,"value":866}," all",{"type":46,"tag":276,"props":868,"children":869},{"style":300},[870],{"type":52,"value":871}," \\\n",{"type":46,"tag":276,"props":873,"children":875},{"class":278,"line":874},4,[876,881,886,891,896,901,906,911,915,920,925],{"type":46,"tag":276,"props":877,"children":878},{"style":289},[879],{"type":52,"value":880},"  --user",{"type":46,"tag":276,"props":882,"children":883},{"style":306},[884],{"type":52,"value":885}," \"$(",{"type":46,"tag":276,"props":887,"children":888},{"style":283},[889],{"type":52,"value":890},"id",{"type":46,"tag":276,"props":892,"children":893},{"style":289},[894],{"type":52,"value":895}," -u",{"type":46,"tag":276,"props":897,"children":898},{"style":306},[899],{"type":52,"value":900},")",{"type":46,"tag":276,"props":902,"children":903},{"style":289},[904],{"type":52,"value":905},":",{"type":46,"tag":276,"props":907,"children":908},{"style":306},[909],{"type":52,"value":910},"$(",{"type":46,"tag":276,"props":912,"children":913},{"style":283},[914],{"type":52,"value":890},{"type":46,"tag":276,"props":916,"children":917},{"style":289},[918],{"type":52,"value":919}," -g",{"type":46,"tag":276,"props":921,"children":922},{"style":306},[923],{"type":52,"value":924},")\"",{"type":46,"tag":276,"props":926,"children":927},{"style":300},[928],{"type":52,"value":871},{"type":46,"tag":276,"props":930,"children":932},{"class":278,"line":931},5,[933,938,943],{"type":46,"tag":276,"props":934,"children":935},{"style":289},[936],{"type":52,"value":937},"  -e",{"type":46,"tag":276,"props":939,"children":940},{"style":289},[941],{"type":52,"value":942}," HOME=\u002Fworkspace",{"type":46,"tag":276,"props":944,"children":945},{"style":300},[946],{"type":52,"value":871},{"type":46,"tag":276,"props":948,"children":950},{"class":278,"line":949},6,[951,956,960,965,970,975],{"type":46,"tag":276,"props":952,"children":953},{"style":289},[954],{"type":52,"value":955},"  -v",{"type":46,"tag":276,"props":957,"children":958},{"style":306},[959],{"type":52,"value":823},{"type":46,"tag":276,"props":961,"children":962},{"style":300},[963],{"type":52,"value":964},"$PWD",{"type":46,"tag":276,"props":966,"children":967},{"style":306},[968],{"type":52,"value":969},"\"",{"type":46,"tag":276,"props":971,"children":972},{"style":289},[973],{"type":52,"value":974},":\u002Fworkspace",{"type":46,"tag":276,"props":976,"children":977},{"style":300},[978],{"type":52,"value":871},{"type":46,"tag":276,"props":980,"children":982},{"class":278,"line":981},7,[983,987,991,995,999,1003,1008],{"type":46,"tag":276,"props":984,"children":985},{"style":289},[986],{"type":52,"value":955},{"type":46,"tag":276,"props":988,"children":989},{"style":306},[990],{"type":52,"value":823},{"type":46,"tag":276,"props":992,"children":993},{"style":300},[994],{"type":52,"value":828},{"type":46,"tag":276,"props":996,"children":997},{"style":289},[998],{"type":52,"value":833},{"type":46,"tag":276,"props":1000,"children":1001},{"style":306},[1002],{"type":52,"value":969},{"type":46,"tag":276,"props":1004,"children":1005},{"style":289},[1006],{"type":52,"value":1007},":\u002Fworkspace\u002F.m2",{"type":46,"tag":276,"props":1009,"children":1010},{"style":300},[1011],{"type":52,"value":871},{"type":46,"tag":276,"props":1013,"children":1015},{"class":278,"line":1014},8,[1016,1021,1026],{"type":46,"tag":276,"props":1017,"children":1018},{"style":289},[1019],{"type":52,"value":1020},"  -w",{"type":46,"tag":276,"props":1022,"children":1023},{"style":289},[1024],{"type":52,"value":1025}," \u002Fworkspace",{"type":46,"tag":276,"props":1027,"children":1028},{"style":300},[1029],{"type":52,"value":871},{"type":46,"tag":276,"props":1031,"children":1033},{"class":278,"line":1032},9,[1034,1039],{"type":46,"tag":276,"props":1035,"children":1036},{"style":289},[1037],{"type":52,"value":1038},"  cuda-udf-build",{"type":46,"tag":276,"props":1040,"children":1041},{"style":300},[1042],{"type":52,"value":871},{"type":46,"tag":276,"props":1044,"children":1046},{"class":278,"line":1045},10,[1047,1052,1056,1061],{"type":46,"tag":276,"props":1048,"children":1049},{"style":289},[1050],{"type":52,"value":1051},"  -c",{"type":46,"tag":276,"props":1053,"children":1054},{"style":306},[1055],{"type":52,"value":823},{"type":46,"tag":276,"props":1057,"children":1058},{"style":289},[1059],{"type":52,"value":1060},"mvn -B -Dmaven.repo.local=\u002Fworkspace\u002F.m2\u002Frepository package -Pcuda-native-udf -DskipTests -Dnative.build.path=\u002Fworkspace\u002Ftarget\u002Fnative-build-docker",{"type":46,"tag":276,"props":1062,"children":1063},{"style":306},[1064],{"type":52,"value":838},{"type":46,"tag":145,"props":1066,"children":1067},{},[1068,1070,1076,1078,1084],{"type":52,"value":1069},"If the build fails while resolving cuDF headers or RAPIDS CMake, check network access and the generated ",{"type":46,"tag":109,"props":1071,"children":1073},{"className":1072},[],[1074],{"type":52,"value":1075},"cudf.git.branch",{"type":52,"value":1077}," \u002F ",{"type":46,"tag":109,"props":1079,"children":1081},{"className":1080},[],[1082],{"type":52,"value":1083},"rapids.cmake.branch",{"type":52,"value":1085}," properties. These properties may contain either a branch or a tag.",{"type":46,"tag":55,"props":1087,"children":1089},{"id":1088},"step-5-build-and-test",[1090],{"type":52,"value":1091},"Step 5: Build and Test",{"type":46,"tag":145,"props":1093,"children":1094},{},[1095,1097,1103],{"type":52,"value":1096},"Fill in the target-specific TODOs in ",{"type":46,"tag":109,"props":1098,"children":1100},{"className":1099},[],[1101],{"type":52,"value":1102},"src\u002Ftest\u002Fscala\u002Fcom\u002Fudf\u002FCudfComparisonTest.scala",{"type":52,"value":905},{"type":46,"tag":62,"props":1105,"children":1106},{},[1107,1119],{"type":46,"tag":68,"props":1108,"children":1109},{},[1110,1112,1117],{"type":52,"value":1111},"Register ",{"type":46,"tag":109,"props":1113,"children":1115},{"className":1114},[],[1116],{"type":52,"value":503},{"type":52,"value":1118}," as the GPU implementation",{"type":46,"tag":68,"props":1120,"children":1121},{},[1122],{"type":52,"value":1123},"Replace placeholder UDF names",{"type":46,"tag":145,"props":1125,"children":1126},{},[1127],{"type":52,"value":1128},"Run:",{"type":46,"tag":265,"props":1130,"children":1132},{"className":267,"code":1131,"language":269,"meta":270,"style":270},"mvn test -Dsuites=com.udf.CudfComparisonTest -Pcuda-native-udf\n",[1133],{"type":46,"tag":109,"props":1134,"children":1135},{"__ignoreMap":270},[1136],{"type":46,"tag":276,"props":1137,"children":1138},{"class":278,"line":279},[1139,1143,1148,1153],{"type":46,"tag":276,"props":1140,"children":1141},{"style":283},[1142],{"type":52,"value":750},{"type":46,"tag":276,"props":1144,"children":1145},{"style":289},[1146],{"type":52,"value":1147}," test",{"type":46,"tag":276,"props":1149,"children":1150},{"style":289},[1151],{"type":52,"value":1152}," -Dsuites=com.udf.CudfComparisonTest",{"type":46,"tag":276,"props":1154,"children":1155},{"style":289},[1156],{"type":52,"value":1157}," -Pcuda-native-udf\n",{"type":46,"tag":145,"props":1159,"children":1160},{},[1161],{"type":52,"value":1162},"To run the tests inside the Docker build environment:",{"type":46,"tag":265,"props":1164,"children":1166},{"className":267,"code":1165,"language":269,"meta":270,"style":270},"docker run --rm --gpus all \\\n  --user \"$(id -u):$(id -g)\" \\\n  -e HOME=\u002Fworkspace \\\n  -v \"$PWD\":\u002Fworkspace \\\n  -v \"$HOME\u002F.m2\":\u002Fworkspace\u002F.m2 \\\n  -v \u002Fetc\u002Fpasswd:\u002Fetc\u002Fpasswd:ro \\\n  -v \u002Fetc\u002Fgroup:\u002Fetc\u002Fgroup:ro \\\n  -w \u002Fworkspace \\\n  cuda-udf-build \\\n  -c \"mvn -B -Dmaven.repo.local=\u002Fworkspace\u002F.m2\u002Frepository test -Dsuites=com.udf.CudfComparisonTest -Pcuda-native-udf -Dnative.build.path=\u002Fworkspace\u002Ftarget\u002Fnative-build-docker -DskipCudfExtraction=true\"\n",[1167],{"type":46,"tag":109,"props":1168,"children":1169},{"__ignoreMap":270},[1170,1197,1244,1259,1286,1317,1333,1349,1364,1375],{"type":46,"tag":276,"props":1171,"children":1172},{"class":278,"line":279},[1173,1177,1181,1185,1189,1193],{"type":46,"tag":276,"props":1174,"children":1175},{"style":283},[1176],{"type":52,"value":785},{"type":46,"tag":276,"props":1178,"children":1179},{"style":289},[1180],{"type":52,"value":851},{"type":46,"tag":276,"props":1182,"children":1183},{"style":289},[1184],{"type":52,"value":856},{"type":46,"tag":276,"props":1186,"children":1187},{"style":289},[1188],{"type":52,"value":861},{"type":46,"tag":276,"props":1190,"children":1191},{"style":289},[1192],{"type":52,"value":866},{"type":46,"tag":276,"props":1194,"children":1195},{"style":300},[1196],{"type":52,"value":871},{"type":46,"tag":276,"props":1198,"children":1199},{"class":278,"line":356},[1200,1204,1208,1212,1216,1220,1224,1228,1232,1236,1240],{"type":46,"tag":276,"props":1201,"children":1202},{"style":289},[1203],{"type":52,"value":880},{"type":46,"tag":276,"props":1205,"children":1206},{"style":306},[1207],{"type":52,"value":885},{"type":46,"tag":276,"props":1209,"children":1210},{"style":283},[1211],{"type":52,"value":890},{"type":46,"tag":276,"props":1213,"children":1214},{"style":289},[1215],{"type":52,"value":895},{"type":46,"tag":276,"props":1217,"children":1218},{"style":306},[1219],{"type":52,"value":900},{"type":46,"tag":276,"props":1221,"children":1222},{"style":289},[1223],{"type":52,"value":905},{"type":46,"tag":276,"props":1225,"children":1226},{"style":306},[1227],{"type":52,"value":910},{"type":46,"tag":276,"props":1229,"children":1230},{"style":283},[1231],{"type":52,"value":890},{"type":46,"tag":276,"props":1233,"children":1234},{"style":289},[1235],{"type":52,"value":919},{"type":46,"tag":276,"props":1237,"children":1238},{"style":306},[1239],{"type":52,"value":924},{"type":46,"tag":276,"props":1241,"children":1242},{"style":300},[1243],{"type":52,"value":871},{"type":46,"tag":276,"props":1245,"children":1246},{"class":278,"line":841},[1247,1251,1255],{"type":46,"tag":276,"props":1248,"children":1249},{"style":289},[1250],{"type":52,"value":937},{"type":46,"tag":276,"props":1252,"children":1253},{"style":289},[1254],{"type":52,"value":942},{"type":46,"tag":276,"props":1256,"children":1257},{"style":300},[1258],{"type":52,"value":871},{"type":46,"tag":276,"props":1260,"children":1261},{"class":278,"line":874},[1262,1266,1270,1274,1278,1282],{"type":46,"tag":276,"props":1263,"children":1264},{"style":289},[1265],{"type":52,"value":955},{"type":46,"tag":276,"props":1267,"children":1268},{"style":306},[1269],{"type":52,"value":823},{"type":46,"tag":276,"props":1271,"children":1272},{"style":300},[1273],{"type":52,"value":964},{"type":46,"tag":276,"props":1275,"children":1276},{"style":306},[1277],{"type":52,"value":969},{"type":46,"tag":276,"props":1279,"children":1280},{"style":289},[1281],{"type":52,"value":974},{"type":46,"tag":276,"props":1283,"children":1284},{"style":300},[1285],{"type":52,"value":871},{"type":46,"tag":276,"props":1287,"children":1288},{"class":278,"line":931},[1289,1293,1297,1301,1305,1309,1313],{"type":46,"tag":276,"props":1290,"children":1291},{"style":289},[1292],{"type":52,"value":955},{"type":46,"tag":276,"props":1294,"children":1295},{"style":306},[1296],{"type":52,"value":823},{"type":46,"tag":276,"props":1298,"children":1299},{"style":300},[1300],{"type":52,"value":828},{"type":46,"tag":276,"props":1302,"children":1303},{"style":289},[1304],{"type":52,"value":833},{"type":46,"tag":276,"props":1306,"children":1307},{"style":306},[1308],{"type":52,"value":969},{"type":46,"tag":276,"props":1310,"children":1311},{"style":289},[1312],{"type":52,"value":1007},{"type":46,"tag":276,"props":1314,"children":1315},{"style":300},[1316],{"type":52,"value":871},{"type":46,"tag":276,"props":1318,"children":1319},{"class":278,"line":949},[1320,1324,1329],{"type":46,"tag":276,"props":1321,"children":1322},{"style":289},[1323],{"type":52,"value":955},{"type":46,"tag":276,"props":1325,"children":1326},{"style":289},[1327],{"type":52,"value":1328}," \u002Fetc\u002Fpasswd:\u002Fetc\u002Fpasswd:ro",{"type":46,"tag":276,"props":1330,"children":1331},{"style":300},[1332],{"type":52,"value":871},{"type":46,"tag":276,"props":1334,"children":1335},{"class":278,"line":981},[1336,1340,1345],{"type":46,"tag":276,"props":1337,"children":1338},{"style":289},[1339],{"type":52,"value":955},{"type":46,"tag":276,"props":1341,"children":1342},{"style":289},[1343],{"type":52,"value":1344}," \u002Fetc\u002Fgroup:\u002Fetc\u002Fgroup:ro",{"type":46,"tag":276,"props":1346,"children":1347},{"style":300},[1348],{"type":52,"value":871},{"type":46,"tag":276,"props":1350,"children":1351},{"class":278,"line":1014},[1352,1356,1360],{"type":46,"tag":276,"props":1353,"children":1354},{"style":289},[1355],{"type":52,"value":1020},{"type":46,"tag":276,"props":1357,"children":1358},{"style":289},[1359],{"type":52,"value":1025},{"type":46,"tag":276,"props":1361,"children":1362},{"style":300},[1363],{"type":52,"value":871},{"type":46,"tag":276,"props":1365,"children":1366},{"class":278,"line":1032},[1367,1371],{"type":46,"tag":276,"props":1368,"children":1369},{"style":289},[1370],{"type":52,"value":1038},{"type":46,"tag":276,"props":1372,"children":1373},{"style":300},[1374],{"type":52,"value":871},{"type":46,"tag":276,"props":1376,"children":1377},{"class":278,"line":1045},[1378,1382,1386,1391],{"type":46,"tag":276,"props":1379,"children":1380},{"style":289},[1381],{"type":52,"value":1051},{"type":46,"tag":276,"props":1383,"children":1384},{"style":306},[1385],{"type":52,"value":823},{"type":46,"tag":276,"props":1387,"children":1388},{"style":289},[1389],{"type":52,"value":1390},"mvn -B -Dmaven.repo.local=\u002Fworkspace\u002F.m2\u002Frepository test -Dsuites=com.udf.CudfComparisonTest -Pcuda-native-udf -Dnative.build.path=\u002Fworkspace\u002Ftarget\u002Fnative-build-docker -DskipCudfExtraction=true",{"type":46,"tag":276,"props":1392,"children":1393},{"style":306},[1394],{"type":52,"value":838},{"type":46,"tag":145,"props":1396,"children":1397},{},[1398],{"type":52,"value":1399},"If tests fail, iterate on the Java bridge or native implementation.",{"type":46,"tag":681,"props":1401,"children":1403},{"id":1402},"difficult-test-failures",[1404],{"type":52,"value":1405},"Difficult Test Failures",{"type":46,"tag":145,"props":1407,"children":1408},{},[1409],{"type":52,"value":1410},"Treat the unit test as the CPU behavior specification. Do not weaken or remove test cases silently.",{"type":46,"tag":62,"props":1412,"children":1413},{},[1414,1427,1432],{"type":46,"tag":68,"props":1415,"children":1416},{},[1417,1419,1425],{"type":52,"value":1418},"Tests that check for CPU errors may not be directly applicable to a columnar implementation: the GPU path typically evaluates a whole column and may produce nulls for invalid rows instead of throwing row-level exceptions. If this causes an unavoidable mismatch, add a clear comment in the test and a ",{"type":46,"tag":109,"props":1420,"children":1422},{"className":1421},[],[1423],{"type":52,"value":1424},"TODO\u002FNOTE",{"type":52,"value":1426}," in the implementation explaining the mismatch.",{"type":46,"tag":68,"props":1428,"children":1429},{},[1430],{"type":52,"value":1431},"If a test case does not pass because of inherent CUDA\u002Flibcudf\u002FAPI limitations or low-level GPU\u002FCPU semantic differences, comment out the conflicting assertion\u002Ftest only after documenting how you tried to make the behavior match and why those attempts failed. Add a note to the user.",{"type":46,"tag":68,"props":1433,"children":1434},{},[1435,1437,1442],{"type":52,"value":1436},"If the behavior is important, common, or part of the documented input domain, ",{"type":46,"tag":149,"props":1438,"children":1439},{},[1440],{"type":52,"value":1441},"always prefer fixing the implementation",{"type":52,"value":1443}," over commenting out the test case. The exception is a performance-vs-correctness tradeoff that the user explicitly approves.",{"type":46,"tag":55,"props":1445,"children":1447},{"id":1446},"step-6-run-judge-subagent-if-requested",[1448],{"type":52,"value":1449},"Step 6: Run Judge Subagent If Requested",{"type":46,"tag":145,"props":1451,"children":1452},{},[1453,1455,1460,1462,1468,1470,1475,1477,1483,1485,1491],{"type":52,"value":1454},"If the user explicitly asked for the judge, a judge subagent, or a review agent, treat that as an explicit request for delegation: you ",{"type":46,"tag":149,"props":1456,"children":1457},{},[1458],{"type":52,"value":1459},"MUST",{"type":52,"value":1461}," launch a separate subagent with ",{"type":46,"tag":109,"props":1463,"children":1465},{"className":1464},[],[1466],{"type":52,"value":1467},"model: inherit",{"type":52,"value":1469}," and instruct it to use the ",{"type":46,"tag":149,"props":1471,"children":1472},{},[1473],{"type":52,"value":1474},"udf-judge-conversion",{"type":52,"value":1476}," skill. Ask it to review the ",{"type":46,"tag":109,"props":1478,"children":1480},{"className":1479},[],[1481],{"type":52,"value":1482},"UnitTest",{"type":52,"value":1484},", ",{"type":46,"tag":109,"props":1486,"children":1488},{"className":1487},[],[1489],{"type":52,"value":1490},"CudfComparisonTest",{"type":52,"value":1492},", Java bridge, and JNI\u002FCUDA sources.",{"type":46,"tag":145,"props":1494,"children":1495},{},[1496],{"type":52,"value":1497},"If the user did not request a judge\u002Freview agent, mark this step as skipped and continue to Step 7. If a required judge subagent is blocked by tool policy, stop and tell the user that explicit permission\u002Finstruction is needed.",{"type":46,"tag":145,"props":1499,"children":1500},{},[1501],{"type":52,"value":1502},"If you run the judge, wait for it to complete and review its report. If the judge finds any issues, 1) fix the issues, 2) re-run the tests, and 3) re-run the judge subagent.",{"type":46,"tag":55,"props":1504,"children":1506},{"id":1505},"step-7-review-conversion",[1507],{"type":52,"value":1508},"Step 7: Review Conversion",{"type":46,"tag":145,"props":1510,"children":1511},{},[1512],{"type":52,"value":1513},"Review your own work to ensure:",{"type":46,"tag":62,"props":1515,"children":1516},{},[1517,1522,1527,1539],{"type":46,"tag":68,"props":1518,"children":1519},{},[1520],{"type":52,"value":1521},"The test runs on the GPU and directly compares CPU-GPU outputs",{"type":46,"tag":68,"props":1523,"children":1524},{},[1525],{"type":52,"value":1526},"The implementation does not overfit to test cases",{"type":46,"tag":68,"props":1528,"children":1529},{},[1530,1532,1537],{"type":52,"value":1531},"No ",{"type":46,"tag":109,"props":1533,"children":1535},{"className":1534},[],[1536],{"type":52,"value":703},{"type":52,"value":1538}," or row-by-row GPU-to-CPU copying is used for computation",{"type":46,"tag":68,"props":1540,"children":1541},{},[1542,1544,1550],{"type":52,"value":1543},"No debug statements (e.g., ",{"type":46,"tag":109,"props":1545,"children":1547},{"className":1546},[],[1548],{"type":52,"value":1549},"TableDebug.get().debug(...)",{"type":52,"value":1551},") remain in final output",{"type":46,"tag":55,"props":1553,"children":1555},{"id":1554},"output",[1556],{"type":52,"value":1557},"Output",{"type":46,"tag":145,"props":1559,"children":1560},{},[1561],{"type":52,"value":1562},"Upon successful completion:",{"type":46,"tag":62,"props":1564,"children":1565},{},[1566,1577,1588,1593],{"type":46,"tag":68,"props":1567,"children":1568},{},[1569,1571],{"type":52,"value":1570},"Native RapidsUDF file at ",{"type":46,"tag":109,"props":1572,"children":1574},{"className":1573},[],[1575],{"type":52,"value":1576},"src\u002Fmain\u002Fjava\u002Fcom\u002Fudf\u002F\u003CCamelName>NativeRapidsUDF.java",{"type":46,"tag":68,"props":1578,"children":1579},{},[1580,1582],{"type":52,"value":1581},"JNI\u002FCUDA sources under ",{"type":46,"tag":109,"props":1583,"children":1585},{"className":1584},[],[1586],{"type":52,"value":1587},"native\u002Fsrc\u002Fmain\u002Fcpp\u002Fsrc\u002F",{"type":46,"tag":68,"props":1589,"children":1590},{},[1591],{"type":52,"value":1592},"Packaged native library in the generated UDF JAR",{"type":46,"tag":68,"props":1594,"children":1595},{},[1596],{"type":52,"value":1597},"Comparison test passes",{"type":46,"tag":145,"props":1599,"children":1600},{},[1601,1603,1608],{"type":52,"value":1602},"These outputs are required for ",{"type":46,"tag":149,"props":1604,"children":1605},{},[1606],{"type":52,"value":1607},"Step 3: Benchmark",{"type":52,"value":435},{"type":46,"tag":1610,"props":1611,"children":1612},"style",{},[1613],{"type":52,"value":1614},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1616,"total":981},[1617,1632,1639,1650,1663,1675,1689],{"slug":1618,"name":1618,"fn":1619,"description":1620,"org":1621,"tags":1622,"stars":23,"repoUrl":24,"updatedAt":1631},"udf-benchmark","benchmark Spark UDF performance on GPU","Assists with benchmarking and profiling the performance of an Apache Spark UDF on the GPU. This is step 3 of 3 in the UDF conversion workflow (udf-gen-test -> udf-convert-to-* -> udf-benchmark). Use this skill when you have a CPU UDF and a RapidsUDF or SQL implementation, and need to benchmark the performance of the CPU UDF against the GPU implementation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1623,1626,1627,1630],{"name":1624,"slug":1625,"type":15},"Benchmarking","benchmarking",{"name":9,"slug":8,"type":15},{"name":1628,"slug":1629,"type":15},"Performance","performance",{"name":21,"slug":22,"type":15},"2026-07-14T05:30:56.546112",{"slug":4,"name":4,"fn":5,"description":6,"org":1633,"tags":1634,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1635,1636,1637,1638],{"name":18,"slug":19,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},{"slug":1640,"name":1640,"fn":1641,"description":1642,"org":1643,"tags":1644,"stars":23,"repoUrl":24,"updatedAt":1649},"udf-convert-to-cudf","convert Spark UDFs to GPU-accelerated RapidsUDFs","Assists with converting an Apache Spark UDF to a GPU-accelerated RapidsUDF using cuDF Java APIs. This is step 2 of 3 in the UDF conversion workflow (udf-gen-test -> udf-convert-to-cudf -> udf-benchmark). Use this skill when you have a CPU UDF with a unit test and need to convert it to a RapidsUDF.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1645,1646,1647,1648],{"name":18,"slug":19,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"2026-07-14T05:30:54.048693",{"slug":1651,"name":1651,"fn":1652,"description":1653,"org":1654,"tags":1655,"stars":23,"repoUrl":24,"updatedAt":1662},"udf-convert-to-sql","convert Spark UDFs to SQL expressions","Assists with converting an Apache Spark UDF to a functionally equivalent Spark SQL expression. This is step 2 of 3 in the UDF conversion workflow (udf-gen-test -> udf-convert-to-sql -> udf-benchmark). Use this skill when you have a CPU UDF with a unit test and need to convert it to SQL for GPU acceleration.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1656,1657,1658,1659],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},{"name":1660,"slug":1661,"type":15},"SQL","sql","2026-07-14T05:30:57.785224",{"slug":175,"name":175,"fn":1664,"description":1665,"org":1666,"tags":1667,"stars":23,"repoUrl":24,"updatedAt":1674},"generate unit tests for Spark UDFs","Assists with generating a unit test for an Apache Spark UDF. This is step 1 of 3 in the UDF conversion workflow (udf-gen-test -> udf-convert-to-* -> udf-benchmark). Use this skill when you have a CPU UDF and need to create a unit test for the UDF before converting it into a GPU-compatible implementation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1668,1669,1670,1671],{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},{"name":1672,"slug":1673,"type":15},"Testing","testing","2026-07-14T05:30:55.30163",{"slug":1474,"name":1474,"fn":1676,"description":1677,"org":1678,"tags":1679,"stars":23,"repoUrl":24,"updatedAt":1688},"review UDF tests and GPU implementations","Reviews generated UDF tests and GPU\u002FSQL implementations for robustness, anti-cheating, and GPU execution integrity. Use when the user requests a judge\u002Freview-agent pass, or when manually reviewing a completed conversion.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1680,1683,1684,1685],{"name":1681,"slug":1682,"type":15},"Code Review","code-review",{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":1686,"slug":1687,"type":15},"QA","qa","2026-07-14T05:30:59.022808",{"slug":1690,"name":1690,"fn":1691,"description":1692,"org":1693,"tags":1694,"stars":23,"repoUrl":24,"updatedAt":1699},"udf-optimize-cudf","optimize cuDF RapidsUDF performance","Iteratively optimizes a cuDF RapidsUDF implementation for GPU performance. Use after testing and benchmarking with udf-benchmark. Runs a loop of profiling, optimizing, testing, and benchmarking until performance converges or the iteration budget is exhausted.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1695,1696,1697,1698],{"name":1624,"slug":1625,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":1628,"slug":1629,"type":15},"2026-07-14T05:30:52.785634",{"items":1701,"total":1854},[1702,1720,1738,1749,1761,1775,1788,1802,1811,1822,1834,1843],{"slug":1703,"name":1703,"fn":1704,"description":1705,"org":1706,"tags":1707,"stars":1717,"repoUrl":1718,"updatedAt":1719},"nemoclaw-user-guide","retrieve NemoClaw documentation and configuration","Guides human users' AI agents to the NemoClaw docs MCP server and canonical Fern documentation in Markdown form. Use when users ask how to install, configure, operate, troubleshoot, secure, or learn NemoClaw with an AI coding assistant. Trigger keywords - nemoclaw docs, use nemoclaw with ai agent, nemoclaw mcp docs, nemoclaw install help, nemoclaw quickstart, nemoclaw markdown docs, llms.txt, agent skills.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1708,1711,1714],{"name":1709,"slug":1710,"type":15},"Documentation","documentation",{"name":1712,"slug":1713,"type":15},"MCP","mcp",{"name":1715,"slug":1716,"type":15},"Search","search",21777,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FNemoClaw","2026-07-20T06:00:01.461044",{"slug":1721,"name":1721,"fn":1722,"description":1723,"org":1724,"tags":1725,"stars":1735,"repoUrl":1736,"updatedAt":1737},"mcore-build-and-dependency","manage Megatron-LM development environments","Container-based dev environment setup and dependency management for Megatron-LM. Covers acquiring and launching the CI container, uv package management, and updating uv.lock.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1726,1729,1732],{"name":1727,"slug":1728,"type":15},"Containers","containers",{"name":1730,"slug":1731,"type":15},"Deployment","deployment",{"name":1733,"slug":1734,"type":15},"Python","python",17049,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FMegatron-LM","2026-07-27T06:06:11.249662",{"slug":1739,"name":1739,"fn":1740,"description":1741,"org":1742,"tags":1743,"stars":1735,"repoUrl":1736,"updatedAt":1748},"mcore-bump-base-image","update NVIDIA PyTorch base images","Bump the NVIDIA PyTorch base image (`nvcr.io\u002Fnvidia\u002Fpytorch:YY.MM-py3`) used by Megatron-LM CI. Covers the two pin sites (GitHub CI in `docker\u002F.ngc_version.dev` and GitLab CI in `.gitlab\u002Fstages\u002F01.build.yml`), the post-bump CI loop (re-run functional tests, refresh golden values, mark broken tests), and the gotchas that bit PRs",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1744,1747],{"name":1745,"slug":1746,"type":15},"CI\u002FCD","ci-cd",{"name":1730,"slug":1731,"type":15},"2026-07-14T05:25:59.97109",{"slug":1750,"name":1750,"fn":1751,"description":1752,"org":1753,"tags":1754,"stars":1735,"repoUrl":1736,"updatedAt":1760},"mcore-cicd","manage CI\u002FCD pipelines for Megatron-LM","CI\u002FCD reference for Megatron-LM. Covers CI pipeline structure, PR scope labels, triggering internal GitLab CI (which force-pushes the current branch to a pull-request\u002FBRANCH ref — always dry-run and verify the destination first; never run against shared or protected branches), and CI failure investigation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1755,1756,1757],{"name":1745,"slug":1746,"type":15},{"name":1730,"slug":1731,"type":15},{"name":1758,"slug":1759,"type":15},"GitHub","github","2026-07-27T06:06:12.278222",{"slug":1762,"name":1762,"fn":1763,"description":1764,"org":1765,"tags":1766,"stars":1735,"repoUrl":1736,"updatedAt":1774},"mcore-create-issue","investigate CI failures and create issues","Investigate a failing GitHub Actions run or job and create a GitHub issue for the failure.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1767,1770,1771],{"name":1768,"slug":1769,"type":15},"Debugging","debugging",{"name":1758,"slug":1759,"type":15},{"name":1772,"slug":1773,"type":15},"Triage","triage","2026-07-14T05:25:57.442089",{"slug":1776,"name":1776,"fn":1777,"description":1778,"org":1779,"tags":1780,"stars":1735,"repoUrl":1736,"updatedAt":1787},"mcore-linting-and-formatting","lint and format Megatron-LM code","Linting and formatting for Megatron-LM. Covers running autoformat.sh, tools (ruff, black, isort, pylint, mypy), and code style rules.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1781,1784],{"name":1782,"slug":1783,"type":15},"Best Practices","best-practices",{"name":1785,"slug":1786,"type":15},"Code Analysis","code-analysis","2026-07-14T05:25:56.18433",{"slug":1789,"name":1789,"fn":1790,"description":1791,"org":1792,"tags":1793,"stars":1735,"repoUrl":1736,"updatedAt":1801},"mcore-migrate-gpt-to-hybrid","migrate Megatron-LM models to HybridModel","Migration guide for moving Megatron Core GPTModel checkpoints, model providers, training commands, and layer mappings to HybridModel.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1794,1797,1800],{"name":1795,"slug":1796,"type":15},"Machine Learning","machine-learning",{"name":1798,"slug":1799,"type":15},"Migration","migration",{"name":9,"slug":8,"type":15},"2026-07-17T06:07:11.777011",{"slug":1803,"name":1803,"fn":1804,"description":1805,"org":1806,"tags":1807,"stars":1735,"repoUrl":1736,"updatedAt":1810},"mcore-onboard-gb200-1node-tests","onboard functional tests for GB200","Onboard 1-node GitHub MR functional tests for GB200 from existing mr-scoped 2-node tests.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1808,1809],{"name":1686,"slug":1687,"type":15},{"name":1672,"slug":1673,"type":15},"2026-07-14T05:25:53.673039",{"slug":1812,"name":1812,"fn":1813,"description":1814,"org":1815,"tags":1816,"stars":1735,"repoUrl":1736,"updatedAt":1821},"mcore-run-on-slurm","launch distributed training jobs on SLURM","How to launch distributed Megatron-LM training jobs on a SLURM cluster. Covers a minimal sbatch skeleton, environment-variable setup for torch.distributed.run, CUDA_DEVICE_MAX_CONNECTIONS rules across hardware and parallelism modes, container conventions, monitoring, and per-rank failure diagnosis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1817,1818],{"name":1730,"slug":1731,"type":15},{"name":1819,"slug":1820,"type":15},"Infrastructure","infrastructure","2026-07-14T05:25:49.362534",{"slug":1823,"name":1823,"fn":1824,"description":1825,"org":1826,"tags":1827,"stars":1735,"repoUrl":1736,"updatedAt":1833},"mcore-split-pr","split pull requests to reduce review load","Split a PR into multiple PRs to reduce the number of required CODEOWNERS reviewer groups.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1828,1829,1830],{"name":1681,"slug":1682,"type":15},{"name":1758,"slug":1759,"type":15},{"name":1831,"slug":1832,"type":15},"Pull Requests","pull-requests","2026-07-14T05:26:01.226578",{"slug":1835,"name":1835,"fn":1836,"description":1837,"org":1838,"tags":1839,"stars":1735,"repoUrl":1736,"updatedAt":1842},"mcore-testing","run and manage Megatron-LM tests","Test system for Megatron-LM. Covers test layout, recipe YAML structure, adding and running unit and functional tests, golden values, marker filters, and CI parity.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1840,1841],{"name":1686,"slug":1687,"type":15},{"name":1672,"slug":1673,"type":15},"2026-07-14T05:25:54.928983",{"slug":1844,"name":1844,"fn":1845,"description":1846,"org":1847,"tags":1848,"stars":1735,"repoUrl":1736,"updatedAt":1853},"nightly-sync","manage nightly main-to-dev sync workflows","Domain knowledge for the nightly main-to-dev sync workflow. Covers merge strategy, CI architecture, failure investigation, and known issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1849,1852],{"name":1850,"slug":1851,"type":15},"Automation","automation",{"name":1745,"slug":1746,"type":15},"2026-07-30T05:29:03.275638",496]