Skip to content

copy examples to CE container in the build time #886

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: exBuiltinArchives
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion tools/nsc/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -262,6 +266,9 @@ 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)

# to avoid "too long input" errors we proxy build instructions to CMake script and write it to build directory
string(CONFIGURE [=[
Expand Down Expand Up @@ -306,6 +313,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_NSC_EXAMPLES_DIR@/" "@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
Expand Down Expand Up @@ -359,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()
endif()
90 changes: 90 additions & 0 deletions tools/nsc/docker/godbolt/examples/prefix_sum_shader.comp.hlsl
Original file line number Diff line number Diff line change
@@ -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<uint32_t>;
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
);
}
102 changes: 102 additions & 0 deletions tools/nsc/docker/godbolt/examples/scatter_shader.comp.hlsl
Original file line number Diff line number Diff line change
@@ -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<uint32_t>;
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
);
}
Loading