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/