mpi :: MPI :: defaultinit
mpi :: MPI :: native_recv
Receive into aNativeCArray
buffer
with a given count
of data_type
mpi :: MPI :: native_send
Send aNativeCArray
buffer
with a given count
of data_type
mpi :: MPI :: processor_name
Name of this processor, usually the hostnamempi :: MPI :: recv_empty
Receive an empty buffer, only for thetag
mpi :: MPI :: send_empty
Send an empty buffer, only for thetag
core :: Object :: class_factory
Implementation used byget_class
to create the specific class.
core :: Object :: defaultinit
mpi :: MPI :: defaultinit
core :: Object :: is_same_instance
Return true ifself
and other
are the same instance (i.e. same identity).
core :: Object :: is_same_serialized
Isself
the same as other
in a serialization context?
core :: Object :: is_same_type
Return true ifself
and other
have the same dynamic type.
mpi :: MPI :: native_recv
Receive into aNativeCArray
buffer
with a given count
of data_type
mpi :: MPI :: native_send
Send aNativeCArray
buffer
with a given count
of data_type
core :: Object :: output_class_name
Display class name on stdout (debug only).mpi :: MPI :: processor_name
Name of this processor, usually the hostnamempi :: MPI :: recv_empty
Receive an empty buffer, only for thetag
mpi :: MPI :: send_empty
Send an empty buffer, only for thetag
# Handle to most MPI services
class MPI
# Initialize the MPI execution environment
init do native_init
private fun native_init `{ MPI_Init(NULL, NULL); `}
# Terminates the MPI execution environment
fun finalize `{ MPI_Finalize(); `}
# Name of this processor, usually the hostname
fun processor_name: String import CString.to_s_with_length `{
char *name = malloc(MPI_MAX_PROCESSOR_NAME);
int size;
MPI_Get_processor_name(name, &size);
return CString_to_s_with_length(name, size);
`}
# Send the content of a buffer
fun send_from(buffer: Sendable, at, count: Int, dest: Rank, tag: Tag, comm: Comm)
do
buffer.send(self, at, count, dest, tag, comm)
end
# Send the full content of a buffer
fun send_all(buffer: Sendable, dest: Rank, tag: Tag, comm: Comm)
do
buffer.send_all(self, dest, tag, comm)
end
# Efficiently receive data in an existing buffer
fun recv_into(buffer: Receptacle, at, count: Int, source: Rank, tag: Tag, comm: Comm)
do
buffer.recv(self, at, count, source, tag, comm)
end
# Efficiently receive data and fill an existing buffer
fun recv_fill(buffer: Receptacle, source: Rank, tag: Tag, comm: Comm)
do
buffer.recv_fill(self, source, tag, comm)
end
# Send a complex `Serializable` object
fun send(data: nullable Serializable, dest: Rank, tag: Tag, comm: Comm)
do
# Serialize data
var stream = new StringWriter
var serializer = new JsonSerializer(stream)
serializer.serialize(data)
# Send message
var str = stream.to_s
send_from(str, 0, str.length, dest, tag, comm)
end
# Receive a complex object
fun recv(source: Rank, tag: Tag, comm: Comm): nullable Object
do
var status = new Status
# Block until a message in in queue
var err = probe(source, tag, comm, status)
assert err.is_success else print err
# Get message length
var count = status.count(new DataType.char)
assert not count.is_undefined
# Receive message into buffer
var buffer = new FlatBuffer.with_capacity(count)
recv_into(buffer, 0, count, status.source, status.tag, comm)
# Free our status
status.free
# Deserialize message
var deserializer = new JsonDeserializer(buffer)
var deserialized = deserializer.deserialize
if deserialized == null then print "|{buffer}|{buffer.chars.join("-")}| {buffer.length}"
return deserialized
end
# Send an empty buffer, only for the `tag`
fun send_empty(dest: Rank, tag: Tag, comm: Comm): SuccessOrError
`{
return MPI_Send(NULL, 0, MPI_CHAR, dest, tag, comm);
`}
# Receive an empty buffer, only for the `tag`
fun recv_empty(dest: Rank, tag: Tag, comm: Comm): SuccessOrError
`{
return MPI_Recv(NULL, 0, MPI_CHAR, dest, tag, comm, MPI_STATUS_IGNORE);
`}
# Send a `NativeCArray` `buffer` with a given `count` of `data_type`
fun native_send(buffer: NativeCArray, count: Int, data_type: DataType, dest: Rank, tag: Tag, comm: Comm): SuccessOrError
`{
return MPI_Send(buffer, count, data_type, dest, tag, comm);
`}
# Receive into a `NativeCArray` `buffer` with a given `count` of `data_type`
fun native_recv(buffer: NativeCArray, count: Int, data_type: DataType, dest: Rank, tag: Tag, comm: Comm, status: Status): SuccessOrError
`{
return MPI_Recv(buffer, count, data_type, dest, tag, comm, status);
`}
# Probe for the next data to receive, store the result in `status`
#
# Note: If you encounter an error where the next receive does not correspond
# to the last `probe`, call this method twice to ensure a correct result.
fun probe(source: Rank, tag: Tag, comm: Comm, status: Status): SuccessOrError
`{
return MPI_Probe(source, tag, comm, status);
`}
# Synchronize all processors
fun barrier(comm: Comm) `{ MPI_Barrier(comm); `}
# Seconds since some time in the past which does not change
fun wtime: Float `{ return MPI_Wtime(); `}
end
lib/mpi/mpi.nit:42,1--164,3