{"record":{"id":"eecbfccb6106507a","repo":"jax-ml/jax","slug":"cannot-signal-on-a-non-shaped-semaphore-src-s","errorCode":null,"errorMessage":"Cannot signal on a non-()-shaped semaphore: {src_sem_shape}","messagePattern":"Cannot signal on a non-\\(\\)-shaped semaphore: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"jax/_src/pallas/mosaic/primitives.py","lineNumber":368,"sourceCode":"      _dma_unflatten(tree, args)\n  )\n  if not all(\n      isinstance(x, (state.AbstractRef, state.TransformedRef))\n      for x in [src_ref_aval, dst_ref_aval, dst_sem_aval]\n  ):\n    raise ValueError(\n        \"DMA source/destination/semaphore arguments must be Refs.\")\n  dst_sem_shape = dst_sem_aval.shape\n  if dst_sem_shape:\n    raise ValueError(\n        f\"Cannot signal on a non-()-shaped semaphore: {dst_sem_shape}\"\n    )\n  if src_sem_aval is not None:\n    if not isinstance(src_sem_aval, (state.AbstractRef, state.TransformedRef)):\n      raise ValueError(\"DMA source semaphore must be a Ref.\")\n    src_sem_shape = src_sem_aval.shape\n    if src_sem_shape:\n      raise ValueError(\n          f\"Cannot signal on a non-()-shaped semaphore: {src_sem_shape}\"\n      )\n  return [], _get_dma_effects(\n      src_ref_aval,\n      dst_ref_aval,\n      dst_sem_aval,\n      src_sem_aval,\n      device_id_aval,\n      device_id_type,\n  )\n\ndef _dma_start_pp_eqn(eqn: jax_core.JaxprEqn,\n                      context: jax_core.JaxprPpContext,\n                      settings: jax_core.JaxprPpSettings):\n  invars = eqn.invars\n  tree = eqn.params[\"tree\"]\n  priority = eqn.params[\"priority\"]\n  add = eqn.params[\"add\"]","sourceCodeStart":350,"sourceCodeEnd":386,"githubUrl":"https://github.com/jax-ml/jax/blob/1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb/jax/_src/pallas/mosaic/primitives.py#L350-L386","documentation":"Like the destination semaphore, the optional source semaphore of dma_start must be scalar (() - shaped); a non-empty shape means per-element signaling which the hardware does not support for source-side completion.","triggerScenarios":"dma_start with src_sem whose ref shape is non-empty, e.g. shape=(num_signals,) or (1,).","commonSituations":"Allocating a vector of semaphores to track multiple sends and passing the whole vector as src_sem; symmetric copy-paste from the destination semaphore that also had a wrong shape.","solutions":["Use a scalar () semaphore for src_sem","Select one element from a semaphore array if you manage several","Reallocate the semaphore with shape ()"],"exampleFix":"# before\ndma_start(src, dst, dst_sem, src_sem=sem_vector, device_id=dev)\n\n# after\nsem_scalar = sem_vector[i]  # scalar ref\ndma_start(src, dst, dst_sem, src_sem=sem_scalar, device_id=dev)","handlingStrategy":"validation","validationCode":"if src_sem is not None:\n  assert src_sem.shape == (), f\"src semaphore must be scalar, got {src_sem.shape}\"","typeGuard":"def is_scalar_sem(sem_ref) -> bool:\n  return sem_ref.shape == ()","tryCatchPattern":null,"preventionTips":["One scalar semaphore per signal path","Mirror the () shape check for both src and dst semaphores"],"tags":["jax","pallas","mosaic","dma","semaphore","shape-validation"],"backgroundTag":"semaphore-must-be-scalar","analyzedSha":"1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb","analyzedAt":"2026-08-27T09:53:25.647Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}