On Dec 15, 2012, at 10:46 AM, Siegmar Gross wrote:
>> 1. The datatypes passed to Scatter are not valid MPI datatypes
>> (MPI.OBJECT). You need to construct a datatype that is specific to the
>> !MyData class, just like you would in C/C++. I think that this is the
>> first error that you are seeing (i.e., that OMPI is trying to treat
>> MPI.OBJECT as an MPI Datatype object, and failing (and therefore throwing
>> an !ClassCastException exception).
> Perhaps you are right and my small example program ist not a valid MPI
> program. The problem is that I couldn't find any good documentation or
> example programs how to write a program which uses a structured data
In Java, that's probably true. Remember: there are no official MPI Java bindings. What is included in Open MPI is a research project from several years ago. We picked what appeared to be the best one, freshened it up a little, updated its build system to incorporate into ours, verified its basic functionality, and went with that.
In C, there should be plenty of google-able examples about how to use Scatter (and friends). You might want to have a look at a few of those to get an idea how to use MPI_Scatter in general, and then apply that knowledge to a Java program.
> Therefore I sticked to the mpiJava specification which states
> for derived datatypes in chapter 3.12 that the effect for MPI_Type_struct
> can be achieved by using MPI.OBJECT as the buffer type and relying on
> Java object serialization. "dataItem" is a serializable Java object and
> I used MPI.OBJECT as buffer type. How can I create a valid MPI datatype
> MPI.OBJECT so that I get a working example program?
/me reads some Java implementation code...
It looks like they allow passing MPI.OBJECT as the datatype argument; sorry, I guess I was wrong about that.
> MPI.COMM_WORLD.Scatter (dataItem, 0, 1, MPI.OBJECT,
> objBuffer, 0, 1, MPI.OBJECT, 0);
What I think you're running into here is that you're still using Scatter wrong, per my other point, below:
>> 1. It looks like you're trying to Scatter a single object to N peers.
>> That's invalid MPI -- you need to scatter (N*M) objects to N peers, where
>> M is a positive integer value (e.g., 1 or 2). Are you trying to
> It is the very first version of the program where I scatter one object
> to the process itself (at this point it is not the normal application
> area for scatter, but should nevertheless work). I didn't continue due
> to the error. I get the same error when I broadcast my data item.
> tyr java 116 mpiexec -np 1 java -cp $DIRPREFIX_LOCAL/mpi_classfiles \
> Exception in thread "main" java.lang.ClassCastException: MyData cannot
> be cast to [Ljava.lang.Object;
> at mpi.Intracomm.copyBuffer(Intracomm.java:119)
> at mpi.Intracomm.Scatter(Intracomm.java:389)
> at ObjectScatterMain.main(ObjectScatterMain.java:45)
I don't know Java, but it looks like it's complaining about the type of dataItem, not the type of MPI.OBJECT. It says it can't cast dataItem to a Ljava.lang.Object -- which appears to be the type of the first argument to Scatter.
Do you need to have MyData inherit from the Java base Object type, or some such?
> "Broadcast" works if I have only a root process and it fails when I have
> one more process.
If I change MPI.COMM_WORLD.Scatter(...) to
MPI.COMM_WORLD.Bcast(dataItem, 0, 1, MPI.OBJECT, 0);
I get the same casting error.
I'm sorry; I really don't know Java, and don't know how to fix this offhand.
For corporate legal information go to: http://www.cisco.com/web/about/doing_business/legal/cri/