How to efficiently create an array of libpointers?

조회 수: 1 (최근 30일)
Pico Technology
Pico Technology 2013년 10월 1일
댓글: Pico Technology 2013년 10월 7일
Hi,
I am working on a piece of code to create a 2D array of libpointers that can be passed to a shared library. This corresponds to dividing up the memory on a device to capture data for each channel on a device:
nCaptures = 2000000;
num_samples = 64;
tic;
for ch = 1:4
for segment = 1:nCaptures
if(channelSettings(ch).enabled)
rapidBlockBuffer(ch, segment) = libpointer('int16Ptr', zeros(num_samples, 1));
[status.setDataBufferBulk(ch, segment)] = calllib('PS6000', 'ps6000SetDataBufferBulk', handle, ch - 1, ...
rapidBlockBuffer(ch, segment), num_samples, segment - 1, downSampleRatioMode);
else
rapidBlockBuffer(ch, segment) = libpointer('int16Ptr', 0);
end
end
end
toc;
On a Windows 8 64-bit PC with MATLAB 2012b, this code was running for well over 1.5 hours and hadn't completed.
Is the else condition a suitable way of maintaining the array dimensions if a channel on the device is not enabled?
Thanks,
H
  댓글 수: 2
Philip Borghesani
Philip Borghesani 2013년 10월 2일
I am not sure that creating this many libpointer objects makes sense for any application. More information on the problem you are trying to solve or the system you are trying to implement might help give perspective on alternate solutions.
Pico Technology
Pico Technology 2013년 10월 3일
Hi Philip,
To put it into context, our oscilloscope devices have a buffer memory which can be divided into segments for rapid data acquisition. Each segment can effectively be subdivided into memory for the channels that are active on the device.
The reason for setting up a 2-D array of libpointers is to allocate memory for the underlying driver to write data to when the function to retrieve data values is called.
I hope this provides clarification.
Thanks,
H

댓글을 달려면 로그인하십시오.

채택된 답변

Philip Borghesani
Philip Borghesani 2013년 10월 2일
편집: Philip Borghesani 2013년 10월 2일
The libpointer code itself is fine but if you did not preallocate rapidBlockBuffer then this code is very slow (order n^2 instead of order n). I added
rapidBlockBuffer(4,nCaptures)=libpointer;
before the ch for loop and find the code without the calllib call will complete in a few minutes. If status.setDataBufferBulk is not preallocated then it should also be.
When rapidBlockBuffer is prealloced there is no need for the else block inserting a dummy pointer.
  댓글 수: 1
Pico Technology
Pico Technology 2013년 10월 7일
Without the call to the dll, the execution time of the setup using the above suggestion takes around 220 - 225 seconds.
Thanks!

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Call C from MATLAB에 대해 자세히 알아보기

태그

제품

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by