Passing composite variable to mex file

1 view (last 30 days)
I am running an spmd, and I am wondering if there is a way to pass a composite variable to a mex file without "aggregating" it first. The following is a (simple) example. Say I have the following code.
parpool(2);
spmd
test = labindex + zeros(1000, 2);
end
result = sum([test{:}], 2);
Suppose I would like to replace the sum function with a C/mex implementation of it. It is possible to do something like the following:
test_cellarray = test(:);
result = sum_function(test_cellarray); % Not a built-in function
where sum_function takes in cell arrays. However, in the above "solution", the first line takes up the vast majority of the time.
Is it possible to pass "test" directly to a mex function and access the parts for different workers through pointers?
Thanks for the help.
  2 Comments
James Tursa
James Tursa on 31 Jan 2022
What exactly is the test variable? I.e., what does "whos test" show?
Vivek Bhattacharya
Vivek Bhattacharya on 31 Jan 2022
@James Tursa -- This is the output from inspecting the variables. (Including test_cellarray for illustration too.)
>> test
test =
Worker 1: class = double, size = [1000 2]
Worker 2: class = double, size = [1000 2]
>> test_cellarray
test_cellarray =
2×1 cell array
{1000×2 double}
{1000×2 double}
>> whos test test_cellarray
Name Size Bytes Class Attributes
test 1x2 265 Composite
test_cellarray 2x1 32208 cell

Sign in to comment.

Accepted Answer

Edric Ellis
Edric Ellis on 31 Jan 2022
Unfortunately, there is no way to access the elements of a Composite from a MEX file. Is there any way you could run the MEX file directly on the workers? If you need to run it on each element, that would probably be the best way.
  2 Comments
Vivek Bhattacharya
Vivek Bhattacharya on 31 Jan 2022
Thanks, @Edric Ellis! Yes, I'm currently doing most of the computation within the spmd loop, but there is one part of the calculation that requires the entire vector of output from each worker and can't be done individually on each worker. (Perhaps the sum is a bad example on that dimension.) I was hoping that it would be possible to send pointers to each worker's data to a mex function (or something like that), but good to know that that's not possible.
Edric Ellis
Edric Ellis on 31 Jan 2022
You might be better off collecting the data on a single worker, and working with it there. Worker-to-worker communication is generally more efficient than worker-to-client. I.e. something like:
spmd
myVal = someComputation();
catDim = 1; % dimension to concatenate results
targetWorker = 1;
allVals = gcat(myVal, catDim, targetWorker);
if labindex == targetWorker
endResult = doStuff(allVals);
end
end

Sign in to comment.

More Answers (0)

Products


Release

R2021b

Community Treasure Hunt

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

Start Hunting!