Unexpected behaviour of sequenceLength attribute in protocol argument

D
dwp@md1tech.co.uk
Fri, Apr 28, 2023 1:49 PM

Hi,

Apologies for such a long message. The sequenceLength property does not act as an upper bound if the size in memory of the resulting array is below 8192.

To reproduce:

Create a protocol named test with the following spec:

<Protocol datavaluegranularity="2">
<Operation Name="msg" >
<Argument name="data" type="Short" sequenceLength="64"/>
</Operation>
</Protocol>

Create a component with the following spec:

<ComponentSpec>
<DataInterfaceSpec name='test' producer='true' protocol='test-prot.xml'/>
</ComponentSpec>

Create a C++ worker and add the following lines to the run method:

std::cout << test.msg().data().size() << std::endl ;
test.msg().data().resize (640) ;
std::cout << test.msg().data().size() << std::endl ;

You would expect this to give an error, since there is an attempt to resize the array to a value greater than sequenceLength however the program outputs:

0
640

If instead we have:

test.msg().data().resize (6400) ;

We get the following error:

Container "rcc0" background thread exception: operation "msg" argument "data": sequence size 6400 (12800 bytes) exceeds remaining buffer size (8192)


To see what I believe is the expected behaviour, change the sequenceLength attribute in the test protocol to 6400. Then in the worker’s run method:

std::cout << test.msg().data().size() << std::endl ;
test.msg().data().resize (6400) ;
std::cout << test.msg().data().size() << std::endl ;

outputs :

0
6400

as expected, and you can see that the underlying buffer size has been changed if we instead have:

test.msg().data().resize (6500) ;

which gives the error:

Container "rcc0" background thread exception: operation "msg" argument "data": sequence size 6500 (13000 bytes) exceeds remaining buffer size (12800)

This error is also present if sequenceLength is 0 which, according to documentation, is supposed to result in no upper bound.

I discovered this when attempting to create a very large sequence protocol, is there a hard limit on the size in memory of a protocol of 2^16? As when sequenceLength is 100,000 I get the following error:

app failed: Value for property "ocpi_buffer_size_test" of instance "fft" of component "local.uhd.uhd.fft" is invalid for its type: for property ocpi_buffer_size_test: Expression value (2.00064e5) is out of range for UShort type properties (0 to 6.5535e4)

Thanks in advance,
Dan

Hi, Apologies for such a long message. The sequenceLength property does not act as an upper bound if the size in memory of the resulting array is below 8192. To reproduce: Create a protocol named `test` with the following spec: `<Protocol datavaluegranularity="2">`\ ` <Operation Name="msg" >`\ ` <Argument name="data" type="Short" sequenceLength="64"/>`\ ` </Operation>`\ `</Protocol>` Create a component with the following spec: `<ComponentSpec>`\ ` <DataInterfaceSpec name='test' producer='true' protocol='test-prot.xml'/>`\ `</ComponentSpec>` Create a C++ worker and add the following lines to the run method: `std::cout << test.msg().data().size() << std::endl ;`\ `test.msg().data().resize (640) ;`\ `std::cout << test.msg().data().size() << std::endl ;` You would expect this to give an error, since there is an attempt to resize the array to a value greater than `sequenceLength `however the program outputs: `0`\ `640` If instead we have: `test.msg().data().resize (6400) ;` We get the following error: `Container "rcc0" background thread exception: `…` operation "msg" argument "data": sequence size 6400 (12800 bytes) exceeds remaining buffer size (8192)` \ To see what I believe is the expected behaviour, change the `sequenceLength` attribute in the `test` protocol to 6400. Then in the worker’s run method:\ \ `std::cout << test.msg().data().size() << std::endl ;`\ `test.msg().data().resize (6400) ;`\ `std::cout << test.msg().data().size() << std::endl ;` outputs : `0`\ `6400` as expected, and you can see that the underlying buffer size has been changed if we instead have: `test.msg().data().resize (6500) ;` which gives the error: `Container "rcc0" background thread exception: `…` operation "msg" argument "data": sequence size 6500 (13000 bytes) exceeds remaining buffer size (12800)` This error is also present if `sequenceLength` is 0 which, according to documentation, is supposed to result in no upper bound. I discovered this when attempting to create a very large sequence protocol, is there a hard limit on the size in memory of a protocol of 2^16? As when `sequenceLength` is 100,000 I get the following error: `app failed: Value for property "ocpi_buffer_size_test" of instance "fft" of component "local.uhd.uhd.fft" is invalid for its type: for property ocpi_buffer_size_test: Expression value (2.00064e5) is out of range for UShort type properties (0 to 6.5535e4)` Thanks in advance,\ Dan