00001 #ifndef MOC_DOXYGEN_MAIN_H_ 00002 #define MOC_DOXYGEN_MAIN_H_ 00003 00004 /** 00005 * \mainpage MPI On Cell 00006 * 00007 * The idea of this project is to implement a message passing 00008 * library for work on the Cell BE. The main idea behind such 00009 * an implementation would be to help the programmer by adding 00010 * an layer of abstraction between the very low level libraries 00011 * by IBM and give him the possibility to work with an interface 00012 * he is more familiar with. To achieve this we decided to try 00013 * to keep very closely to the standard provided by the Message 00014 * Passing Interface (MPI), so that programmers knowing how to 00015 * write MPI programmers can easily work with our library. 00016 * Because of the very special nature of the Cell, it might not 00017 * be possible to keep 100% true to the standard, but we try to 00018 * introduce changes only when absolutely necessary and of great 00019 * benefit, because of some specialties of the Cell's hardware. 00020 * 00021 * 00022 * \par Table of Content 00023 * \par 00024 * \ref end_user 00025 * \par 00026 * \subpage restrictions 00027 * \par 00028 * \subpage violations 00029 * \par 00030 * \subpage performance 00031 * \par 00032 * \subpage conclusion 00033 * \if full 00034 * \par 00035 * \par 00036 * \ref internal_main 00037 * \endif 00038 **/ 00039 00040 00041 /** 00042 * \defgroup end_user End-User Documentation 00043 * 00044 * This section describes the public API provided by the MOC-library. 00045 * 00046 * If some things remain unclear, consult the official MPI-standard (Version 1.3). 00047 * 00048 * This library uses Direct Memory Access (DMA) provided by the Cell Broadband Engine. 00049 * So the use of other DMA operations than provided of this library is discouraged, 00050 * because it may interfere with this library. One exceptions are signals. 00051 * We don't use signals at all at the moment, so one can savely use signal. 00052 **/ 00053 00054 00055 /** 00056 * \defgroup environment_main Environmental Management 00057 * \ingroup end_user 00058 * 00059 * This chapter discusses routines for getting and, where appropriate, setting various parameters 00060 * that relate to the MPI implementation and the execution environment (such as error handling, 00061 * startup&shutdown and Time). 00062 **/ 00063 /** 00064 * \defgroup environment_startup Startup & Shutdown 00065 * \ingroup environment_main 00066 * 00067 * Functions to start and terminate the MOC-execution environment. 00068 * 00069 * To be able to communicate with other processes every MOC-process needs to setup his 00070 * MOC-Environment before any MOC-function can be called (there are some exceptions though). 00071 * 00072 * The PPU-process has a special role, because he is the one who starts the SPU-processes. 00073 * SPU-processes can be added to the MOC-environment by calling \ref MOC_Add_spu_thread with 00074 * the appropriate SPU-thread-handle (This implementation only supports the embedded binary 00075 * concept where the SPU-binary is embedded into the PPU-binary and accessed via a handle). 00076 * The order of calling determines the rank of the SPU-processes. To get the number of total 00077 * and available SPUs the functions \ref MOC_Get_avail_spu_count and \ref MOC_Get_max_spu_count 00078 * can be used. 00079 * 00080 * The buffer-size and the size of the message-queues can be set before calling \ref MOC_Init 00081 * on the PPU using \ref MOC_Set_buffer_size and \ref MOC_Set_queue_size. 00082 * 00083 * MOC_Init only returns after all processes have called this function and have set up their 00084 * environment. 00085 * 00086 * If the MOC-environment isn't needed anymore, \ref MOC_Finalize should be called by all 00087 * MOC-processes. MOC_Finalize only returns after all MOC-processes have called this functions 00088 * and have shutdown their environments. 00089 **/ 00090 /** 00091 * \defgroup environment_information Implementation Information 00092 * \ingroup environment_main 00093 **/ 00094 /** 00095 * \defgroup environment_error Error-Handling 00096 * \ingroup environment_main 00097 **/ 00098 /** 00099 * \defgroup environment_timer Timers and Synchronization 00100 * \ingroup environment_main 00101 **/ 00102 00103 /** 00104 * \defgroup p2p_main Point-to-Point Communication 00105 * \ingroup end_user 00106 * 00107 * Sending and receiving of messages by processes is the basic MPI communication mechanism. 00108 * The basic point-to-point communication operations are send and receive. 00109 * 00110 * \ref MOC_Send uses either buffered or synchronous send depending on the message-size 00111 * (Short messages are transmitted using buffered send and long messages are transmitted using 00112 * synchronous send). 00113 * 00114 * \ref MOC_Recv receives all messages irrespective wether buffered or synchronous 00115 * communication is used. 00116 * 00117 * \note Because there are separate message-queues for each remote process and no distinct 00118 * global ordering of messages, there may be some situation where a message from a 00119 * process may never be received. This may occur when MOC_Recv, MOC_Probe and MOC_IProbe 00120 * are used with MOC_ANY_SOURCE, because then there is the possibility that new messages 00121 * are received before a specific message from a process with a higher rank than the other 00122 * senders. This may also occur with lower possibility when using MOC_ANY_TAG between 00123 * messages from the same sender but with other tags. 00124 * 00125 **/ 00126 /** 00127 * \defgroup p2p_status Return Status 00128 * \ingroup p2p_main 00129 **/ 00130 /** 00131 * \defgroup p2p_datatype Datatypes 00132 * \ingroup p2p_main 00133 **/ 00134 /** 00135 * \defgroup p2p_synch Synchronous Communication 00136 * \ingroup p2p_main 00137 * 00138 * Direct blocking sending of messages without any intermediate buffer. 00139 * 00140 * The blocking synchronous send-operation returns only when the receiver has completely 00141 * received the message. 00142 **/ 00143 /** 00144 * \defgroup p2p_buffered Buffered Communication 00145 * \ingroup p2p_main 00146 * 00147 * Blocking sending of messages with the use of an intermediate buffer. 00148 * 00149 * The blocking buffered send-operation returns if the send-buffer can be safely reused 00150 * (after the data has been copied into the intermediate buffer). 00151 **/ 00152 /** 00153 * \defgroup p2p_sendrecv Send-Receive 00154 * \ingroup p2p_main 00155 * 00156 * The send-receive operations combine in one call the sending of a message 00157 * to one destination and the receiving of another message, from another process. 00158 * 00159 * A message sent by a send-receive operation can be received by a regular receive 00160 * operation or probed by a probe operation; a send-receive operation can receive 00161 * a message sent by a regular send operation. 00162 **/ 00163 /** 00164 * \defgroup p2p_imm Non-Blocking Communication 00165 * \ingroup p2p_main 00166 * 00167 * Non-blocking sending and receiving messages. 00168 * 00169 * Because of restrictions of the Cell Broadband Engine non-blocking communication can 00170 * only be provided with a lot of limitations. In fact the only operation where 00171 * non-blocking communication make sense is synchronous send. 00172 * 00173 * \ref MOC_ISend uses blocking buffered send or non-blocking synchronous send according to 00174 * the message size. 00175 * 00176 * \note Every non-blocking communication operation has to be finished using \ref MOC_Test 00177 * or \ref MOC_Wait, otherwise resources are no freed and some data are not copied correctly. 00178 **/ 00179 00180 00181 /** 00182 * \defgroup broadcast Collective Communication 00183 * \ingroup end_user 00184 * 00185 * Communication that involves a group of processes. 00186 * 00187 * A collective operation is normally executed by having all processes in the group call 00188 * the communication routine, with matching arguments. Since there are no means for creating 00189 * groups currently implemented, the only available groups are MOC_COMM_WORLD and 00190 * MOC_COMM_SELF. 00191 **/ 00192 00193 00194 /** 00195 * \defgroup dma_access Direct Memory Access 00196 * \ingroup end_user 00197 * 00198 * Functions which use DMA to transfer Data. 00199 * 00200 * The operations defined in this section provide simple means to use Direct Memory 00201 * Access (DMA). 00202 * 00203 * The MPI-standard assumes a distributed memory architecture, where 00204 * active participation of the sending and the receiving processes is required. But 00205 * the Cell Broadband Engine is a distributed shared memory architecture which provides 00206 * a common address space and DMA-Operations enabling processes to write data directly 00207 * into the memory of an remote process without active participation of the receiving 00208 * process. 00209 * DMA is faster than Send-Receive but more complicated to handle, and so there are some 00210 * functions provided to enable the advantages of DMA and to hide as much complexity as 00211 * possible. So the user doesn't have to care about the upper-limit of an DMA-transfer 00212 * and in get-operations the data-size doesn't have to be a multiple of 16-byte. However 00213 * the data-address should be at least 16-byte aligned and in put-operations the data-size 00214 * has to be a multiple of 16-byte. 00215 * 00216 * There are two kind of addresses. Local-store addresses are used on the SPUs and are only 00217 * valid in context of a specific SPU. Effective addresses define a common address-space and 00218 * are used on the PPU. Functions to translate between those address types are provided. 00219 * 00220 * DMA-operations can be blocking or non-blocking. The status of non-blocking DMA-calls can 00221 * be requested by using \ref MOC_Test and \ref MOC_Wait. 00222 * 00223 * \note Every non-blocking DMA operation has to be finished using \ref MOC_Test 00224 * or \ref MOC_Wait, otherwise resources are no freed and some data are not copied correctly. 00225 **/ 00226 00227 /** 00228 * \defgroup comm_main Groups, Context and Communicators 00229 * \ingroup end_user 00230 * 00231 * The MOC communicator specifies a group of processes inside which 00232 * a communication occurs. 00233 * Initially there is a single communicator, MPI_COMM_WORLD, which 00234 * contains all of the processes involved in the computation. 00235 **/ 00236 /** 00237 * \defgroup comm_mgt Communicator Management 00238 * \ingroup comm_main 00239 **/ 00240 00241 00242 00243 00244 #endif /*MOC_DOXYGEN_MAIN_H_*/
1.5.6