From bd4371b3c5b1e7946a65750e9488eda3b1314f85 Mon Sep 17 00:00:00 2001 From: YasInvolved Date: Wed, 11 Jun 2025 16:39:54 +0200 Subject: [PATCH 1/2] copy examples to CE container in the build time --- tools/nsc/CMakeLists.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tools/nsc/CMakeLists.txt b/tools/nsc/CMakeLists.txt index bcdcbca531..3fd632221c 100644 --- a/tools/nsc/CMakeLists.txt +++ b/tools/nsc/CMakeLists.txt @@ -166,6 +166,7 @@ endif() make_directory("${NBL_DOCKER_CTX_DIR}/Runtimes") make_directory("${NBL_DOCKER_CTX_DIR}/Nabla") +make_directory("${NBL_DOCKER_CTX_DIR}/Examples") execute_process( COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${DXIL_DLL}" "${NBL_DOCKER_CTX_DIR}/Runtimes" COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${UCRTBASED_DLL}" "${NBL_DOCKER_CTX_DIR}/Runtimes" @@ -206,6 +207,9 @@ COPY --link --from=compress ["C:/pack/windows-artifacts.tar.zst", "C:/pack/"] COPY --link --from=compress ["C:/pack/nabla-artifacts.tar.zst", "C:/pack/"] COPY hlsl.local.properties.cmake C:/Compiler-Explorer/etc/config/hlsl.local.properties +# counting sort +COPY --link Examples/ C:/Compiler-Explorer/examples/hlsl/ + ENV NBL_INSTALL_DIRECTORY=@NBL_DOCKER_CT_NSC_VOLUME_TARGET@ ` NBL_EXPLICIT_MODULE_LOAD_LOG=ON @@ -263,6 +267,8 @@ set(NBL_CE_HEALTHY_CHECK_PY "${NBL_ROOT_PATH}/docker/compiler-explorer/ce_health set(NBL_CE_ENDPOINT_PY "${NBL_ROOT_PATH}/docker/compiler-explorer/endpoint.py") set(NBL_NSC_BASIC_HLSL_JPAYLOAD "${CMAKE_CURRENT_SOURCE_DIR}/docker/godbolt/hlsl-basic-compile-payload.json") +get_target_property(NBL_CE_COUNTING_SORT_EXAMPLE_PATH countingsort SOURCE_DIR) + # to avoid "too long input" errors we proxy build instructions to CMake script and write it to build directory string(CONFIGURE [=[ message(STATUS "Killing remaining NSC orphans") @@ -306,6 +312,11 @@ execute_process(COMMAND "@CMAKE_COMMAND@" -E copy_directory_if_different COMMAND_ERROR_IS_FATAL ANY ) +message(STATUS "Copying examples") +execute_process( + COMMAND "@CMAKE_COMMAND@" -E copy_directory_if_different "@NBL_CE_COUNTING_SORT_EXAMPLE_PATH@/app_resources/" "@NBL_DOCKER_CTX_DIR@/Examples/" +) + message(STATUS "Building NSC Godbolt image") string(TIMESTAMP BUILD_TIMESTAMP "%Y-%m-%dT%H:%M:%SZ" UTC) execute_process(COMMAND "@DOCKER_EXE@" build --isolation process From 4913fe3a68cba64ed078bd3928f1a36d3606f9f1 Mon Sep 17 00:00:00 2001 From: YasInvolved Date: Fri, 20 Jun 2025 21:02:18 +0200 Subject: [PATCH 2/2] make examples compile --- tools/nsc/CMakeLists.txt | 5 +- .../examples/prefix_sum_shader.comp.hlsl | 90 ++++++++++++++++ .../godbolt/examples/scatter_shader.comp.hlsl | 102 ++++++++++++++++++ 3 files changed, 195 insertions(+), 2 deletions(-) create mode 100644 tools/nsc/docker/godbolt/examples/prefix_sum_shader.comp.hlsl create mode 100644 tools/nsc/docker/godbolt/examples/scatter_shader.comp.hlsl diff --git a/tools/nsc/CMakeLists.txt b/tools/nsc/CMakeLists.txt index 3fd632221c..f56f5cedbe 100644 --- a/tools/nsc/CMakeLists.txt +++ b/tools/nsc/CMakeLists.txt @@ -266,6 +266,7 @@ endif() set(NBL_CE_HEALTHY_CHECK_PY "${NBL_ROOT_PATH}/docker/compiler-explorer/ce_healthy_check.py") set(NBL_CE_ENDPOINT_PY "${NBL_ROOT_PATH}/docker/compiler-explorer/endpoint.py") set(NBL_NSC_BASIC_HLSL_JPAYLOAD "${CMAKE_CURRENT_SOURCE_DIR}/docker/godbolt/hlsl-basic-compile-payload.json") +set(NBL_NSC_EXAMPLES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/docker/godbolt/examples") get_target_property(NBL_CE_COUNTING_SORT_EXAMPLE_PATH countingsort SOURCE_DIR) @@ -314,7 +315,7 @@ execute_process(COMMAND "@CMAKE_COMMAND@" -E copy_directory_if_different message(STATUS "Copying examples") execute_process( - COMMAND "@CMAKE_COMMAND@" -E copy_directory_if_different "@NBL_CE_COUNTING_SORT_EXAMPLE_PATH@/app_resources/" "@NBL_DOCKER_CTX_DIR@/Examples/" + COMMAND "@CMAKE_COMMAND@" -E copy_directory_if_different "@NBL_NSC_EXAMPLES_DIR@/" "@NBL_DOCKER_CTX_DIR@/Examples/" ) message(STATUS "Building NSC Godbolt image") @@ -370,4 +371,4 @@ add_custom_target(run-compiler-explorer ALL add_dependencies(run-compiler-explorer nsc) set_target_properties(run-compiler-explorer PROPERTIES FOLDER "Godbolt") -endif() \ No newline at end of file +endif() diff --git a/tools/nsc/docker/godbolt/examples/prefix_sum_shader.comp.hlsl b/tools/nsc/docker/godbolt/examples/prefix_sum_shader.comp.hlsl new file mode 100644 index 0000000000..10edaeddd2 --- /dev/null +++ b/tools/nsc/docker/godbolt/examples/prefix_sum_shader.comp.hlsl @@ -0,0 +1,90 @@ +// this shader has to be compiled with: +// -T cs_6_0 -E main + +#include "nbl/builtin/hlsl/sort/counting.hlsl" +#include "nbl/builtin/hlsl/bda/bda_accessor.hlsl" + +#define WorkgroupSize 27 +#define BucketCount 27 + +struct CountingPushData +{ + uint64_t inputKeyAddress; + uint64_t inputValueAddress; + uint64_t histogramAddress; + uint64_t outputKeyAddress; + uint64_t outputValueAddress; + uint32_t dataElementCount; + uint32_t elementsPerWT; + uint32_t minimum; + uint32_t maximum; +}; + +using +namespace nbl:: + hlsl; + +usingPtr = bda::__ptr; + using PtrAccessor = BdaAccessor < uint32_t >; + + groupshared uint32_t sdata[BucketCount]; + + struct SharedAccessor + { + void get(const uint32_t index, NBL_REF_ARG( uint32_t) value) + { + value = + sdata[ index]; + } + + void set( + const uint32_t index, const uint32_tvalue) + { + sdata[index] = + value; +} + +uint32_t atomicAdd(const uint32_t index, const uint32_t value) +{ + return glsl::atomicAdd(sdata[index], value); +} + +void workgroupExecutionAndMemoryBarrier() +{ + glsl::barrier(); +} +}; + +uint32_t3 glsl::gl_WorkGroupSize() +{ + return uint32_t3(WorkgroupSize, 1, 1); +} + + +[[vk::push_constant]] CountingPushData pushData; + +[numthreads(WorkgroupSize, 1, 1)] +void main(uint32_t3 ID : SV_GroupThreadID, uint32_t3 GroupID : SV_GroupID) +{ + sort::CountingParameters < uint32_t > params; + params.dataElementCount = pushData.dataElementCount; + params.elementsPerWT = pushData.elementsPerWT; + params.minimum = pushData.minimum; + params.maximum = pushData.maximum; + + using Counter = sort::counting < WorkgroupSize, BucketCount, PtrAccessor, PtrAccessor, PtrAccessor, SharedAccessor, PtrAccessor::type_t >; + Counter counter = Counter::create(glsl::gl_WorkGroupID().x); + + const Ptr input_ptr = Ptr::create(pushData.inputKeyAddress); + const Ptr histogram_ptr = Ptr::create(pushData.histogramAddress); + + PtrAccessor input_accessor = PtrAccessor::create(input_ptr); + PtrAccessor histogram_accessor = PtrAccessor::create(histogram_ptr); + SharedAccessor shared_accessor; + counter.histogram( + input_accessor, + histogram_accessor, + shared_accessor, + params + ); +} diff --git a/tools/nsc/docker/godbolt/examples/scatter_shader.comp.hlsl b/tools/nsc/docker/godbolt/examples/scatter_shader.comp.hlsl new file mode 100644 index 0000000000..50702d35f3 --- /dev/null +++ b/tools/nsc/docker/godbolt/examples/scatter_shader.comp.hlsl @@ -0,0 +1,102 @@ +// this shader has to be compiled with: +// -T cs_6_0 -E main + +#include "nbl/builtin/hlsl/sort/counting.hlsl" +#include "nbl/builtin/hlsl/bda/bda_accessor.hlsl" + +#define WorkgroupSize 27 +#define BucketCount 27 + +struct CountingPushData +{ + uint64_t inputKeyAddress; + uint64_t inputValueAddress; + uint64_t histogramAddress; + uint64_t outputKeyAddress; + uint64_t outputValueAddress; + uint32_t dataElementCount; + uint32_t elementsPerWT; + uint32_t minimum; + uint32_t maximum; +}; + +using +namespace nbl:: + hlsl; + +usingPtr = bda::__ptr; + using PtrAccessor = BdaAccessor < uint32_t >; + + groupshared uint32_t sdata[BucketCount]; + + struct SharedAccessor + { + void get(const uint32_t index, NBL_REF_ARG( uint32_t) value) + { + value = + sdata[ index]; + } + + void set( + const uint32_t index, const uint32_tvalue) + { + sdata[index] = + value; +} + +uint32_t atomicAdd(const uint32_t index, const uint32_t value) +{ + return glsl::atomicAdd(sdata[index], value); +} + +void workgroupExecutionAndMemoryBarrier() +{ + glsl::barrier(); +} +}; + +uint32_t3 glsl::gl_WorkGroupSize() +{ + return uint32_t3(WorkgroupSize, 1, 1); +} + +[[vk::push_constant]] CountingPushData pushData; + +using DoublePtrAccessor = DoubleBdaAccessor < uint32_t >; + +[numthreads(WorkgroupSize, 1, 1)] +void main(uint32_t3 ID : SV_GroupThreadID, uint32_t3 GroupID : SV_GroupID) +{ + sort::CountingParameters < uint32_t > params; + params.dataElementCount = pushData.dataElementCount; + params.elementsPerWT = pushData.elementsPerWT; + params.minimum = pushData.minimum; + params.maximum = pushData.maximum; + + using Counter = sort::counting < WorkgroupSize, BucketCount, DoublePtrAccessor, DoublePtrAccessor, PtrAccessor, SharedAccessor, PtrAccessor::type_t >; + Counter counter = Counter::create(glsl::gl_WorkGroupID().x); + + const Ptr input_key_ptr = Ptr::create(pushData.inputKeyAddress); + const Ptr input_value_ptr = Ptr::create(pushData.inputValueAddress); + const Ptr histogram_ptr = Ptr::create(pushData.histogramAddress); + const Ptr output_key_ptr = Ptr::create(pushData.outputKeyAddress); + const Ptr output_value_ptr = Ptr::create(pushData.outputValueAddress); + + DoublePtrAccessor key_accessor = DoublePtrAccessor::create( + input_key_ptr, + output_key_ptr + ); + DoublePtrAccessor value_accessor = DoublePtrAccessor::create( + input_value_ptr, + output_value_ptr + ); + PtrAccessor histogram_accessor = PtrAccessor::create(histogram_ptr); + SharedAccessor shared_accessor; + counter.scatter( + key_accessor, + value_accessor, + histogram_accessor, + shared_accessor, + params + ); +}