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
> type.

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.

Make sense?

> 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
>> broadcast?
> 
> 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 \
>  ObjectScatterMain
> 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.

-- 
Jeff Squyres
jsquy...@cisco.com
For corporate legal information go to: 
http://www.cisco.com/web/about/doing_business/legal/cri/


Reply via email to