{"record":{"id":"ab98f17774f236bc","repo":"jax-ml/jax","slug":"must-name-semaphores-of-the-following-types-al","errorCode":null,"errorMessage":"Must {name} semaphores of the following types: {allowed_semaphore_types}. Got {sem_dtype}.","messagePattern":"Must (.+?) semaphores of the following types: (.+?)\\. Got (.+?)\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"jax/_src/pallas/primitives.py","lineNumber":901,"sourceCode":"    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:\n    raise ValueError(\n        f\"Semaphore value shape {ref_value.shape} does not match aval shape\"\n        f\" {ref_aval.shape}\"\n    )\n\n","sourceCodeStart":883,"sourceCodeEnd":919,"githubUrl":"https://github.com/jax-ml/jax/blob/1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb/jax/_src/pallas/primitives.py#L883-L919","documentation":"Semaphore dtype validation: the semaphore Ref must have a dtype compatible with the allowed semaphore types (pallas semaphore, barrier_semaphore, or the interpret dtype).","triggerScenarios":"Allocating a Ref with an arbitrary dtype (e.g., float32) and using it as a semaphore in signal/wait/read.","commonSituations":"Creating semaphores with jnp.zeros(..., dtype=jnp.float32) instead of the proper semaphore dtype constant; mixing up buffer and semaphore allocation.","solutions":["Allocate the semaphore with the proper Pallas semaphore dtype (e.g., pallas_core.semaphore / SEMAPHORE_INTERPRET_DTYPE in interpret mode)","Use the library's semaphore allocation helpers rather than raw alloc with a custom dtype"],"exampleFix":"// before\nsem = alloc((), jnp.float32)\n// after\nsem = alloc((), semaphore_dtype)  # pallas semaphore dtype","handlingStrategy":"validation","validationCode":"import jnp\nfrom jax.experimental.pallas import pallas_core\nassert any(jnp.issubdtype(sem.dtype, t) for t in (pallas_core.semaphore, pallas_core.barrier_semaphore))","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use library semaphore allocation helpers","Never allocate semaphores with arbitrary dtypes"],"tags":["pallas","semaphore","dtype-validation","jax"],"backgroundTag":"dtype-mismatch","analyzedSha":"1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb","analyzedAt":"2026-08-27T09:53:25.647Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}