.async
setting set to true as explained in Asynchronous DSD Operations).
Constructor and Type
Microthread ID expressions have typeut_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
.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: