Sparse-checkout from NVIDIA/cccl main branch to complete cccl_upstream: Added: - python/cuda_cccl/ (226 files) — Python bindings for device-level algorithms Critical for muh toolchain: cuda.compute.reduce_into, scan, radix_sort, etc. Includes 204 .py files with full test coverage for all 27 algorithms - ci/ (163 files) — Build/test infrastructure build_cub.sh, test_cub.sh, build_and_test_targets.sh, matrix.yaml Directly maps to our [INFRA-CI] and [INFRA-BUILD] items - .agent/skills/ (7 files) — NVIDIA's own agent skills for CCCL cccl-style/SKILL.md, cccl-test/SKILL.md, sass-diff/SKILL.md - docs/ (491 files) — Official CCCL documentation CI references, CMake guides, Python compute docs, libcudacxx PTX docs - test/ (12 files) — Top-level integration tests (cuda_smoke, stdpar) - Root configs: .clang-format, .clang-tidy, CONTRIBUTING.md, pyproject.toml - CLAUDE.md symlink → AGENTS.md (NVIDIA's standard) cccl_upstream now mirrors full NVIDIA/cccl structure: Before: 42M (cub + thrust + libcudacxx + cudax + c + examples + benchmarks) After: 53M (+python +ci +docs +.agent +test +configs) This completes the CCCL base needed for: - [muh-bench] items: ci/util/build_and_test_targets.sh for targeted builds - [CCCL-verify] items: python/cuda_cccl/tests/ as reference implementations - [CCCL-test] items: ci/test_cub.sh, ci/test_thrust.sh - Agent workflow: .agent/skills/ for consistent style and test patterns
454 lines
12 KiB
XML
454 lines
12 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<ComputeSanitizerOutput>
|
|
<!--
|
|
thrust::equal reduces using an accumulator type tuple<bool, OffsetT>.
|
|
The padding bytes inside the tuple are not initialized.
|
|
This causes issues during `cub::ThreadLoad`, which loads the memory as aliased
|
|
machine words that are cast to the tuple type.
|
|
-->
|
|
<record>
|
|
<kind>Initcheck</kind>
|
|
<what>
|
|
<text>Uninitialized __global__ memory read of size 2 bytes</text>
|
|
<size>2</size>
|
|
</what>
|
|
<where>
|
|
<func>ThreadLoad</func>
|
|
</where>
|
|
<deviceStack>
|
|
<frame>
|
|
<func>UnrolledThreadLoadImpl</func>
|
|
</frame>
|
|
<frame>
|
|
<func>UnrolledThreadLoad</func>
|
|
</frame>
|
|
<frame>
|
|
<func>ThreadLoad</func>
|
|
</frame>
|
|
<frame>
|
|
<func>ThreadLoad</func>
|
|
</frame>
|
|
</deviceStack>
|
|
<hostStack>
|
|
<frame>
|
|
<module>.*libcuda.so.*</module>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>cudaLaunchKernel</func>
|
|
</frame>
|
|
<frame>
|
|
<func>.*cub::.*::DeviceReduce.*.*thrust::.*find_if.*</func>
|
|
</frame>
|
|
</hostStack>
|
|
</record>
|
|
<!--
|
|
Similar to the above, thrust::equal copies a tuple<bool, OffsetT> from host -> device
|
|
with the result of the comparison. The padding bytes trigger host API initialization
|
|
errors during the cudaMemcpy.
|
|
Sadly, this is a very generic suppression that may hide real issues, but it's the best
|
|
we can do given the current tooling.
|
|
-->
|
|
<record>
|
|
<kind>InitcheckApiError</kind>
|
|
<level>Error</level>
|
|
<what>
|
|
<text>Host API uninitialized memory access</text>
|
|
<accessSize>16</accessSize>
|
|
</what>
|
|
<hostStack>
|
|
<saveLocation>error</saveLocation>
|
|
<frame>
|
|
<module>.*/libcuda.so.*</module>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static_.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static_.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>cudaMemcpyAsync</func>
|
|
</frame>
|
|
<frame>
|
|
<func>void C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_.*</func>
|
|
</frame>
|
|
</hostStack>
|
|
</record>
|
|
<!-- Another variant of the above with a different catch2 dispatcher -->
|
|
<record>
|
|
<kind>InitcheckApiError</kind>
|
|
<level>Error</level>
|
|
<what>
|
|
<text>Host API uninitialized memory access</text>
|
|
<accessSize>16</accessSize>
|
|
</what>
|
|
<hostStack>
|
|
<saveLocation>error</saveLocation>
|
|
<frame>
|
|
<module>.*/libcuda.so.*</module>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static_.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static_.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>cudaMemcpyAsync</func>
|
|
</frame>
|
|
<frame>
|
|
<func>void CATCH2_INTERNAL_TEMPLATE_TEST.*</func>
|
|
</frame>
|
|
</hostStack>
|
|
</record>
|
|
<!-- Yet another instance of that tuple<Offset, bool> padding -->
|
|
<record>
|
|
<kind>InitcheckApiError</kind>
|
|
<level>Error</level>
|
|
<what>
|
|
<text>Host API uninitialized memory access</text>
|
|
<accessSize>16</accessSize>
|
|
</what>
|
|
<hostStack>
|
|
<saveLocation>error</saveLocation>
|
|
<frame>
|
|
<module>.*libcuda.so.*</module>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>cudaMemcpyAsync</func>
|
|
</frame>
|
|
<frame>
|
|
<func>.*thrust::.*(equal|operator==|mismatch|find_if).*</func>
|
|
</frame>
|
|
</hostStack>
|
|
</record>
|
|
<!-- Yet another instance of that tuple<Offset, bool> padding -->
|
|
<record>
|
|
<kind>InitcheckApiError</kind>
|
|
<level>Error</level>
|
|
<what>
|
|
<text>Host API uninitialized memory access</text>
|
|
<accessSize>16</accessSize>
|
|
</what>
|
|
<hostStack>
|
|
<saveLocation>error</saveLocation>
|
|
<frame>
|
|
<module>.*libcuda.so.*</module>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>cudaMemcpyAsync</func>
|
|
</frame>
|
|
<frame>
|
|
<func>bool binary_equal.*</func> <!-- Implementation detail of CUB's block radix sort tests, calls thrust::equal -->
|
|
</frame>
|
|
</hostStack>
|
|
</record>
|
|
<!-- Yet another instance of that tuple<Offset, bool> padding -->
|
|
<record>
|
|
<kind>InitcheckApiError</kind>
|
|
<level>Error</level>
|
|
<what>
|
|
<text>Host API uninitialized memory access</text>
|
|
<accessSize>16</accessSize>
|
|
</what>
|
|
<hostStack>
|
|
<saveLocation>error</saveLocation>
|
|
<frame>
|
|
<module>.*libcuda.so.*</module>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>cudaMemcpyAsync</func>
|
|
</frame>
|
|
<frame>
|
|
<!-- CUB's namespace_wrapped test has this issue inlined into main: -->
|
|
<func>main</func>
|
|
<module>.*cub.*test.namespace_wrapped</module>
|
|
</frame>
|
|
</hostStack>
|
|
</record>
|
|
<!-- Yet another instance of that tuple<Offset, bool> padding -->
|
|
<record>
|
|
<kind>InitcheckApiError</kind>
|
|
<what>
|
|
<text>Host API uninitialized memory access</text>
|
|
<accessSize>16</accessSize>
|
|
</what>
|
|
<hostStack>
|
|
<saveLocation>error</saveLocation>
|
|
<frame>
|
|
<module>.*libcuda.so.*</module>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>cudaMemcpyAsync</func>
|
|
</frame>
|
|
<frame>
|
|
<!-- The segmented sort test have several stacks that have padding bit issues. -->
|
|
<module>.*cub.*device_segmented_sort.*</module>
|
|
</frame>
|
|
</hostStack>
|
|
</record>
|
|
<!-- Yet another instance of that tuple<Offset, bool> padding -->
|
|
<record>
|
|
<kind>InitcheckApiError</kind>
|
|
<what>
|
|
<text>Host API uninitialized memory access</text>
|
|
<accessSize>16</accessSize>
|
|
</what>
|
|
<hostStack>
|
|
<saveLocation>error</saveLocation>
|
|
<frame>
|
|
<module>.*libcuda.so.*</module>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>cudaMemcpyAsync</func>
|
|
</frame>
|
|
<frame>
|
|
<!-- The RLE tests have several stacks that have padding bit issues. -->
|
|
<module>.*cub.*device_run_length_encode.*</module>
|
|
</frame>
|
|
</hostStack>
|
|
</record>
|
|
<!--
|
|
DeviceRunLengthEncode performs a WarpExchange::ScatterToStriped that 'discards'
|
|
elements by scattering them to the same (ignored) destination address. This
|
|
triggers a WAW race that we can safely ignore.
|
|
-->
|
|
<record>
|
|
<kind>Analysis</kind>
|
|
<level>Error</level>
|
|
<what>
|
|
<text>Race condition</text>
|
|
<source>
|
|
<direction>Write</direction>
|
|
<where>
|
|
<func>ScatterToStriped</func>
|
|
</where>
|
|
</source>
|
|
<destination>
|
|
<direction>Write</direction>
|
|
<where>
|
|
<func>ScatterToStriped</func>
|
|
</where>
|
|
</destination>
|
|
<destination>
|
|
<direction>Write</direction>
|
|
<where>
|
|
<func>ScatterToStriped</func>
|
|
</where>
|
|
</destination>
|
|
<destination>
|
|
<direction>Write</direction>
|
|
<where>
|
|
<func>ScatterToStriped</func>
|
|
</where>
|
|
</destination>
|
|
</what>
|
|
</record>
|
|
<!-- Another variation of the above -->
|
|
<record>
|
|
<kind>Analysis</kind>
|
|
<level>Error</level>
|
|
<what>
|
|
<text>Race condition</text>
|
|
<source>
|
|
<direction>Write</direction>
|
|
<where>
|
|
<func>ScatterToStriped</func>
|
|
</where>
|
|
</source>
|
|
<destination>
|
|
<direction>Write</direction>
|
|
<where>
|
|
<func>ScatterToStriped</func>
|
|
</where>
|
|
</destination>
|
|
</what>
|
|
</record>
|
|
<!-- Another variation of the above -->
|
|
<record>
|
|
<kind>Analysis</kind>
|
|
<level>Error</level>
|
|
<what>
|
|
<text>Race condition</text>
|
|
<source>
|
|
<direction>Write</direction>
|
|
<where>
|
|
<func>ScatterToStriped</func>
|
|
</where>
|
|
</source>
|
|
<destination>
|
|
<direction>Write</direction>
|
|
<where>
|
|
<func>ScatterToStriped</func>
|
|
</where>
|
|
</destination>
|
|
<destination>
|
|
<direction>Write</direction>
|
|
<where>
|
|
<func>ScatterToStriped</func>
|
|
</where>
|
|
</destination>
|
|
</what>
|
|
</record>
|
|
<!--
|
|
There are uninitialized padding bits inside cub::ConstantInputIterator,
|
|
which is basically a struct{ T value; ptrdiff_t offset; }.
|
|
-->
|
|
<record>
|
|
<kind>InitcheckApiError</kind>
|
|
<level>Error</level>
|
|
<what>
|
|
<text>Host API uninitialized memory access</text>
|
|
<accessSize>32</accessSize>
|
|
</what>
|
|
<hostStack>
|
|
<saveLocation>error</saveLocation>
|
|
<frame>
|
|
<module>.*libcuda.so.*</module>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static_.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static_.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>cudaMemcpyAsync</func>
|
|
</frame>
|
|
<frame>
|
|
<func>thrust.*vector_base.*ConstantInputIterator.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>void test_iterator.*ConstantInputIterator.*</func>
|
|
</frame>
|
|
</hostStack>
|
|
</record>
|
|
<!--
|
|
Similar to the above; cub::TransformInputIterator is a struct{TransformOp op; InputIterT iter;}.
|
|
In this case TransformOp is 1 byte, and InputIterT is an 8-byte pointer.
|
|
Padding bits strike again.
|
|
-->
|
|
<record>
|
|
<kind>InitcheckApiError</kind>
|
|
<level>Error</level>
|
|
<what>
|
|
<text>Host API uninitialized memory access</text>
|
|
<accessSize>32</accessSize>
|
|
</what>
|
|
<hostStack>
|
|
<saveLocation>error</saveLocation>
|
|
<frame>
|
|
<module>.*/libcuda.so.*</module>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static_.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static_.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>cudaMemcpyAsync</func>
|
|
</frame>
|
|
<frame>
|
|
<func>thrust.*vector_base.*TransformInputIterator.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>void test_iterator.*TransformInputIterator.*</func>
|
|
</frame>
|
|
</hostStack>
|
|
</record>
|
|
<!--
|
|
Same as above; this time InputIterT is a cub::TexObjInputIterator.
|
|
-->
|
|
<record>
|
|
<kind>InitcheckApiError</kind>
|
|
<level>Error</level>
|
|
<what>
|
|
<text>Host API uninitialized memory access</text>
|
|
<accessSize>64</accessSize>
|
|
</what>
|
|
<hostStack>
|
|
<saveLocation>error</saveLocation>
|
|
<frame>
|
|
<module>.*/libcuda.so.*</module>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static_.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static_.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>cudaMemcpyAsync</func>
|
|
</frame>
|
|
<frame>
|
|
<func>thrust.*vector_base.*TransformInputIterator.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>void test_iterator.*TransformInputIterator.*</func>
|
|
</frame>
|
|
</hostStack>
|
|
</record>
|
|
<!--
|
|
cub.test.device_reduce transfers cub::KeyValuePair<int, unwrap_value_t<...>> from
|
|
device -> host. This suppresses warnings about transferring padding bits inside
|
|
of the KeyValuePair.
|
|
-->
|
|
<record>
|
|
<kind>InitcheckApiError</kind>
|
|
<level>Error</level>
|
|
<what>
|
|
<text>Host API uninitialized memory access</text>
|
|
</what>
|
|
<hostStack>
|
|
<saveLocation>error</saveLocation>
|
|
<frame>
|
|
<module>.*libcuda.so.*</module>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>libcudart_static.*</func>
|
|
</frame>
|
|
<frame>
|
|
<func>cudaMemcpyAsync</func>
|
|
<module>.*cub.*device_(segmented_|)reduce.*</module>
|
|
</frame>
|
|
</hostStack>
|
|
</record>
|
|
</ComputeSanitizerOutput>
|