pytorch - ✅(Solved) Fix [C10] Incorrect channels-last contiguity flag handling in `c10/core/SymbolicShapeMeta.h` [1 pull requests, 1 comments, 1 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
pytorch/pytorch#178102Fetched 2026-04-08 01:16:37
View on GitHub
Comments
1
Participants
1
Timeline
35
Reactions
0
Participants
Timeline (top)
mentioned ×11subscribed ×11labeled ×7referenced ×3

Fix Action

Fixed

PR fix notes

PR #178103: [C10] Fix incorrect channels-last contiguity flag handling in c10/core/SymbolicShapeMeta.h

Description (problem / solution / changelog)

Summary

This pull request fixes #178102 by correcting a bug in c10/core/SymbolicShapeMeta.h where assume_channels_last_contiguous that consistet of an incorrect change is_contiguous_ instead of is_channels_last_contiguous_. This caused inconsistent state and may have leaded to wrong contiguity information for channels-last tensors.

Change(s)

  • Replaced assignment is_contiguous_ = std::move(val); with is_channels_last_contiguous_ = std::move(val);

Impact

  • Corrects the internal state of SymbolicShapeMeta when a tensor is assumed to be channels-last contiguous.
  • Prevents potential incorrect optimizations and ensures proper propagation of contiguity flags in symbolic shape handling.

Contributed by Benedikt Johannes

cc @ezyang @penguinwu @bobrenjc93 @aditvenk @laithsakka

Changed files

  • c10/core/SymbolicShapeMeta.h (modified, +1/-1)

Code Example

void assume_channels_last_contiguous(SymBool val = true) {
    is_contiguous_ = std::move(val);
    available_.fetch_or(is_channels_last_contiguous_avail);
  }

---

void assume_channels_last_contiguous(SymBool val = true) {
    is_channels_last_contiguous_ = std::move(val);
    available_.fetch_or(is_channels_last_contiguous_avail);
  }

---

void assume_contiguous(SymBool val = true) {
    is_contiguous_ = std::move(val);
    available_.fetch_or(is_contiguous_avail);
  }
  void assume_channels_last_contiguous(SymBool val = true) {
    is_contiguous_ = std::move(val);
    available_.fetch_or(is_channels_last_contiguous_avail);
  }
  void assume_channels_last_3d_contiguous(SymBool val = true) {
    is_channels_last_3d_contiguous_ = std::move(val);
    available_.fetch_or(is_channels_last_3d_contiguous_avail);
  }
  void assume_channels_last(SymBool val = true) {
    is_channels_last_ = std::move(val);
    available_.fetch_or(is_channels_last_avail);
  }
  void assume_channels_last_3d(SymBool val = true) {
    is_channels_last_3d_ = std::move(val);
    available_.fetch_or(is_channels_last_3d_avail);
  }
  void assume_non_overlapping_and_dense(SymBool val = true) {
    is_non_overlapping_and_dense_ = std::move(val);
    available_.fetch_or(is_non_overlapping_and_dense_avail);
  }

---

void assume_contiguous(SymBool val = true) {
    is_contiguous_ = std::move(val);
    available_.fetch_or(is_contiguous_avail);
  }
  void assume_channels_last_contiguous(SymBool val = true) {
    is_channels_last_contiguous_ = std::move(val);
    available_.fetch_or(is_channels_last_contiguous_avail);
  }
  void assume_channels_last_3d_contiguous(SymBool val = true) {
    is_channels_last_3d_contiguous_ = std::move(val);
    available_.fetch_or(is_channels_last_3d_contiguous_avail);
  }
  void assume_channels_last(SymBool val = true) {
    is_channels_last_ = std::move(val);
    available_.fetch_or(is_channels_last_avail);
  }
  void assume_channels_last_3d(SymBool val = true) {
    is_channels_last_3d_ = std::move(val);
    available_.fetch_or(is_channels_last_3d_avail);
  }
  void assume_non_overlapping_and_dense(SymBool val = true) {
    is_non_overlapping_and_dense_ = std::move(val);
    available_.fetch_or(is_non_overlapping_and_dense_avail);
  }
RAW_BUFFERClick to expand / collapse

🐛 Describe the bug

Summary

In c10/core/SymbolicShapeMeta.h, the method assume_channels_last_contiguous incorrectly assigns the value to is_contiguous_ instead of is_channels_last_contiguous_.

Problem

This leads to an inconsistent internal state where the standard contiguity flag is modified instead of the channels-last contiguity flag. As a result, tensors that are assumed to be channels-last contiguous may carry incorrect contiguity information.

Impact

  • Incorrect contiguity flags
  • Potential wrong optimizations
  • Inconsistent symbolic shape behavior

Code

  void assume_channels_last_contiguous(SymBool val = true) {
    is_contiguous_ = std::move(val);
    available_.fetch_or(is_channels_last_contiguous_avail);
  }

has to be

  void assume_channels_last_contiguous(SymBool val = true) {
    is_channels_last_contiguous_ = std::move(val);
    available_.fetch_or(is_channels_last_contiguous_avail);
  }

in the context of (old (with bug))

  void assume_contiguous(SymBool val = true) {
    is_contiguous_ = std::move(val);
    available_.fetch_or(is_contiguous_avail);
  }
  void assume_channels_last_contiguous(SymBool val = true) {
    is_contiguous_ = std::move(val);
    available_.fetch_or(is_channels_last_contiguous_avail);
  }
  void assume_channels_last_3d_contiguous(SymBool val = true) {
    is_channels_last_3d_contiguous_ = std::move(val);
    available_.fetch_or(is_channels_last_3d_contiguous_avail);
  }
  void assume_channels_last(SymBool val = true) {
    is_channels_last_ = std::move(val);
    available_.fetch_or(is_channels_last_avail);
  }
  void assume_channels_last_3d(SymBool val = true) {
    is_channels_last_3d_ = std::move(val);
    available_.fetch_or(is_channels_last_3d_avail);
  }
  void assume_non_overlapping_and_dense(SymBool val = true) {
    is_non_overlapping_and_dense_ = std::move(val);
    available_.fetch_or(is_non_overlapping_and_dense_avail);
  }

which has to be in the corrected (and complete) version

  void assume_contiguous(SymBool val = true) {
    is_contiguous_ = std::move(val);
    available_.fetch_or(is_contiguous_avail);
  }
  void assume_channels_last_contiguous(SymBool val = true) {
    is_channels_last_contiguous_ = std::move(val);
    available_.fetch_or(is_channels_last_contiguous_avail);
  }
  void assume_channels_last_3d_contiguous(SymBool val = true) {
    is_channels_last_3d_contiguous_ = std::move(val);
    available_.fetch_or(is_channels_last_3d_contiguous_avail);
  }
  void assume_channels_last(SymBool val = true) {
    is_channels_last_ = std::move(val);
    available_.fetch_or(is_channels_last_avail);
  }
  void assume_channels_last_3d(SymBool val = true) {
    is_channels_last_3d_ = std::move(val);
    available_.fetch_or(is_channels_last_3d_avail);
  }
  void assume_non_overlapping_and_dense(SymBool val = true) {
    is_non_overlapping_and_dense_ = std::move(val);
    available_.fetch_or(is_non_overlapping_and_dense_avail);
  }

Versions

Latest (PyTorch main)

cc @ezyang @bhosmer @smessmer @ljk53 @bdhirsh @bobrenjc93 @chauhang @penguinwu @aditvenk @laithsakka

extent analysis

Fix Plan

To fix the bug, update the assume_channels_last_contiguous method to correctly assign the value to is_channels_last_contiguous_ instead of is_contiguous_.

  • Update the assume_channels_last_contiguous method as follows:
void assume_channels_last_contiguous(SymBool val = true) {
  is_channels_last_contiguous_ = std::move(val);
  available_.fetch_or(is_channels_last_contiguous_avail);
}
  • Verify that the other methods (assume_contiguous, assume_channels_last_3d_contiguous, assume_channels_last, assume_channels_last_3d, assume_non_overlapping_and_dense) are correctly assigning values to their respective flags.

Verification

To verify the fix, test the assume_channels_last_contiguous method with different input values and check that the is_channels_last_contiguous_ flag is correctly updated. You can add test cases to ensure the correctness of the fix.

Extra Tips

  • Double-check the naming conventions and variable assignments in similar methods to prevent similar bugs.
  • Consider adding additional tests to cover different scenarios and edge cases.
  • Review the code changes with the team to ensure everyone is aware of the fix and its implications.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

pytorch - ✅(Solved) Fix [C10] Incorrect channels-last contiguity flag handling in `c10/core/SymbolicShapeMeta.h` [1 pull requests, 1 comments, 1 participants]