diff options
| author | Harsh Aggarwal (NVIDIA) <haaggarwal@nvidia.com> | 2025-08-01 14:48:53 +0530 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-01 09:18:53 +0000 |
| commit | bdda8a90cdd44ca822b21233ac988f92d1f20826 (patch) | |
| tree | 4f628776a047b2719aee676287b3adc9d4f68f7a /source | |
| parent | 7a133445ef82232a6961c25d09b79f45cd92e709 (diff) | |
Fix 7441: CUDA boolean vector layout to use 1-byte elements (#7862)
* Fix 7441: CUDA boolean vector layout to use 1-byte elements
Boolean vectors (bool1, bool2, bool3, bool4) were incorrectly implemented
as integer-based types using 4 bytes per element instead of actual 1-byte
boolean elements on CUDA targets.
Changes:
- Update CUDA prelude to define boolean vectors as structs with bool fields
instead of typedef aliases to integer vectors
- Implement CUDALayoutRulesImpl::GetVectorLayout to use 1-byte alignment
for boolean vectors, matching actual CUDA memory layout behavior
- Update make_bool functions to populate struct fields correctly
This ensures boolean vectors have the same memory layout as bool[4] arrays:
- bool1: 1 byte (was 4 bytes)
- bool2: 2 bytes (was 8 bytes)
- bool3: 3 bytes (was 12 bytes)
- bool4: 4 bytes (was 16 bytes)
Fixes memory layout mismatch between Slang reflection API and actual
CUDA compilation, achieving 75% memory savings for boolean vector usage.
* Fix CI issues -
Add and update associated functions and operators
* Make boolX same as uchar
* Use align construct on struct for boolX
* Improve Test case for robust alignment checks
* Formatting
* Disable selected slangpy tests
* add metal check which is slightly different than cuda
* Test-1
* Test-2
* Test-3
* Test-4
* ReflectionChange
* cleanup and update
* _slang_select with plain bool is needed for reverse-loop-checkpoint-test
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-reflection-json.cpp | 6 | ||||
| -rw-r--r-- | source/slang/slang-type-layout.cpp | 8 |
2 files changed, 5 insertions, 9 deletions
diff --git a/source/slang/slang-reflection-json.cpp b/source/slang/slang-reflection-json.cpp index c253c4d66..26cdafa46 100644 --- a/source/slang/slang-reflection-json.cpp +++ b/source/slang/slang-reflection-json.cpp @@ -64,6 +64,7 @@ static void emitReflectionVarBindingInfoJSON( SlangParameterCategory category, SlangUInt index, SlangUInt count, + SlangUInt stride, SlangUInt space = 0) { if (category == SLANG_PARAMETER_CATEGORY_UNIFORM) @@ -73,6 +74,8 @@ static void emitReflectionVarBindingInfoJSON( writer << "\"offset\": " << index; writer << ", "; writer << "\"size\": " << count; + writer << ", "; + writer << "\"elementStride\": " << stride; } else { @@ -197,6 +200,7 @@ static void emitReflectionVarBindingInfoJSON( auto index = var->getOffset(category); auto space = var->getBindingSpace(category); auto count = typeLayout->getSize(category); + auto elementStride = typeLayout->getElementStride(category); // Query the paramater usage for the specified entry point. // Note: both `request` and `entryPointIndex` may be invalid here, but that should just @@ -216,7 +220,7 @@ static void emitReflectionVarBindingInfoJSON( writer << "{"; - emitReflectionVarBindingInfoJSON(writer, category, index, count, space); + emitReflectionVarBindingInfoJSON(writer, category, index, count, elementStride, space); if (usedAvailable) { diff --git a/source/slang/slang-type-layout.cpp b/source/slang/slang-type-layout.cpp index 3982b579d..275a178d0 100644 --- a/source/slang/slang-type-layout.cpp +++ b/source/slang/slang-type-layout.cpp @@ -582,14 +582,6 @@ struct CUDALayoutRulesImpl : DefaultLayoutRulesImpl SimpleLayoutInfo elementInfo, size_t elementCount) override { - // Special case bool - if (elementType == BaseType::Bool) - { - SimpleLayoutInfo fixInfo(elementInfo); - fixInfo.size = sizeof(int32_t); - fixInfo.alignment = sizeof(int32_t); - return GetVectorLayout(BaseType::Int, fixInfo, elementCount); - } const auto elementSize = elementInfo.size.getFiniteValue(); |
