Name Strings

SPV_INTEL_blocking_pipes

Contact

To report problems with this extension, please open a new issue at:

Contributors

  • Joe Garvey, Intel

  • Michael Kinsner, Intel

Notice

Copyright (c) 2019 Intel Corporation. All rights reserved.

Status

Final draft

Version

Last Modified Date

2019-07-17

Revision

1

Dependencies

This extension is written against the SPIR-V Specification, Version 1.4 Revision 1.

This extension requires SPIR-V 1.0.

Overview

This extension adds new pipe read and write functions that have blocking semantics instead of the non-blocking semantics of the existing pipe read/write functions. In this version, only the variants that don’t support reservations are specified.

Extension Name

To use this extension within a SPIR-V module, the following OpExtension must be present in the module:

OpExtension "SPV_INTEL_blocking_pipes"

New Capabilities

This extension introduces a new capability:

BlockingPipesINTEL

New Instructions

Instructions added under the BlockingPipesINTEL capability:

OpReadPipeBlockingINTEL
OpWritePipeBlockingINTEL

Token Number Assignments

BlockingPipesINTEL

5945

OpReadPipeBlockingINTEL

5946

OpWritePipeBlockingINTEL

5947

Modifications to the SPIR-V Specification, Version 1.4

Capability

Modify section 3.31, Capability, adding a row to the capability table:

Capability Implicitly Declares

5945

BlockingPipesINTEL

Pipes

Instructions

In section 3.32.23, Pipe Instructions, add two new instructions: OpReadPipeBlockingINTEL and OpWritePipeBlockingINTEL, as follows:

OpReadPipeBlockingINTEL

Read a packet from the pipe object specified by Pipe into Pointer. This instruction will not return until the read has completed successfully and thus if the pipe is empty it will block until there is data in the pipe.

Pipe must have a type of OpTypePipe with ReadOnly access qualifier.

Pointer must have a type of OpTypePointer with the same data type as Pipe and a Generic Storage Class.

Packet Size must be a 32-bit integer type scalar that represents the size in bytes of each packet in the pipe.

Packet Alignment must be a 32-bit integer type scalar that presents the alignment in bytes of each packet in the pipe.

Packet Size and Packet Alignment must satisfy the following:
- 1 <= Packet Alignment <= Packet Size.
- Packet Alignment must evenly divide Packet Size.

For concrete types, Packet Alignment should equal Packet Size. For aggregate types, Packet Alignment should be the size of the largest primitive type in the hierarchy of types.

Capability:
BlockingPipesINTEL

5

5946

<id>
Pipe

<id>
Pointer

<id>
Packet Size

<id>
Packet Alignment

OpWritePipeBlockingINTEL

Write a packet from Pointer to the pipe object specified by Pipe. This instruction will not return until the write has completed successfully and thus if the pipe is full it will block until there is available capacity in the pipe.

Pipe must have a type of OpTypePipe with WriteOnly access qualifier.

Pointer must have a type of OpTypePointer with the same data type as Pipe and a Generic Storage Class.

Packet Size must be a 32-bit integer type scalar that represents the size in bytes of each packet in the pipe.

Packet Alignment must be a 32-bit integer type scalar that presents the alignment in bytes of each packet in the pipe.

Packet Size and Packet Alignment must satisfy the following:
- 1 <= Packet Alignment <= Packet Size.
- Packet Alignment must evenly divide Packet Size.

For concrete types, Packet Alignment should equal Packet Size. For aggregate types, Packet Alignment should be the size of the largest primitive type in the hierarchy of types.

Capability:
BlockingPipesINTEL

5

5947

<id>
Pipe

<id>
Pointer

<id>
Packet Size

<id>
Packet Alignment

Issues

None.

Revision History

Rev Date Author Changes

1

2019-07-17

Joe Garvey

Initial public release