Class CudaMessageQueue<T>
- Namespace
- DotCompute.Backends.CUDA.RingKernels
- Assembly
- DotCompute.Backends.CUDA.dll
CUDA-based lock-free message queue for inter-kernel communication.
public sealed class CudaMessageQueue<T> : IMessageQueue<T>, IMessageQueue, IAsyncDisposable where T : unmanaged
Type Parameters
TMessage payload type (must be unmanaged).
- Inheritance
-
CudaMessageQueue<T>
- Implements
- Inherited Members
Remarks
Implements a GPU-resident lock-free ring buffer using CUDA atomics. The queue is optimized for high throughput concurrent access from multiple GPU threads.
Constructors
CudaMessageQueue(int, ILogger<CudaMessageQueue<T>>)
Initializes a new instance of the CudaMessageQueue<T> class.
public CudaMessageQueue(int capacity, ILogger<CudaMessageQueue<T>> logger)
Parameters
capacityintQueue capacity (must be power of 2).
loggerILogger<CudaMessageQueue<T>>Logger instance.
Properties
Capacity
Gets the queue capacity (maximum number of messages).
public int Capacity { get; }
Property Value
Count
Gets the approximate current size of the queue.
public int Count { get; }
Property Value
IsEmpty
Gets whether the queue is empty.
public bool IsEmpty { get; }
Property Value
IsFull
Gets whether the queue is full.
public bool IsFull { get; }
Property Value
Methods
ClearAsync(CancellationToken)
Clears all messages from the queue.
public Task ClearAsync(CancellationToken cancellationToken = default)
Parameters
cancellationTokenCancellationTokenCancellation token.
Returns
- Task
A task representing the clear operation.
DequeueAsync(TimeSpan, CancellationToken)
Dequeues a message, blocking until one is available.
public Task<KernelMessage<T>> DequeueAsync(TimeSpan timeout = default, CancellationToken cancellationToken = default)
Parameters
timeoutTimeSpanMaximum wait time (default: infinite).
cancellationTokenCancellationTokenCancellation token.
Returns
- Task<KernelMessage<T>>
The dequeued message.
Exceptions
- TimeoutException
Thrown if the timeout expires before a message arrives.
DisposeAsync()
Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources asynchronously.
public ValueTask DisposeAsync()
Returns
- ValueTask
A task that represents the asynchronous dispose operation.
EnqueueAsync(KernelMessage<T>, TimeSpan, CancellationToken)
Enqueues a message, blocking until space is available.
public Task EnqueueAsync(KernelMessage<T> message, TimeSpan timeout = default, CancellationToken cancellationToken = default)
Parameters
messageKernelMessage<T>The message to enqueue.
timeoutTimeSpanMaximum wait time (default: infinite).
cancellationTokenCancellationTokenCancellation token.
Returns
- Task
A task that completes when the message is enqueued.
Exceptions
- TimeoutException
Thrown if the timeout expires before space becomes available.
GetBuffer()
Gets the memory buffer handle for GPU access.
public IUnifiedMemoryBuffer GetBuffer()
Returns
GetHeadPtr()
Gets the head pointer buffer (atomic counter for dequeue position).
public IUnifiedMemoryBuffer GetHeadPtr()
Returns
GetStatisticsAsync()
Gets queue statistics for monitoring.
public Task<MessageQueueStatistics> GetStatisticsAsync()
Returns
- Task<MessageQueueStatistics>
Queue statistics including message counts and throughput.
GetTailPtr()
Gets the tail pointer buffer (atomic counter for enqueue position).
public IUnifiedMemoryBuffer GetTailPtr()
Returns
InitializeAsync(CancellationToken)
Initializes the message queue and allocates GPU buffers.
public Task InitializeAsync(CancellationToken cancellationToken = default)
Parameters
cancellationTokenCancellationTokenCancellation token.
Returns
- Task
A task representing the initialization operation.
TryDequeueAsync(CancellationToken)
Attempts to dequeue a message (non-blocking).
public Task<KernelMessage<T>?> TryDequeueAsync(CancellationToken cancellationToken = default)
Parameters
cancellationTokenCancellationTokenCancellation token.
Returns
- Task<KernelMessage<T>?>
The dequeued message if available; null if the queue was empty.
Remarks
This is a non-blocking operation that returns null if the queue is empty. Use BlockingDequeue if you need to wait for messages.
TryEnqueueAsync(KernelMessage<T>, CancellationToken)
Attempts to enqueue a message (non-blocking).
public Task<bool> TryEnqueueAsync(KernelMessage<T> message, CancellationToken cancellationToken = default)
Parameters
messageKernelMessage<T>The message to enqueue.
cancellationTokenCancellationTokenCancellation token.
Returns
Remarks
This is a non-blocking operation that returns false if the queue is full. Use BlockingEnqueue if you need guaranteed delivery with backpressure.