{"record":{"id":"660cd8fb6fcb67f6","repo":"jax-ml/jax","slug":"cannot-name-on-a-non-shaped-semaphore-sem-s","errorCode":null,"errorMessage":"Cannot {name} on a non-()-shaped semaphore: {sem_shape}","messagePattern":"Cannot (.+?) on a non-\\(\\)-shaped semaphore: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"jax/_src/pallas/primitives.py","lineNumber":895,"sourceCode":"\n\ndef check_sem_avals(\n    sem_aval, sem_transforms_avals, name, allowed_semaphore_types=None\n):\n  if allowed_semaphore_types is None:\n    allowed_semaphore_types = {\n        pallas_core.semaphore,\n        pallas_core.barrier_semaphore,\n        # For interpret mode.\n        pallas_core.SEMAPHORE_INTERPRET_DTYPE,\n    }\n  if not isinstance(sem_aval, state.AbstractRef):\n    raise ValueError(f\"Cannot {name} on a non-semaphore Ref: {sem_aval}\")\n  sem_shape = sem_aval.shape\n  if sem_transforms_avals:\n    sem_shape = sem_transforms_avals[-1].get_indexer_shape()\n  if sem_shape:\n    raise ValueError(f\"Cannot {name} on a non-()-shaped semaphore: {sem_shape}\")\n  sem_dtype = sem_aval.dtype\n  if not any(\n      jnp.issubdtype(sem_dtype, sem_type)\n      for sem_type in allowed_semaphore_types\n  ):\n    raise ValueError(\n        f\"Must {name} semaphores of the following types:\"\n        f\" {allowed_semaphore_types}. Got {sem_dtype}.\"\n    )\n\n\ndef _transform_semaphore(ref_value, transforms, ref_aval):\n  \"\"\"Helper function for indexing into a semaphore during state_discharge.\"\"\"\n  if ref_value.shape == ref_aval.shape:\n    return state_discharge.transform_array(ref_value, transforms)\n  elif len(ref_value.shape) == 0:\n    return ref_value\n  else:","sourceCodeStart":877,"sourceCodeEnd":913,"githubUrl":"https://github.com/jax-ml/jax/blob/1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb/jax/_src/pallas/primitives.py#L877-L913","documentation":"Pallas semaphores must be scalar-shaped (). This error fires when the semaphore Ref (after applying any ref transforms/indexers) has a non-empty shape.","triggerScenarios":"Allocating a semaphore Ref with shape (n,) instead of (), or applying an indexer/transform that yields a non-scalar shape, then calling semaphore_signal/wait/read.","commonSituations":"Trying to create an array of semaphores; applying slicing that leaves dimensionality on the semaphore ref.","solutions":["Allocate semaphores as scalar Refs: one Ref per semaphore, shape ()","If multiple semaphores are needed, allocate multiple scalar Refs (e.g., via tree of refs), not one shaped Ref","Verify no transform chain leaves a non-empty shape on the ref"],"exampleFix":"// before\nsem = alloc_buffer(shape=(1,), dtype=semaphore_dtype)\n// after\nsem = alloc_buffer(shape=(), dtype=semaphore_dtype)","handlingStrategy":"validation","validationCode":"assert sem_aval.shape == (), f\"semaphore must be scalar, got {sem_aval.shape}\"","typeGuard":"def is_scalar_ref(ref) -> bool:\n    return getattr(getattr(ref, 'aval', ref), 'shape', None) == ()","tryCatchPattern":null,"preventionTips":["Allocate every semaphore as a scalar Ref","Use one scalar Ref per semaphore instead of shaped arrays"],"tags":["pallas","semaphore","shape-validation","jax"],"backgroundTag":"shape-mismatch","analyzedSha":"1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb","analyzedAt":"2026-08-27T09:53:25.647Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}