Skip to main content
On WSE-3 it is possible to explicitly specify the microthread ID of an asynchronous DSD operation (i.e., a DSD operation with the .async setting set to true as explained in Asynchronous DSD Operations).

Constructor and Type

Microthread ID expressions have type ut_id. Values of ut_id type can be constructed from integers using @get_ut_id (see @get_ut_id). CSL exposes 8 microthread IDs on WSE-3, addressable as @get_ut_id(0) through @get_ut_id(7). Passing an integer outside this range to @get_ut_id is a compile-time error.

Relationship between microthread IDs and queue IDs

A microthread on WSE-3 is the hardware context that drives an in-flight asynchronous DSD operation. Each microthread is associated with a fabric input queue or output queue for the lifetime of the operation, and the microthread ID and queue ID are independent numbers. By default, an operation’s microthread ID is determined by the queue ID of its highest-priority fabric operand (destination, then src0, then src1); the .ut_id setting overrides this default. Using a microthread ID different from the queue ID is useful when two concurrent operations share a queue but need to be tracked as distinct microthreads, or when explicit @block / @unblock of a specific microthread is desired.

Usage and Semantics

An asynchronous DSD operation can be assigned a microthread ID through the .ut_id setting of the DSD operation’s configuration struct or through the .ut_id setting of the @load_to_dsr’s configuration struct of explicit DSR operands. The value of the .ut_id setting must be comptime-known. If multiple DSR operands have the .ut_id setting specified then the hardware will pick one of them according to the following order:
  • Destination operand
  • First source operand
  • Second source operand
The same order will be followed even if a DSD operation consists of a mix of explicit DSR and DSD operands. In this case the DSD operands will have the microthread ID specified by the .ut_id setting of the DSD operation’s configuration struct. If the .ut_id setting is not specified in the DSD operation’s configuration struct or by any of the explicit DSR operands, then the microthread ID will be the same as the queue ID of the first fabric operand according to the operand ordering defined above.

Example

Blocking and Unblocking Microthreads

Microthreads can be blocked/unblocked from a top-level comptime block or at runtime using the @block and @unblock builtins (see @block and @unblock). For example: