diff --git a/crates/ipu-codegen/src/exchange.rs b/crates/ipu-codegen/src/exchange.rs index ee10503..a4cdc00 100644 --- a/crates/ipu-codegen/src/exchange.rs +++ b/crates/ipu-codegen/src/exchange.rs @@ -972,7 +972,7 @@ fn pending_from_problem( .map(|destination| { if destination.tile >= tile_count || (destination.tile == transfer.source - && (transfer.destinations.len() < 2 + && ((transfer.destinations.len() < 2 && transfer.width != ExchangeItemWidth::Paired64) || transfer.source_addresses.iter().any(|&address| { spans_share_effective_memory_element( address, @@ -2443,7 +2443,7 @@ fn append_transfer( } if destinations.iter().any(|&(tile, address)| { tile == source - && (destinations.len() < 2 + && ((destinations.len() < 2 && width != ExchangeItemWidth::Paired64) || effective_memory_elements(address, words) .iter() .any(|element| source_elements.contains(element))) diff --git a/crates/ipu-exchange/src/lib.rs b/crates/ipu-exchange/src/lib.rs index acb9840..5e85fc2 100644 --- a/crates/ipu-exchange/src/lib.rs +++ b/crates/ipu-exchange/src/lib.rs @@ -2645,18 +2645,7 @@ impl Topology { count: u32, ) -> Result { validate_count(count)?; - if receivers.is_empty() || receivers.len() & 1 != 0 { - return Err(ExchangeError::ReceiverSet); - } - let receiver_set = receivers.iter().copied().collect::>(); - if receiver_set.len() != receivers.len() - || receivers.iter().any(|&receiver| { - self.paired_logical(receiver) - .map_or(true, |paired| !receiver_set.contains(&paired)) - }) - { - return Err(ExchangeError::ReceiverSet); - } + if receivers.is_empty() { return Err(ExchangeError::ReceiverSet); } let mut plan = self.multicast(sender_logical, receivers, count, 0)?; let sender_physical = u32::from(self.physical(sender_logical)?); @@ -2856,7 +2845,6 @@ impl Topology { // Source-only ordinary routing failed hardware probes with both one- // and two-direction sends. Paired and remote multicast loopback work. if receiver_logical.is_empty() - || receiver_logical == [sender_logical] || receiver_logical .iter() .any(|receiver| !used.insert(*receiver) || self.physical(*receiver).is_err())