summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorHarsh Aggarwal (NVIDIA) <haaggarwal@nvidia.com>2025-08-01 14:48:53 +0530
committerGitHub <noreply@github.com>2025-08-01 09:18:53 +0000
commitbdda8a90cdd44ca822b21233ac988f92d1f20826 (patch)
tree4f628776a047b2719aee676287b3adc9d4f68f7a /source
parent7a133445ef82232a6961c25d09b79f45cd92e709 (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.cpp6
-rw-r--r--source/slang/slang-type-layout.cpp8
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();