00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00017 #include "machine.h"
00018
00019
00020
00021
00022
00023 extern USHORT VMI_DEVICE_RUNTIME;
00024 extern PVMI_NETADDRESS localAddress;
00025 extern VMIStreamRecv recvFn;
00026
00027
00028 int _Cmi_numpes;
00029 int _Cmi_mype;
00030 int _Cmi_myrank = 0;
00031
00032 CpvDeclare (void *, CmiLocalQueue);
00033 CpvDeclare (void *, CMI_VMI_RemoteQueue);
00034
00035 extern void CthInit (char **argv);
00036 extern void ConverseCommonInit (char **argv);
00037
00038
00039 char *CMI_VMI_Username;
00040 char *CMI_VMI_Program_Key;
00041 int CMI_VMI_Startup_Type;
00042 int CMI_VMI_WAN_Latency;
00043 int CMI_VMI_Cluster;
00044 int CMI_VMI_Probe_Clusters;
00045 int CMI_VMI_Memory_Pool;
00046 int CMI_VMI_Terminate_VMI_Hack;
00047 int CMI_VMI_Connection_Timeout;
00048 int CMI_VMI_Maximum_Handles;
00049 int CMI_VMI_Small_Message_Boundary;
00050 int CMI_VMI_Medium_Message_Boundary;
00051 int CMI_VMI_Eager_Protocol;
00052 int CMI_VMI_Eager_Interval;
00053 int CMI_VMI_Eager_Threshold;
00054 int CMI_VMI_Eager_Short_Pollset_Size_Maximum;
00055 int CMI_VMI_Eager_Short_Slots;
00056 int CMI_VMI_Eager_Short_Message_Boundary;
00057 int CMI_VMI_Eager_Long_Buffers;
00058 int CMI_VMI_Eager_Long_Buffer_Size;
00059
00060 volatile int CMI_VMI_Message_Receive_Count;
00061 volatile int CMI_VMI_AsyncMsgCount;
00062 volatile int CMI_VMI_Barrier_Count;
00063
00064 int CMI_VMI_Charmrun_Socket;
00065 char CMI_VMI_Charmrun_IP[1024];
00066 int CMI_VMI_Charmrun_Port;
00067
00068 int CMI_VMI_CRM_Socket;
00069 char *CMI_VMI_CRM_Hostname;
00070 int CMI_VMI_CRM_Port;
00071
00072 CMI_VMI_Process_T *CMI_VMI_Processes;
00073 CMI_VMI_Process_T **CMI_VMI_Eager_Short_Pollset;
00074 int CMI_VMI_Eager_Short_Pollset_Size;
00075
00076 CMI_VMI_Handle_T *CMI_VMI_Handles;
00077 int CMI_VMI_Next_Handle;
00078
00079 int CMI_VMI_Latency_Vectors_Received;
00080 BOOLEAN CMI_VMI_Cluster_Mapping_Received;
00081
00082 PVMI_BUFFER_POOL CMI_VMI_Bucket1_Pool;
00083 PVMI_BUFFER_POOL CMI_VMI_Bucket2_Pool;
00084 PVMI_BUFFER_POOL CMI_VMI_Bucket3_Pool;
00085 PVMI_BUFFER_POOL CMI_VMI_Bucket4_Pool;
00086 PVMI_BUFFER_POOL CMI_VMI_Bucket5_Pool;
00087
00088 #if CMK_GRID_QUEUE_AVAILABLE
00089 CMI_VMI_Grid_Object_T *CMI_VMI_Grid_Objects;
00090 int CMI_VMI_Grid_Objects_Index;
00091 int CMI_VMI_Grid_Queue;
00092 int CMI_VMI_Grid_Queue_Maximum;
00093 int CMI_VMI_Grid_Queue_Interval;
00094 int CMI_VMI_Grid_Queue_Threshold;
00095 #endif
00096
00097 #ifdef GK_DELAY_DEVICE
00098 typedef struct
00099 {
00100 double time;
00101 char *msg;
00102 int msgsize;
00103 int sender;
00104 void *next;
00105 } gk_delayed_msgs;
00106
00107 double gk_timeout1;
00108 gk_delayed_msgs *gk_head_ptr1;
00109 gk_delayed_msgs *gk_tail_ptr1;
00110
00111 double gk_timeout2;
00112 gk_delayed_msgs *gk_head_ptr2;
00113 gk_delayed_msgs *gk_tail_ptr2;
00114 #endif
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127 void ConverseInit (int argc, char **argv, CmiStartFn start_function, int user_calls_scheduler, int init_returns)
00128 {
00129 int rc;
00130 int i;
00131 int j;
00132
00133
00134 DEBUG_PRINT ("ConverseInit() called.\n");
00135
00136
00137 if (!(CMI_VMI_Program_Key = strdup (argv[0]))) {
00138 CmiAbort ("Unable to allocate memory for the program key.");
00139 }
00140
00141
00142 CMI_VMI_Startup_Type = CMI_VMI_STARTUP_TYPE_UNKNOWN;
00143 CMI_VMI_WAN_Latency = CMI_VMI_WAN_LATENCY;
00144 CMI_VMI_Cluster = CMI_VMI_CLUSTER_UNKNOWN;
00145 CMI_VMI_Probe_Clusters = CMI_VMI_PROBE_CLUSTERS;
00146 #if CMK_GRID_QUEUE_AVAILABLE
00147 CMI_VMI_Grid_Queue = CMI_VMI_GRID_QUEUE;
00148 CMI_VMI_Grid_Queue_Maximum = CMI_VMI_GRID_QUEUE_MAXIMUM;
00149 CMI_VMI_Grid_Queue_Interval = CMI_VMI_GRID_QUEUE_INTERVAL;
00150 CMI_VMI_Grid_Queue_Threshold = CMI_VMI_GRID_QUEUE_THRESHOLD;
00151 #endif
00152 CMI_VMI_Memory_Pool = CMI_VMI_MEMORY_POOL;
00153 CMI_VMI_Terminate_VMI_Hack = CMI_VMI_TERMINATE_VMI_HACK;
00154 CMI_VMI_Connection_Timeout = CMI_VMI_CONNECTION_TIMEOUT;
00155 CMI_VMI_Maximum_Handles = CMI_VMI_MAXIMUM_HANDLES;
00156 CMI_VMI_Small_Message_Boundary = CMI_VMI_SMALL_MESSAGE_BOUNDARY;
00157 CMI_VMI_Medium_Message_Boundary = CMI_VMI_MEDIUM_MESSAGE_BOUNDARY;
00158 CMI_VMI_Eager_Protocol = CMI_VMI_EAGER_PROTOCOL;
00159 CMI_VMI_Eager_Interval = CMI_VMI_EAGER_INTERVAL;
00160 CMI_VMI_Eager_Threshold = CMI_VMI_EAGER_THRESHOLD;
00161 CMI_VMI_Eager_Short_Pollset_Size_Maximum = CMI_VMI_EAGER_SHORT_POLLSET_SIZE_MAXIMUM;
00162 CMI_VMI_Eager_Short_Slots = CMI_VMI_EAGER_SHORT_SLOTS;
00163 CMI_VMI_Eager_Short_Message_Boundary = CMI_VMI_EAGER_SHORT_MESSAGE_BOUNDARY;
00164 CMI_VMI_Eager_Long_Buffers = CMI_VMI_EAGER_LONG_BUFFERS;
00165 CMI_VMI_Eager_Long_Buffer_Size = CMI_VMI_EAGER_LONG_BUFFER_SIZE;
00166
00167 CMI_VMI_Message_Receive_Count = 0;
00168 CMI_VMI_AsyncMsgCount = 0;
00169 CMI_VMI_Barrier_Count = 0;
00170
00171 CMI_VMI_Cluster_Mapping_Received = FALSE;
00172
00173
00174 CMI_VMI_Read_Environment ();
00175
00176
00177 CMI_VMI_Processes = (CMI_VMI_Process_T *) (malloc (_Cmi_numpes * sizeof (CMI_VMI_Process_T)));
00178 if (!CMI_VMI_Processes) {
00179 CmiAbort ("Unable to allocate memory for process array.");
00180 }
00181
00182 CMI_VMI_Eager_Short_Pollset = (CMI_VMI_Process_T **) (malloc (_Cmi_numpes * sizeof (CMI_VMI_Process_T *)));
00183 if (!CMI_VMI_Eager_Short_Pollset) {
00184 CmiAbort ("Unable to allocate memory for eager pollset array.");
00185 }
00186
00187 for (i = 0; i < _Cmi_numpes; i++) {
00188 (&CMI_VMI_Processes[i])->connection_state = CMI_VMI_CONNECTION_DISCONNECTED;
00189 (&CMI_VMI_Processes[i])->cluster = CMI_VMI_CLUSTER_UNKNOWN;
00190
00191 (&CMI_VMI_Processes[i])->latency_vector = NULL;
00192
00193 (&CMI_VMI_Processes[i])->normal_short_count;
00194 (&CMI_VMI_Processes[i])->normal_long_count;
00195 (&CMI_VMI_Processes[i])->eager_short_count;
00196 (&CMI_VMI_Processes[i])->eager_long_count;
00197
00198 for (j = 0; j < CMI_VMI_Eager_Short_Slots; j++) {
00199 (&CMI_VMI_Processes[i])->eager_short_send_handles[j] = NULL;
00200 (&CMI_VMI_Processes[i])->eager_short_receive_handles[j] = NULL;
00201 }
00202
00203 (&CMI_VMI_Processes[i])->eager_short_send_size = 0;
00204 (&CMI_VMI_Processes[i])->eager_short_send_index = 0;
00205 (&CMI_VMI_Processes[i])->eager_short_send_credits_available = 0;
00206
00207 (&CMI_VMI_Processes[i])->eager_short_receive_size = 0;
00208 (&CMI_VMI_Processes[i])->eager_short_receive_index = 0;
00209 (&CMI_VMI_Processes[i])->eager_short_receive_dirty = 0;
00210 (&CMI_VMI_Processes[i])->eager_short_receive_credits_replentish = 0;
00211
00212 CMI_VMI_Eager_Short_Pollset[i] = (CMI_VMI_Process_T *) NULL;
00213
00214 for (j = 0; j < CMI_VMI_Eager_Long_Buffers; j++) {
00215 (&CMI_VMI_Processes[i])->eager_long_send_handles[j] = NULL;
00216 (&CMI_VMI_Processes[i])->eager_long_receive_handles[j] = NULL;
00217 }
00218
00219 (&CMI_VMI_Processes[i])->eager_long_send_size = 0;
00220 (&CMI_VMI_Processes[i])->eager_long_receive_size = 0;
00221 }
00222
00223 CMI_VMI_Eager_Short_Pollset_Size = 0;
00224
00225
00226 CMI_VMI_Handles = (CMI_VMI_Handle_T *) (malloc (CMI_VMI_Maximum_Handles * sizeof (CMI_VMI_Handle_T)));
00227 if (!CMI_VMI_Handles) {
00228 CmiAbort ("Unable to allocate memory for handle array.");
00229 }
00230
00231 for (i = 0; i < CMI_VMI_Maximum_Handles; i++) {
00232 (&CMI_VMI_Handles[i])->index = i;
00233 (&CMI_VMI_Handles[i])->refcount = 0;
00234 }
00235
00236 CMI_VMI_Next_Handle = 0;
00237
00238
00239 DEBUG_PRINT ("The program key is %s.\n", key);
00240 DEBUG_PRINT ("The startup type is %d.\n", CMI_VMI_Startup_Type);
00241
00242
00243 switch (CMI_VMI_Startup_Type)
00244 {
00245 case CMI_VMI_STARTUP_TYPE_CRM:
00246 rc = CMI_VMI_Startup_CRM ();
00247 break;
00248
00249 case CMI_VMI_STARTUP_TYPE_CHARMRUN:
00250 rc = CMI_VMI_Startup_Charmrun ();
00251 break;
00252
00253 default:
00254 CmiAbort ("An unknown startup type was specified.");
00255 break;
00256 }
00257
00258 if (rc < 0) {
00259 CmiAbort ("There was a fatal error during the startup phase.");
00260 }
00261
00262 #ifdef GK_DELAY_DEVICE
00263 {
00264 char *value;
00265 unsigned long timeout_us;
00266
00267 if (value = getenv ("GK_GET_LATENCY")) {
00268 timeout_us = (unsigned long) atoi (value);
00269 gk_timeout1 = ((double) timeout_us) * 0.000001;
00270 gk_timeout2 = ((double) timeout_us) * 0.000001 * 2;
00271 if (_Cmi_mype == 0) {
00272 CmiPrintf ("*** Charm is using artificial latency of %f and artificial Get latency of %f\n", gk_timeout1, gk_timeout2);
00273 }
00274 } else {
00275 CmiAbort ("Charm built with GK_DELAY_DEVICE but GK_GET_LATENCY not in environment.");
00276 }
00277
00278 gk_head_ptr1 = NULL;
00279 gk_tail_ptr1 = NULL;
00280
00281 gk_head_ptr2 = NULL;
00282 gk_tail_ptr2 = NULL;
00283 }
00284 #endif
00285
00286
00287 rc = CMI_VMI_Initialize_VMI ();
00288
00289 if (rc < 0) {
00290 CmiAbort ("There was a fatal error during VMI initialization.");
00291 }
00292
00293 DEBUG_PRINT ("VMI was initialized successfully.\n");
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303 CpvAccess (CmiLocalQueue) = CdsFifo_Create ();
00304 CpvAccess (CMI_VMI_RemoteQueue) = CdsFifo_Create ();
00305
00306
00307 rc = CMI_VMI_Open_Connections ();
00308
00309 if (rc < 0) {
00310 CmiAbort ("Fatal error during connection setup phase.");
00311 }
00312
00313
00314
00315
00316
00317
00318
00319
00320 if (CMI_VMI_Probe_Clusters) {
00321 if (_Cmi_mype == 0) {
00322 CmiBarrier ();
00323 CmiProbeLatencies ();
00324 CMI_VMI_Compute_Cluster_Mapping ();
00325 CMI_VMI_Distribute_Cluster_Mapping ();
00326 } else {
00327 CmiBarrier ();
00328 CMI_VMI_Wait_Cluster_Mapping ();
00329 }
00330 }
00331
00332 #if CMK_GRID_QUEUE_AVAILABLE
00333 CMI_VMI_Grid_Objects = (CMI_VMI_Grid_Object_T *) malloc (CMI_VMI_Grid_Queue_Maximum * sizeof (CMI_VMI_Grid_Object_T));
00334 if (!CMI_VMI_Grid_Objects) {
00335 CmiAbort ("Unable to allocate memory for Grid objects array.\n");
00336 }
00337 CMI_VMI_Grid_Objects_Index = 0;
00338 #endif
00339
00340 DEBUG_PRINT ("ConverseInit() is starting the main processing loop.\n");
00341
00342
00343 CthInit (argv);
00344 ConverseCommonInit (argv);
00345
00346
00347 CcdCallOnConditionKeep (CcdPROCESSOR_STILL_IDLE, (CcdVoidFn) CmiNotifyIdle, NULL);
00348
00349 if (!init_returns) {
00350 start_function (CmiGetArgc (argv), argv);
00351 if (!user_calls_scheduler) {
00352 CsdScheduler (-1);
00353 }
00354 ConverseExit ();
00355 }
00356 }
00357
00358
00359
00360
00361
00362
00363 void ConverseExit ()
00364 {
00365 VMI_STATUS status;
00366
00367 int i;
00368
00369
00370 DEBUG_PRINT ("ConverseExit() called.\n");
00371
00372
00373 ConverseCommonExit ();
00374
00375
00376 CmiBarrier ();
00377
00378
00379 for (i = 0; i < 1000000; i++) {
00380 status = VMI_Poll ();
00381 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
00382 }
00383
00384
00385
00386
00387
00388
00389
00390 if (CMI_VMI_Startup_Type == CMI_VMI_STARTUP_TYPE_CHARMRUN) {
00391 CMI_VMI_Charmrun_Message_Header_T hdr;
00392 int rc;
00393 char dummy[10];
00394
00395 hdr.msg_len = htonl (0);
00396 strcpy (hdr.msg_type, "ending");
00397
00398 rc = CMI_VMI_Socket_Send (CMI_VMI_Charmrun_Socket, (const void *) &hdr, (int) sizeof (CMI_VMI_Charmrun_Message_Header_T));
00399 if (rc < 0) {
00400 DEBUG_PRINT ("Error sending to charmrun.\n");
00401 }
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413 read (CMI_VMI_Charmrun_Socket, dummy, 1);
00414 }
00415
00416
00417 if (!CMI_VMI_Terminate_VMI_Hack) {
00418
00419 CMI_VMI_Close_Connections ();
00420
00421
00422 for (i = 0; i < 1000000; i++) {
00423 status = VMI_Poll ();
00424 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
00425 }
00426
00427
00428 CMI_VMI_Terminate_VMI ();
00429
00430
00431 #if CMK_GRID_QUEUE_AVAILABLE
00432 free (CMI_VMI_Grid_Objects);
00433 #endif
00434 CdsFifo_Destroy (CpvAccess (CMI_VMI_RemoteQueue));
00435 CdsFifo_Destroy (CpvAccess (CmiLocalQueue));
00436
00437 for (i = 0; i < _Cmi_numpes; i++) {
00438 if ((&CMI_VMI_Processes[i])->latency_vector) {
00439 free ((&CMI_VMI_Processes[i])->latency_vector);
00440 }
00441 }
00442
00443 free (CMI_VMI_Handles);
00444 free (CMI_VMI_Eager_Short_Pollset);
00445 free (CMI_VMI_Processes);
00446 free (CMI_VMI_Program_Key);
00447 free (CMI_VMI_Username);
00448 }
00449
00450
00451 exit (0);
00452 }
00453
00454
00455
00456
00457
00458
00459 void CmiAbort (const char *message)
00460 {
00461 DEBUG_PRINT ("CmiAbort() called.\n");
00462
00463 printf ("%s\n", message);
00464 exit (1);
00465 }
00466
00467
00468
00469
00470
00471
00472 void CmiNotifyIdle ()
00473 {
00474 VMI_STATUS status;
00475
00476 CMI_VMI_Process_T *process;
00477 CMI_VMI_Handle_T *handle;
00478
00479 int index;
00480 char *msg;
00481 CMI_VMI_Eager_Short_Slot_Footer_T *footer;
00482 int credits_temp;
00483
00484 CMI_VMI_Credit_Message_T credit_msg;
00485 PVOID addrs[1];
00486 ULONG sz[1];
00487
00488 int i;
00489
00490
00491 DEBUG_PRINT ("CmiNotifyIdle() called.\n");
00492
00493 if (CMI_VMI_Eager_Protocol) {
00494
00495
00496
00497
00498
00499
00500
00501 for (i = 0; i < _Cmi_numpes; i++) {
00502 process = &CMI_VMI_Processes[i];
00503
00504 if (process->eager_short_receive_credits_replentish >= (0.75 * CMI_VMI_Eager_Short_Slots)) {
00505 CMI_VMI_MESSAGE_TYPE (&credit_msg) = CMI_VMI_MESSAGE_TYPE_CREDIT;
00506 CMI_VMI_MESSAGE_CREDITS (&credit_msg) = process->eager_short_receive_credits_replentish;
00507
00508 #if CMK_BROADCAST_SPANNING_TREE
00509 CMI_SET_BROADCAST_ROOT (&credit_msg, 0);
00510 #endif
00511
00512 addrs[0] = (PVOID) &credit_msg;
00513 sz[0] = (ULONG) (sizeof (CMI_VMI_Credit_Message_T));
00514
00515 status = VMI_Stream_Send_Inline (process->connection, addrs, sz, 1, sizeof (CMI_VMI_Credit_Message_T));
00516 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send_Inline()");
00517
00518 process->eager_short_receive_credits_replentish = 0;
00519 }
00520 }
00521
00522
00523
00524
00525
00526 if (CMI_VMI_Message_Receive_Count >= CMI_VMI_Eager_Interval) {
00527 for (i = 0; i < _Cmi_numpes; i++) {
00528 if ((CMI_VMI_Eager_Short_Pollset_Size < CMI_VMI_Eager_Short_Pollset_Size_Maximum) &&
00529 ((&CMI_VMI_Processes[i])->normal_short_count >= CMI_VMI_Eager_Threshold) &&
00530 ((&CMI_VMI_Processes[i])->eager_short_receive_size == 0) &&
00531 (VMI_CONNECT_ONE_WAY_LATENCY ((&CMI_VMI_Processes[i])->connection) < CMI_VMI_WAN_Latency)) {
00532 CMI_VMI_Eager_Short_Setup (i);
00533 }
00534
00535 if (((&CMI_VMI_Processes[i])->normal_long_count >= CMI_VMI_Eager_Threshold) &&
00536 ((&CMI_VMI_Processes[i])->eager_long_receive_size == 0)) {
00537 CMI_VMI_Eager_Long_Setup (i, CMI_VMI_Eager_Long_Buffer_Size);
00538 }
00539
00540 (&CMI_VMI_Processes[i])->normal_short_count = 0;
00541 (&CMI_VMI_Processes[i])->normal_long_count = 0;
00542 (&CMI_VMI_Processes[i])->eager_short_count = 0;
00543 (&CMI_VMI_Processes[i])->eager_long_count = 0;
00544 }
00545
00546 CMI_VMI_Message_Receive_Count = 0;
00547 }
00548 }
00549
00550
00551 status = VMI_Poll ();
00552 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
00553 }
00554
00555
00556
00557
00558
00559
00560 void CmiMemLock ()
00561 {
00562 DEBUG_PRINT ("CmiMemLock() called.\n");
00563
00564
00565 }
00566
00567
00568
00569
00570
00571
00572 void CmiMemUnlock ()
00573 {
00574 DEBUG_PRINT ("CmiMemUnlock() called.\n");
00575
00576
00577 }
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594 void CmiPrintf (const char *format, ...)
00595 {
00596 DEBUG_PRINT ("CmiPrintf() called.\n");
00597
00598 if (CMI_VMI_Startup_Type == CMI_VMI_STARTUP_TYPE_CHARMRUN) {
00599 CMI_VMI_Charmrun_Message_Header_T hdr;
00600 va_list args;
00601 char *temp_str;
00602 int rc;
00603
00604 va_start (args, format);
00605 vasprintf (&temp_str, format, args);
00606
00607 hdr.msg_len = htonl (strlen (temp_str) + 1);
00608 strcpy (hdr.msg_type, "print");
00609
00610 rc = CMI_VMI_Socket_Send (CMI_VMI_Charmrun_Socket, (const void *) &hdr, sizeof (CMI_VMI_Charmrun_Message_Header_T));
00611 if (rc < 0) {
00612 DEBUG_PRINT ("Error sending to charmrun.\n");
00613 }
00614 rc = CMI_VMI_Socket_Send (CMI_VMI_Charmrun_Socket, temp_str, ((strlen (temp_str)) + 1));
00615 if (rc < 0) {
00616 DEBUG_PRINT ("Error sending to charmrun.\n");
00617 }
00618
00619 free (temp_str);
00620 } else {
00621 va_list args;
00622 va_start (args, format);
00623 vprintf (format, args);
00624 fflush (stdout);
00625 va_end (args);
00626 }
00627 }
00628
00629
00630
00631
00632
00633
00634 void CmiError (const char *format, ...)
00635 {
00636 DEBUG_PRINT ("CmiError() called.\n");
00637
00638 if (CMI_VMI_Startup_Type == CMI_VMI_STARTUP_TYPE_CHARMRUN) {
00639 CMI_VMI_Charmrun_Message_Header_T hdr;
00640 va_list args;
00641 char *temp_str;
00642 int rc;
00643
00644 va_start (args, format);
00645 vasprintf (&temp_str, format, args);
00646
00647 hdr.msg_len = htonl (strlen (temp_str) + 1);
00648 strcpy (hdr.msg_type, "printerr");
00649
00650 rc = CMI_VMI_Socket_Send (CMI_VMI_Charmrun_Socket, (const void *) &hdr, sizeof (CMI_VMI_Charmrun_Message_Header_T));
00651 if (rc < 0) {
00652 DEBUG_PRINT ("Error sending to charmrun.\n");
00653 }
00654 rc = CMI_VMI_Socket_Send (CMI_VMI_Charmrun_Socket, temp_str, ((strlen (temp_str)) + 1));
00655 if (rc < 0) {
00656 DEBUG_PRINT ("Error sending to charmrun.\n");
00657 }
00658
00659 free (temp_str);
00660 } else {
00661 va_list args;
00662 va_start (args, format);
00663 vfprintf (stderr, format, args);
00664 fflush (stdout);
00665 va_end (args);
00666 }
00667 }
00668
00669
00670
00671
00672
00673
00674 int CmiScanf (const char *format, ...)
00675 {
00676 int rc;
00677
00678
00679 DEBUG_PRINT ("CmiScanf() called.\n");
00680
00681 if (CMI_VMI_Startup_Type == CMI_VMI_STARTUP_TYPE_CHARMRUN) {
00682 CmiAbort ("CmiScanf() is not implemented for startup type Charmrun.");
00683 } else {
00684 va_list args;
00685 va_start (args, format);
00686 rc = vfscanf (stdin, format, args);
00687 va_end (args);
00688 return (rc);
00689 }
00690 }
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715 int CmiBarrier ()
00716 {
00717 VMI_STATUS status;
00718
00719 CMI_VMI_Barrier_Message_T barrier_msg;
00720 PVOID addrs[1];
00721 ULONG sz[1];
00722
00723 int i;
00724
00725
00726 DEBUG_PRINT ("CmiBarrier() called.\n");
00727
00728
00729 if (_Cmi_mype == 0) {
00730
00731 while (CMI_VMI_Barrier_Count < (_Cmi_numpes - 1)) {
00732 status = VMI_Poll ();
00733 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
00734 }
00735
00736
00737 CMI_VMI_Barrier_Count = 0;
00738
00739
00740 CMI_VMI_MESSAGE_TYPE (&barrier_msg) = CMI_VMI_MESSAGE_TYPE_BARRIER;
00741 CMI_VMI_MESSAGE_CREDITS (&barrier_msg) = 0;
00742
00743 #if CMK_BROADCAST_SPANNING_TREE
00744 CMI_SET_BROADCAST_ROOT (&barrier_msg, 0);
00745 #endif
00746
00747 addrs[0] = (PVOID) &barrier_msg;
00748 sz[0] = (ULONG) (sizeof (CMI_VMI_Barrier_Message_T));
00749
00750 for (i = 1; i < _Cmi_numpes; i++) {
00751 status = VMI_Stream_Send_Inline ((&CMI_VMI_Processes[i])->connection, addrs, sz, 1, sizeof (CMI_VMI_Barrier_Message_T));
00752 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send_Inline()");
00753 }
00754 } else {
00755
00756 CMI_VMI_MESSAGE_TYPE (&barrier_msg) = CMI_VMI_MESSAGE_TYPE_BARRIER;
00757 CMI_VMI_MESSAGE_CREDITS (&barrier_msg) = 0;
00758
00759 #if CMK_BROADCAST_SPANNING_TREE
00760 CMI_SET_BROADCAST_ROOT (&barrier_msg, 0);
00761 #endif
00762
00763 addrs[0] = (PVOID) &barrier_msg;
00764 sz[0] = (ULONG) (sizeof (CMI_VMI_Barrier_Message_T));
00765
00766 status = VMI_Stream_Send_Inline ((&CMI_VMI_Processes[0])->connection, addrs, sz, 1, sizeof (CMI_VMI_Barrier_Message_T));
00767 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send_Inline()");
00768
00769
00770 while (CMI_VMI_Barrier_Count < 1) {
00771 status = VMI_Poll ();
00772 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
00773 }
00774
00775
00776 CMI_VMI_Barrier_Count = 0;
00777 }
00778 return 0;
00779 }
00780
00781
00782
00783
00784
00785
00786 int CmiBarrierZero ()
00787 {
00788 DEBUG_PRINT ("CmiBarrierZero() called.\n");
00789
00790 CmiBarrier ();
00791 return 0;
00792 }
00793
00794
00795
00796
00797
00798
00799 void CmiSyncSendFn (int destrank, int msgsize, char *msg)
00800 {
00801 VMI_STATUS status;
00802
00803 char *msgcopy;
00804
00805 CMI_VMI_Process_T *process;
00806
00807 PVOID addrs[2];
00808 ULONG sz[2];
00809
00810 CMI_VMI_Handle_T *handle;
00811
00812 PVMI_CACHE_ENTRY cacheentry;
00813
00814 CMI_VMI_Publish_Message_T publish_msg;
00815
00816 void *context;
00817
00818 int index;
00819
00820 PVMI_RDMA_OP rdmaop;
00821
00822 int offset;
00823
00824 CMI_VMI_Eager_Short_Slot_Footer_T footer;
00825
00826
00827 DEBUG_PRINT ("CmiSyncSendFn() called.\n");
00828
00829 if (destrank == _Cmi_mype) {
00830 msgcopy = CmiAlloc (msgsize);
00831 memcpy (msgcopy, msg, msgsize);
00832 CdsFifo_Enqueue (CpvAccess (CmiLocalQueue), msgcopy);
00833 return;
00834 }
00835
00836 process = &CMI_VMI_Processes[destrank];
00837
00838 #if CMK_BROADCAST_SPANNING_TREE
00839 CMI_SET_BROADCAST_ROOT (msg, 0);
00840 #endif
00841
00842 CMI_VMI_MESSAGE_TYPE (msg) = CMI_VMI_MESSAGE_TYPE_STANDARD;
00843 CMI_VMI_MESSAGE_CREDITS (msg) = process->eager_short_receive_credits_replentish;
00844 process->eager_short_receive_credits_replentish = 0;
00845
00846
00847 index = process->eager_long_send_size - 1;
00848 handle = process->eager_long_send_handles[index];
00849
00850 if (CMI_VMI_Eager_Protocol && (process->eager_short_send_credits_available > 0) && (msgsize < CMI_VMI_Eager_Short_Message_Boundary)) {
00851 index = process->eager_short_send_index;
00852 handle = process->eager_short_send_handles[index];
00853
00854 memcpy (handle->msg, msg, msgsize);
00855
00856 footer.msgsize = msgsize;
00857 footer.sentinel = CMI_VMI_EAGER_SHORT_SENTINEL_DATA;
00858 memcpy (handle->msg + msgsize, &footer, sizeof (CMI_VMI_Eager_Short_Slot_Footer_T));
00859
00860 handle->msgsize = msgsize;
00861 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_NONE;
00862
00863 cacheentry = handle->data.send.data.eager_short.cacheentry;
00864 rdmaop = handle->data.send.data.eager_short.rdmaop;
00865
00866 offset = handle->data.send.data.eager_short.offset;
00867 offset += (CMI_VMI_Eager_Short_Message_Boundary - msgsize);
00868
00869 rdmaop->numBufs = 1;
00870 rdmaop->buffers[0] = cacheentry->bufferHandle;
00871 rdmaop->addr[0] = handle->msg;
00872 rdmaop->sz[0] = msgsize + sizeof (CMI_VMI_Eager_Short_Slot_Footer_T);
00873 rdmaop->rbuffer = handle->data.send.data.eager_short.remote_buffer;
00874 rdmaop->roffset = offset;
00875 rdmaop->notify = FALSE;
00876
00877 status = VMI_RDMA_Put (process->connection, rdmaop, (PVOID) NULL, (VMIRDMACompleteNotification) NULL);
00878 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Put()");
00879
00880 process->eager_short_send_index = ((index + 1) % process->eager_short_send_size);
00881 process->eager_short_send_credits_available -= 1;
00882 } else if (CMI_VMI_Eager_Protocol && (process->eager_long_send_size > 0) && (msgsize < handle->data.send.data.eager_long.maxsize)) {
00883 context = CONTEXTFIELD (msg);
00884 if (context) {
00885 cacheentry = CMI_VMI_CacheEntry_From_Context (context);
00886 } else {
00887 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
00888 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
00889 }
00890
00891 process->eager_long_send_size = index;
00892
00893 handle->msg = msg;
00894 handle->msgsize = msgsize;
00895 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_NONE;
00896 handle->data.send.data.eager_long.cacheentry = cacheentry;
00897
00898 status = VMI_RDMA_Alloc_Op (&rdmaop);
00899 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Alloc_Op()");
00900
00901 rdmaop->numBufs = 1;
00902 rdmaop->buffers[0] = cacheentry->bufferHandle;
00903 rdmaop->addr[0] = handle->msg;
00904 rdmaop->sz[0] = msgsize;
00905 rdmaop->rbuffer = handle->data.send.data.eager_long.remote_buffer;
00906 rdmaop->roffset = 0;
00907 rdmaop->notify = TRUE;
00908
00909 CMI_VMI_AsyncMsgCount += 1;
00910 handle->refcount += 1;
00911
00912 status = VMI_RDMA_Put (process->connection, rdmaop, (PVOID) handle, (VMIRDMACompleteNotification) CMI_VMI_RDMA_Put_Completion_Handler);
00913 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Put()");
00914
00915 while (handle->refcount > 2) {
00916 sched_yield ();
00917 status = VMI_Poll ();
00918 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
00919 }
00920
00921 if (!context) {
00922 status = VMI_Cache_Deregister (cacheentry);
00923 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Deregister()");
00924 }
00925
00926 CMI_VMI_Handle_Deallocate (handle);
00927 } else if (msgsize < CMI_VMI_Medium_Message_Boundary) {
00928 addrs[0] = (PVOID) msg;
00929 sz[0] = (ULONG) msgsize;
00930
00931 status = VMI_Stream_Send_Inline (process->connection, addrs, sz, 1, msgsize);
00932 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send_Inline()");
00933 } else {
00934 if (CMI_VMI_Eager_Protocol) {
00935 context = CONTEXTFIELD (msg);
00936 if (context) {
00937 cacheentry = CMI_VMI_CacheEntry_From_Context (context);
00938 } else {
00939 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
00940 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
00941 }
00942 } else {
00943 context = NULL;
00944 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
00945 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
00946 }
00947
00948 handle = CMI_VMI_Handle_Allocate ();
00949
00950 handle->refcount += 1;
00951 handle->msg = msg;
00952 handle->msgsize = msgsize;
00953 handle->handle_type = CMI_VMI_HANDLE_TYPE_SEND;
00954 handle->data.send.send_handle_type = CMI_VMI_SEND_HANDLE_TYPE_RDMAGET;
00955 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_NONE;
00956 handle->data.send.data.rdmaget.cacheentry = cacheentry;
00957
00958 CMI_VMI_AsyncMsgCount += 1;
00959 handle->refcount += 1;
00960 handle->data.send.data.rdmaget.publishes_pending = 1;
00961
00962 publish_msg.type = CMI_VMI_PUBLISH_TYPE_GET;
00963
00964 status = VMI_RDMA_Publish_Buffer (process->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg, (UINT32) msgsize,
00965 (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
00966 (ULONG) sizeof (CMI_VMI_Publish_Message_T));
00967 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer()");
00968
00969 while (handle->refcount > 2) {
00970 sched_yield ();
00971 status = VMI_Poll ();
00972 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
00973 }
00974
00975 if (!context) {
00976 status = VMI_Cache_Deregister (cacheentry);
00977 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Deregister()");
00978 }
00979
00980 CMI_VMI_Handle_Deallocate (handle);
00981 }
00982 }
00983
00984
00985 void CmiPushPE(int pe,void *msg)
00986 {
00987 CdsFifo_Enqueue (CpvAccessOther (CmiLocalQueue, pe), msg);
00988 }
00989
00990
00991
00992
00993
00994 CmiCommHandle CmiAsyncSendFn (int destrank, int msgsize, char *msg)
00995 {
00996 VMI_STATUS status;
00997
00998 char *msgcopy;
00999
01000 CMI_VMI_Process_T *process;
01001
01002 PVMI_BUFFER bufHandles[2];
01003 PVOID addrs[2];
01004 ULONG sz[2];
01005
01006 CMI_VMI_Handle_T *handle;
01007
01008 PVMI_CACHE_ENTRY cacheentry;
01009
01010 CMI_VMI_Publish_Message_T publish_msg;
01011
01012 void *context;
01013
01014 int index;
01015
01016 PVMI_RDMA_OP rdmaop;
01017
01018 int offset;
01019
01020 CMI_VMI_Eager_Short_Slot_Footer_T footer;
01021
01022
01023 DEBUG_PRINT ("CmiAsyncSendFn() called.\n");
01024
01025 if (destrank == _Cmi_mype) {
01026 msgcopy = CmiAlloc (msgsize);
01027 memcpy (msgcopy, msg, msgsize);
01028 CdsFifo_Enqueue (CpvAccess (CmiLocalQueue), msgcopy);
01029 return ((CmiCommHandle) NULL);
01030 }
01031
01032 process = &CMI_VMI_Processes[destrank];
01033
01034 #if CMK_BROADCAST_SPANNING_TREE
01035 CMI_SET_BROADCAST_ROOT (msg, 0);
01036 #endif
01037
01038 CMI_VMI_MESSAGE_TYPE (msg) = CMI_VMI_MESSAGE_TYPE_STANDARD;
01039 CMI_VMI_MESSAGE_CREDITS (msg) = process->eager_short_receive_credits_replentish;
01040 process->eager_short_receive_credits_replentish = 0;
01041
01042
01043 index = process->eager_long_send_size - 1;
01044 handle = process->eager_long_send_handles[index];
01045
01046 if (CMI_VMI_Eager_Protocol && (process->eager_short_send_credits_available > 0) && (msgsize < CMI_VMI_Eager_Short_Message_Boundary)) {
01047 index = process->eager_short_send_index;
01048 handle = process->eager_short_send_handles[index];
01049
01050 memcpy (handle->msg, msg, msgsize);
01051
01052 footer.msgsize = msgsize;
01053 footer.sentinel = CMI_VMI_EAGER_SHORT_SENTINEL_DATA;
01054 memcpy (handle->msg + msgsize, &footer, sizeof (CMI_VMI_Eager_Short_Slot_Footer_T));
01055
01056 handle->msgsize = msgsize;
01057 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_NONE;
01058
01059 cacheentry = handle->data.send.data.eager_short.cacheentry;
01060 rdmaop = handle->data.send.data.eager_short.rdmaop;
01061
01062 offset = handle->data.send.data.eager_short.offset;
01063 offset += (CMI_VMI_Eager_Short_Message_Boundary - msgsize);
01064
01065 rdmaop->numBufs = 1;
01066 rdmaop->buffers[0] = cacheentry->bufferHandle;
01067 rdmaop->addr[0] = handle->msg;
01068 rdmaop->sz[0] = msgsize + sizeof (CMI_VMI_Eager_Short_Slot_Footer_T);
01069 rdmaop->rbuffer = handle->data.send.data.eager_short.remote_buffer;
01070 rdmaop->roffset = offset;
01071 rdmaop->notify = FALSE;
01072
01073 status = VMI_RDMA_Put (process->connection, rdmaop, (PVOID) NULL, (VMIRDMACompleteNotification) NULL);
01074 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Put()");
01075
01076 process->eager_short_send_index = ((index + 1) % process->eager_short_send_size);
01077 process->eager_short_send_credits_available -= 1;
01078
01079 handle = NULL;
01080 } else if (CMI_VMI_Eager_Protocol && (process->eager_long_send_size > 0) && (msgsize < handle->data.send.data.eager_long.maxsize)) {
01081 context = CONTEXTFIELD (msg);
01082 if (context) {
01083 cacheentry = CMI_VMI_CacheEntry_From_Context (context);
01084 } else {
01085 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01086 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01087 }
01088
01089 process->eager_long_send_size = index;
01090
01091 handle->msg = msg;
01092 handle->msgsize = msgsize;
01093 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_NONE;
01094 handle->data.send.data.eager_long.cacheentry = cacheentry;
01095
01096 status = VMI_RDMA_Alloc_Op (&rdmaop);
01097 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Alloc_Op()");
01098
01099 rdmaop->numBufs = 1;
01100 rdmaop->buffers[0] = cacheentry->bufferHandle;
01101 rdmaop->addr[0] = handle->msg;
01102 rdmaop->sz[0] = msgsize;
01103 rdmaop->rbuffer = handle->data.send.data.eager_long.remote_buffer;
01104 rdmaop->roffset = 0;
01105 rdmaop->notify = TRUE;
01106
01107 CMI_VMI_AsyncMsgCount += 1;
01108 handle->refcount += 1;
01109
01110 status = VMI_RDMA_Put (process->connection, rdmaop, (PVOID) handle, (VMIRDMACompleteNotification) CMI_VMI_RDMA_Put_Completion_Handler);
01111 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Put()");
01112 } else if (msgsize < CMI_VMI_Small_Message_Boundary) {
01113 addrs[0] = (PVOID) msg;
01114 sz[0] = msgsize;
01115
01116 status = VMI_Stream_Send_Inline (process->connection, addrs, sz, 1, msgsize);
01117 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send_Inline()");
01118
01119 handle = NULL;
01120 } else if (msgsize < CMI_VMI_Medium_Message_Boundary) {
01121 if (CMI_VMI_Eager_Protocol) {
01122 context = CONTEXTFIELD (msg);
01123 if (context) {
01124 cacheentry = CMI_VMI_CacheEntry_From_Context (context);
01125 } else {
01126 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01127 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01128 }
01129 } else {
01130 context = NULL;
01131 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01132 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01133 }
01134
01135 handle = CMI_VMI_Handle_Allocate ();
01136
01137 handle->refcount += 1;
01138 handle->msg = msg;
01139 handle->msgsize = msgsize;
01140 handle->handle_type = CMI_VMI_HANDLE_TYPE_SEND;
01141 handle->data.send.send_handle_type = CMI_VMI_SEND_HANDLE_TYPE_STREAM;
01142 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_NONE;
01143 handle->data.send.data.stream.cacheentry = cacheentry;
01144
01145 bufHandles[0] = cacheentry->bufferHandle;
01146 addrs[0] = (PVOID) msg;
01147 sz[0] = msgsize;
01148
01149 CMI_VMI_AsyncMsgCount += 1;
01150 handle->refcount += 1;
01151
01152 status = VMI_Stream_Send (process->connection, bufHandles, addrs, sz, 1, CMI_VMI_Stream_Completion_Handler, (PVOID) handle, TRUE);
01153 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send()");
01154 } else {
01155 if (CMI_VMI_Eager_Protocol) {
01156 context = CONTEXTFIELD (msg);
01157 if (context) {
01158 cacheentry = CMI_VMI_CacheEntry_From_Context (context);
01159 } else {
01160 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01161 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01162 }
01163 } else {
01164 context = NULL;
01165 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01166 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01167 }
01168
01169 handle = CMI_VMI_Handle_Allocate ();
01170
01171 handle->refcount += 1;
01172 handle->msg = msg;
01173 handle->msgsize = msgsize;
01174 handle->handle_type = CMI_VMI_HANDLE_TYPE_SEND;
01175 handle->data.send.send_handle_type = CMI_VMI_SEND_HANDLE_TYPE_RDMAGET;
01176 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_NONE;
01177 handle->data.send.data.rdmaget.cacheentry = cacheentry;
01178
01179 handle->refcount += 1;
01180 CMI_VMI_AsyncMsgCount += 1;
01181 handle->data.send.data.rdmaget.publishes_pending = 1;
01182
01183 publish_msg.type = CMI_VMI_PUBLISH_TYPE_GET;
01184
01185 #if CMI_VMI_USE_VMI22
01186 status = VMI_RDMA_Publish_Buffer_With_Callback (process->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg, (UINT32) msgsize,
01187 (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
01188 (ULONG) sizeof (CMI_VMI_Publish_Message_T), (PVOID) handle, CMI_VMI_RDMA_Publish_Completion_Handler);
01189 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer_With_Callback()");
01190
01191 while (handle->data.send.data.rdmaget.publishes_pending > 0) {
01192 sched_yield ();
01193 status = VMI_Poll ();
01194 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
01195 }
01196 #else
01197 status = VMI_RDMA_Publish_Buffer (process->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg, (UINT32) msgsize,
01198 (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
01199 (ULONG) sizeof (CMI_VMI_Publish_Message_T));
01200 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer()");
01201 #endif
01202 }
01203
01204 return ((CmiCommHandle) handle);
01205 }
01206
01207
01208
01209
01210
01211
01212 void CmiFreeSendFn (int destrank, int msgsize, char *msg)
01213 {
01214 VMI_STATUS status;
01215
01216 char *msgcopy;
01217
01218 CMI_VMI_Process_T *process;
01219
01220 PVMI_BUFFER bufHandles[2];
01221 PVOID addrs[2];
01222 ULONG sz[2];
01223
01224 CMI_VMI_Handle_T *handle;
01225
01226 PVMI_CACHE_ENTRY cacheentry;
01227
01228 CMI_VMI_Publish_Message_T publish_msg;
01229
01230 void *context;
01231
01232 int index;
01233
01234 PVMI_RDMA_OP rdmaop;
01235
01236 int offset;
01237
01238 CMI_VMI_Eager_Short_Slot_Footer_T footer;
01239
01240
01241 DEBUG_PRINT ("CmiFreeSendFn() called.\n");
01242
01243 if (destrank == _Cmi_mype) {
01244 CdsFifo_Enqueue (CpvAccess (CmiLocalQueue), msg);
01245 return;
01246 }
01247
01248 process = &CMI_VMI_Processes[destrank];
01249
01250 #if CMK_BROADCAST_SPANNING_TREE
01251 CMI_SET_BROADCAST_ROOT (msg, 0);
01252 #endif
01253
01254 CMI_VMI_MESSAGE_TYPE (msg) = CMI_VMI_MESSAGE_TYPE_STANDARD;
01255 CMI_VMI_MESSAGE_CREDITS (msg) = process->eager_short_receive_credits_replentish;
01256 process->eager_short_receive_credits_replentish = 0;
01257
01258
01259 index = process->eager_long_send_size - 1;
01260 handle = process->eager_long_send_handles[index];
01261
01262 if (CMI_VMI_Eager_Protocol && (process->eager_short_send_credits_available > 0) && (msgsize < CMI_VMI_Eager_Short_Message_Boundary)) {
01263 index = process->eager_short_send_index;
01264 handle = process->eager_short_send_handles[index];
01265
01266 memcpy (handle->msg, msg, msgsize);
01267
01268 footer.msgsize = msgsize;
01269 footer.sentinel = CMI_VMI_EAGER_SHORT_SENTINEL_DATA;
01270 memcpy (handle->msg + msgsize, &footer, sizeof (CMI_VMI_Eager_Short_Slot_Footer_T));
01271
01272 handle->msgsize = msgsize;
01273 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_NONE;
01274
01275 cacheentry = handle->data.send.data.eager_short.cacheentry;
01276 rdmaop = handle->data.send.data.eager_short.rdmaop;
01277
01278 offset = handle->data.send.data.eager_short.offset;
01279 offset += (CMI_VMI_Eager_Short_Message_Boundary - msgsize);
01280
01281 rdmaop->numBufs = 1;
01282 rdmaop->buffers[0] = cacheentry->bufferHandle;
01283 rdmaop->addr[0] = handle->msg;
01284 rdmaop->sz[0] = msgsize + sizeof (CMI_VMI_Eager_Short_Slot_Footer_T);
01285 rdmaop->rbuffer = handle->data.send.data.eager_short.remote_buffer;
01286 rdmaop->roffset = offset;
01287 rdmaop->notify = FALSE;
01288
01289 status = VMI_RDMA_Put (process->connection, rdmaop, (PVOID) NULL, (VMIRDMACompleteNotification) NULL);
01290 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Put()");
01291
01292 process->eager_short_send_index = ((index + 1) % process->eager_short_send_size);
01293 process->eager_short_send_credits_available -= 1;
01294
01295 CmiFree (msg);
01296 } else if (CMI_VMI_Eager_Protocol && (process->eager_long_send_size > 0) && (msgsize < handle->data.send.data.eager_long.maxsize)) {
01297 context = CONTEXTFIELD (msg);
01298 if (context) {
01299 cacheentry = CMI_VMI_CacheEntry_From_Context (context);
01300 } else {
01301 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01302 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01303 }
01304
01305 process->eager_long_send_size = index;
01306
01307 handle->msg = msg;
01308 handle->msgsize = msgsize;
01309 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_FREE;
01310 handle->data.send.data.eager_long.cacheentry = cacheentry;
01311
01312 status = VMI_RDMA_Alloc_Op (&rdmaop);
01313 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Alloc_Op()");
01314
01315 rdmaop->numBufs = 1;
01316 rdmaop->buffers[0] = cacheentry->bufferHandle;
01317 rdmaop->addr[0] = handle->msg;
01318 rdmaop->sz[0] = msgsize;
01319 rdmaop->rbuffer = handle->data.send.data.eager_long.remote_buffer;
01320 rdmaop->roffset = 0;
01321 rdmaop->notify = TRUE;
01322
01323 CMI_VMI_AsyncMsgCount += 1;
01324
01325
01326 status = VMI_RDMA_Put (process->connection, rdmaop, (PVOID) handle, (VMIRDMACompleteNotification) CMI_VMI_RDMA_Put_Completion_Handler);
01327 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Put()");
01328 } else if (msgsize < CMI_VMI_Small_Message_Boundary) {
01329 addrs[0] = (PVOID) msg;
01330 sz[0] = msgsize;
01331
01332 status = VMI_Stream_Send_Inline (process->connection, addrs, sz, 1, msgsize);
01333 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send_Inline()");
01334
01335 CmiFree (msg);
01336 } else if (msgsize < CMI_VMI_Medium_Message_Boundary) {
01337 if (CMI_VMI_Eager_Protocol) {
01338 context = CONTEXTFIELD (msg);
01339 if (context) {
01340 cacheentry = CMI_VMI_CacheEntry_From_Context (context);
01341 } else {
01342 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01343 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01344 }
01345 } else {
01346 context = NULL;
01347 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01348 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01349 }
01350
01351 handle = CMI_VMI_Handle_Allocate ();
01352
01353
01354 handle->msg = msg;
01355 handle->msgsize = msgsize;
01356 handle->handle_type = CMI_VMI_HANDLE_TYPE_SEND;
01357 handle->data.send.send_handle_type = CMI_VMI_SEND_HANDLE_TYPE_STREAM;
01358 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_FREE;
01359 handle->data.send.data.stream.cacheentry = cacheentry;
01360
01361 bufHandles[0] = cacheentry->bufferHandle;
01362 addrs[0] = (PVOID) msg;
01363 sz[0] = msgsize;
01364
01365 handle->refcount += 1;
01366 CMI_VMI_AsyncMsgCount += 1;
01367
01368 status = VMI_Stream_Send (process->connection, bufHandles, addrs, sz, 1, CMI_VMI_Stream_Completion_Handler, (PVOID) handle, TRUE);
01369 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send()");
01370 } else {
01371 if (CMI_VMI_Eager_Protocol) {
01372 context = CONTEXTFIELD (msg);
01373 if (context) {
01374 cacheentry = CMI_VMI_CacheEntry_From_Context (context);
01375 } else {
01376 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01377 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01378 }
01379 } else {
01380 context = NULL;
01381 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01382 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01383 }
01384
01385 handle = CMI_VMI_Handle_Allocate ();
01386
01387
01388 handle->msg = msg;
01389 handle->msgsize = msgsize;
01390 handle->handle_type = CMI_VMI_HANDLE_TYPE_SEND;
01391 handle->data.send.send_handle_type = CMI_VMI_SEND_HANDLE_TYPE_RDMAGET;
01392 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_FREE;
01393 handle->data.send.data.rdmaget.cacheentry = cacheentry;
01394
01395 handle->refcount += 1;
01396 CMI_VMI_AsyncMsgCount += 1;
01397 handle->data.send.data.rdmaget.publishes_pending = 1;
01398
01399 publish_msg.type = CMI_VMI_PUBLISH_TYPE_GET;
01400
01401 #if CMI_VMI_USE_VMI22
01402 status = VMI_RDMA_Publish_Buffer_With_Callback (process->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg, (UINT32) msgsize,
01403 (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
01404 (ULONG) sizeof (CMI_VMI_Publish_Message_T), (PVOID) handle, CMI_VMI_RDMA_Publish_Completion_Handler);
01405 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer_With_Callback()");
01406
01407 while (handle->data.send.data.rdmaget.publishes_pending > 0) {
01408 sched_yield ();
01409 status = VMI_Poll ();
01410 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
01411 }
01412 #else
01413 status = VMI_RDMA_Publish_Buffer (process->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg, (UINT32) msgsize,
01414 (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
01415 (ULONG) sizeof (CMI_VMI_Publish_Message_T));
01416 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer()");
01417 #endif
01418 }
01419 }
01420
01421
01422
01423
01424
01425
01426 void CmiSyncBroadcastFn (int msgsize, char *msg)
01427 {
01428 VMI_STATUS status;
01429
01430 PVMI_BUFFER bufHandles[2];
01431 PVOID addrs[2];
01432 ULONG sz[2];
01433
01434 CMI_VMI_Handle_T *handle;
01435
01436 int i;
01437
01438 PVMI_CACHE_ENTRY cacheentry;
01439
01440 int childcount;
01441 int startrank;
01442 int destrank;
01443
01444 CMI_VMI_Publish_Message_T publish_msg;
01445
01446 void *context;
01447
01448
01449 DEBUG_PRINT ("CmiSyncBroadcastFn() called.\n");
01450
01451 CMI_VMI_MESSAGE_TYPE (msg) = CMI_VMI_MESSAGE_TYPE_STANDARD;
01452 CMI_VMI_MESSAGE_CREDITS (msg) = 0;
01453
01454 if (msgsize < CMI_VMI_Medium_Message_Boundary) {
01455 if (CMI_VMI_Eager_Protocol) {
01456 context = CONTEXTFIELD (msg);
01457 if (context) {
01458 cacheentry = CMI_VMI_CacheEntry_From_Context (context);
01459 } else {
01460 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01461 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01462 }
01463 } else {
01464 context = NULL;
01465 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01466 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01467 }
01468
01469 handle = CMI_VMI_Handle_Allocate ();
01470
01471 handle->refcount += 1;
01472 handle->msg = msg;
01473 handle->msgsize = msgsize;
01474 handle->handle_type = CMI_VMI_HANDLE_TYPE_SEND;
01475 handle->data.send.send_handle_type = CMI_VMI_SEND_HANDLE_TYPE_STREAM;
01476 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_NONE;
01477 handle->data.send.data.stream.cacheentry = cacheentry;
01478
01479 bufHandles[0] = cacheentry->bufferHandle;
01480 addrs[0] = (PVOID) msg;
01481 sz[0] = (ULONG) msgsize;
01482
01483 #if CMK_BROADCAST_SPANNING_TREE
01484 CMI_SET_BROADCAST_ROOT (msg, (_Cmi_mype + 1));
01485
01486 childcount = CMI_VMI_Spanning_Children_Count (msg);
01487
01488 handle->refcount += childcount;
01489 CMI_VMI_AsyncMsgCount += childcount;
01490
01491 startrank = CMI_BROADCAST_ROOT (msg) - 1;
01492 for (i = 1; i <= CMI_VMI_BROADCAST_SPANNING_FACTOR; i++) {
01493 destrank = _Cmi_mype - startrank;
01494
01495 if (destrank < 0) {
01496 destrank += _Cmi_numpes;
01497 }
01498
01499 destrank = CMI_VMI_BROADCAST_SPANNING_FACTOR * destrank + i;
01500
01501 if (destrank > (_Cmi_numpes - 1)) {
01502 break;
01503 }
01504
01505 destrank += startrank;
01506 destrank %= _Cmi_numpes;
01507
01508 status = VMI_Stream_Send ((&CMI_VMI_Processes[destrank])->connection, bufHandles, addrs, sz, 1, CMI_VMI_Stream_Completion_Handler, (PVOID) handle, TRUE);
01509 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send()");
01510 }
01511 #else
01512 handle->refcount += (_Cmi_numpes - 1);
01513 CMI_VMI_AsyncMsgCount += (_Cmi_numpes - 1);
01514
01515 for (i = 0; i < _Cmi_mype; i++) {
01516 status = VMI_Stream_Send ((&CMI_VMI_Processes[i])->connection, bufHandles, addrs, sz, 1, CMI_VMI_Stream_Completion_Handler, (PVOID) handle, TRUE);
01517 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send()");
01518 }
01519
01520 for (i = (_Cmi_mype + 1); i < _Cmi_numpes; i++) {
01521 status = VMI_Stream_Send ((&CMI_VMI_Processes[i])->connection, bufHandles, addrs, sz, 1, CMI_VMI_Stream_Completion_Handler, (PVOID) handle, TRUE);
01522 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send()");
01523 }
01524 #endif
01525
01526 while (handle->refcount > 2) {
01527 sched_yield ();
01528 status = VMI_Poll ();
01529 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
01530 }
01531
01532 if (!context) {
01533 status = VMI_Cache_Deregister (cacheentry);
01534 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Deregister()");
01535 }
01536
01537 CMI_VMI_Handle_Deallocate (handle);
01538 } else {
01539 if (CMI_VMI_Eager_Protocol) {
01540 context = CONTEXTFIELD (msg);
01541 if (context) {
01542 cacheentry = CMI_VMI_CacheEntry_From_Context (context);
01543 } else {
01544 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01545 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01546 }
01547 } else {
01548 context = NULL;
01549 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01550 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01551 }
01552
01553 handle = CMI_VMI_Handle_Allocate ();
01554
01555 handle->refcount += 1;
01556 handle->msg = msg;
01557 handle->msgsize = msgsize;
01558 handle->handle_type = CMI_VMI_HANDLE_TYPE_SEND;
01559 handle->data.send.send_handle_type=CMI_VMI_SEND_HANDLE_TYPE_RDMABROADCAST;
01560 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_NONE;
01561 handle->data.send.data.rdmabroadcast.cacheentry = cacheentry;
01562
01563 publish_msg.type = CMI_VMI_PUBLISH_TYPE_GET;
01564
01565 #if CMK_BROADCAST_SPANNING_TREE
01566 CMI_SET_BROADCAST_ROOT (msg, (_Cmi_mype + 1));
01567
01568 childcount = CMI_VMI_Spanning_Children_Count (msg);
01569
01570 handle->refcount += childcount;
01571 CMI_VMI_AsyncMsgCount += childcount;
01572 handle->data.send.data.rdmabroadcast.publishes_pending = childcount;
01573
01574 startrank = CMI_BROADCAST_ROOT (msg) - 1;
01575 for (i = 1; i <= CMI_VMI_BROADCAST_SPANNING_FACTOR; i++) {
01576 destrank = _Cmi_mype - startrank;
01577
01578 if (destrank < 0) {
01579 destrank += _Cmi_numpes;
01580 }
01581
01582 destrank = CMI_VMI_BROADCAST_SPANNING_FACTOR * destrank + i;
01583
01584 if (destrank > (_Cmi_numpes - 1)) {
01585 break;
01586 }
01587
01588 destrank += startrank;
01589 destrank %= _Cmi_numpes;
01590
01591 status = VMI_RDMA_Publish_Buffer ((&CMI_VMI_Processes[destrank])->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg,
01592 (UINT32) msgsize, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
01593 (ULONG) sizeof (CMI_VMI_Publish_Message_T));
01594 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer()");
01595 }
01596 #else
01597 handle->refcount += (_Cmi_numpes - 1);
01598 CMI_VMI_AsyncMsgCount += (_Cmi_numpes - 1);
01599 handle->data.send.data.rdmabroadcast.publishes_pending = (_Cmi_numpes - 1);
01600
01601 for (i = 0; i < _Cmi_mype; i++) {
01602 status = VMI_RDMA_Publish_Buffer ((&CMI_VMI_Processes[i])->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg,
01603 (UINT32) msgsize, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
01604 (ULONG) sizeof (CMI_VMI_Publish_Message_T));
01605 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer()");
01606 }
01607
01608 for (i = (_Cmi_mype + 1); i < _Cmi_numpes; i++) {
01609 status = VMI_RDMA_Publish_Buffer ((&CMI_VMI_Processes[i])->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg,
01610 (UINT32) msgsize, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
01611 (ULONG) sizeof (CMI_VMI_Publish_Message_T));
01612 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer()");
01613 }
01614 #endif
01615
01616 while (handle->refcount > 2) {
01617 sched_yield ();
01618 status = VMI_Poll ();
01619 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
01620 }
01621
01622 if (!context) {
01623 status = VMI_Cache_Deregister (cacheentry);
01624 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Deregister()");
01625 }
01626
01627 CMI_VMI_Handle_Deallocate (handle);
01628 }
01629 }
01630
01631
01632
01633
01634
01635
01636 CmiCommHandle CmiAsyncBroadcastFn (int msgsize, char *msg)
01637 {
01638 VMI_STATUS status;
01639
01640 PVMI_BUFFER bufHandles[2];
01641 PVOID addrs[2];
01642 ULONG sz[2];
01643
01644 CMI_VMI_Handle_T *handle;
01645
01646 int i;
01647
01648 PVMI_CACHE_ENTRY cacheentry;
01649
01650 int childcount;
01651 int startrank;
01652 int destrank;
01653
01654 CMI_VMI_Publish_Message_T publish_msg;
01655
01656 void *context;
01657
01658
01659 DEBUG_PRINT ("CmiAsyncBroadcastFn() called.\n");
01660
01661 CMI_VMI_MESSAGE_TYPE (msg) = CMI_VMI_MESSAGE_TYPE_STANDARD;
01662 CMI_VMI_MESSAGE_CREDITS (msg) = 0;
01663
01664 if (msgsize < CMI_VMI_Small_Message_Boundary) {
01665 addrs[0] = (PVOID) msg;
01666 sz[0] = msgsize;
01667
01668 #if CMK_BROADCAST_SPANNING_TREE
01669 CMI_SET_BROADCAST_ROOT (msg, (_Cmi_mype + 1));
01670
01671 childcount = CMI_VMI_Spanning_Children_Count (msg);
01672
01673 startrank = CMI_BROADCAST_ROOT (msg) - 1;
01674 for (i = 1; i <= CMI_VMI_BROADCAST_SPANNING_FACTOR; i++) {
01675 destrank = _Cmi_mype - startrank;
01676
01677 if (destrank < 0) {
01678 destrank += _Cmi_numpes;
01679 }
01680
01681 destrank = CMI_VMI_BROADCAST_SPANNING_FACTOR * destrank + i;
01682
01683 if (destrank > (_Cmi_numpes - 1)) {
01684 break;
01685 }
01686
01687 destrank += startrank;
01688 destrank %= _Cmi_numpes;
01689
01690 status = VMI_Stream_Send_Inline ((&CMI_VMI_Processes[destrank])->connection, addrs, sz, 1, msgsize);
01691 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send_Inline()");
01692 }
01693 #else
01694 for (i = 0; i < _Cmi_mype; i++) {
01695 status = VMI_Stream_Send_Inline ((&CMI_VMI_Processes[i])->connection, addrs, sz, 1, msgsize);
01696 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send_Inline()");
01697 }
01698
01699 for (i = (_Cmi_mype + 1); i < _Cmi_numpes; i++) {
01700 status = VMI_Stream_Send_Inline ((&CMI_VMI_Processes[i])->connection, addrs, sz, 1, msgsize);
01701 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send_Inline()");
01702 }
01703 #endif
01704
01705 handle = NULL;
01706 } else if (msgsize < CMI_VMI_Medium_Message_Boundary) {
01707 if (CMI_VMI_Eager_Protocol) {
01708 context = CONTEXTFIELD (msg);
01709 if (context) {
01710 cacheentry = CMI_VMI_CacheEntry_From_Context (context);
01711 } else {
01712 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01713 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01714 }
01715 } else {
01716 context = NULL;
01717 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01718 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01719 }
01720
01721 handle = CMI_VMI_Handle_Allocate ();
01722
01723 handle->refcount += 1;
01724 handle->msg = msg;
01725 handle->msgsize = msgsize;
01726 handle->handle_type = CMI_VMI_HANDLE_TYPE_SEND;
01727 handle->data.send.send_handle_type = CMI_VMI_SEND_HANDLE_TYPE_STREAM;
01728 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_NONE;
01729 handle->data.send.data.stream.cacheentry = cacheentry;
01730
01731 bufHandles[0] = cacheentry->bufferHandle;
01732 addrs[0] = (PVOID) msg;
01733 sz[0] = (ULONG) msgsize;
01734
01735 #if CMK_BROADCAST_SPANNING_TREE
01736 CMI_SET_BROADCAST_ROOT (msg, (_Cmi_mype + 1));
01737
01738 childcount = CMI_VMI_Spanning_Children_Count (msg);
01739
01740 handle->refcount += childcount;
01741 CMI_VMI_AsyncMsgCount += childcount;
01742
01743 startrank = CMI_BROADCAST_ROOT (msg) - 1;
01744 for (i = 1; i <= CMI_VMI_BROADCAST_SPANNING_FACTOR; i++) {
01745 destrank = _Cmi_mype - startrank;
01746
01747 if (destrank < 0) {
01748 destrank += _Cmi_numpes;
01749 }
01750
01751 destrank = CMI_VMI_BROADCAST_SPANNING_FACTOR * destrank + i;
01752
01753 if (destrank > (_Cmi_numpes - 1)) {
01754 break;
01755 }
01756
01757 destrank += startrank;
01758 destrank %= _Cmi_numpes;
01759
01760 status = VMI_Stream_Send ((&CMI_VMI_Processes[destrank])->connection, bufHandles, addrs, sz, 1, CMI_VMI_Stream_Completion_Handler, (PVOID) handle, TRUE);
01761 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send()");
01762 }
01763 #else
01764 handle->refcount += (_Cmi_numpes - 1);
01765 CMI_VMI_AsyncMsgCount += (_Cmi_numpes - 1);
01766
01767 for (i = 0; i < _Cmi_mype; i++) {
01768 status = VMI_Stream_Send ((&CMI_VMI_Processes[i])->connection, bufHandles, addrs, sz, 1, CMI_VMI_Stream_Completion_Handler, (PVOID) handle, TRUE);
01769 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send()");
01770 }
01771
01772 for (i = (_Cmi_mype + 1); i < _Cmi_numpes; i++) {
01773 status = VMI_Stream_Send ((&CMI_VMI_Processes[i])->connection, bufHandles, addrs, sz, 1, CMI_VMI_Stream_Completion_Handler, (PVOID) handle, TRUE);
01774 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send()");
01775 }
01776 #endif
01777 } else {
01778 if (CMI_VMI_Eager_Protocol) {
01779 context = CONTEXTFIELD (msg);
01780 if (context) {
01781 cacheentry = CMI_VMI_CacheEntry_From_Context (context);
01782 } else {
01783 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01784 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01785 }
01786 } else {
01787 context = NULL;
01788 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01789 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01790 }
01791
01792 handle = CMI_VMI_Handle_Allocate ();
01793
01794 handle->refcount += 1;
01795 handle->msg = msg;
01796 handle->msgsize = msgsize;
01797 handle->handle_type = CMI_VMI_HANDLE_TYPE_SEND;
01798 handle->data.send.send_handle_type = CMI_VMI_SEND_HANDLE_TYPE_RDMABROADCAST;
01799 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_NONE;
01800 handle->data.send.data.rdmabroadcast.cacheentry = cacheentry;
01801
01802 publish_msg.type = CMI_VMI_PUBLISH_TYPE_GET;
01803
01804 #if CMK_BROADCAST_SPANNING_TREE
01805 CMI_SET_BROADCAST_ROOT (msg, (_Cmi_mype + 1));
01806
01807 childcount = CMI_VMI_Spanning_Children_Count (msg);
01808
01809 handle->refcount += childcount;
01810 CMI_VMI_AsyncMsgCount += childcount;
01811 handle->data.send.data.rdmabroadcast.publishes_pending = childcount;
01812
01813 startrank = CMI_BROADCAST_ROOT (msg) - 1;
01814 for (i = 1; i <= CMI_VMI_BROADCAST_SPANNING_FACTOR; i++) {
01815 destrank = _Cmi_mype - startrank;
01816
01817 if (destrank < 0) {
01818 destrank += _Cmi_numpes;
01819 }
01820
01821 destrank = CMI_VMI_BROADCAST_SPANNING_FACTOR * destrank + i;
01822
01823 if (destrank > (_Cmi_numpes - 1)) {
01824 break;
01825 }
01826
01827 destrank += startrank;
01828 destrank %= _Cmi_numpes;
01829
01830 #if CMI_VMI_USE_VMI22
01831 status = VMI_RDMA_Publish_Buffer_With_Callback ((&CMI_VMI_Processes[destrank])->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg,
01832 (UINT32) msgsize, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
01833 (ULONG) sizeof (CMI_VMI_Publish_Message_T), (PVOID) handle, CMI_VMI_RDMA_Publish_Completion_Handler);
01834 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer_With_Callback()");
01835 #else
01836 status = VMI_RDMA_Publish_Buffer ((&CMI_VMI_Processes[destrank])->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg,
01837 (UINT32) msgsize, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
01838 (ULONG) sizeof (CMI_VMI_Publish_Message_T));
01839 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer()");
01840 #endif
01841 }
01842 #else
01843 handle->refcount += (_Cmi_numpes - 1);
01844 CMI_VMI_AsyncMsgCount += (_Cmi_numpes - 1);
01845 handle->data.send.data.rdmabroadcast.publishes_pending = (_Cmi_numpes - 1);
01846
01847 for (i = 0; i < _Cmi_mype; i++) {
01848 #if CMI_VMI_USE_VMI22
01849 status = VMI_RDMA_Publish_Buffer_With_Callback ((&CMI_VMI_Processes[i])->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg,
01850 (UINT32) msgsize, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
01851 (ULONG) sizeof (CMI_VMI_Publish_Message_T), (PVOID) handle, CMI_VMI_RDMA_Publish_Completion_Handler);
01852 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer_With_Callback()");
01853 #else
01854 status = VMI_RDMA_Publish_Buffer ((&CMI_VMI_Processes[i])->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg,
01855 (UINT32) msgsize, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
01856 (ULONG) sizeof (CMI_VMI_Publish_Message_T));
01857 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer()");
01858 #endif
01859 }
01860
01861 for (i = (_Cmi_mype + 1); i < _Cmi_numpes; i++) {
01862 #if CMI_VMI_USE_VMI22
01863 status = VMI_RDMA_Publish_Buffer_With_Callback ((&CMI_VMI_Processes[i])->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg,
01864 (UINT32) msgsize, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
01865 (ULONG) sizeof (CMI_VMI_Publish_Message_T), (PVOID) handle, CMI_VMI_RDMA_Publish_Completion_Handler);
01866 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer_With_Callback()");
01867 #else
01868 status = VMI_RDMA_Publish_Buffer ((&CMI_VMI_Processes[i])->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg,
01869 (UINT32) msgsize, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
01870 (ULONG) sizeof (CMI_VMI_Publish_Message_T));
01871 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer()");
01872 #endif
01873 }
01874 #endif
01875
01876 #if CMI_VMI_USE_VMI22
01877 while (handle->data.send.data.rdmabroadcast.publishes_pending > 0) {
01878 sched_yield ();
01879 status = VMI_Poll ();
01880 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
01881 }
01882 #endif
01883 }
01884
01885 return ((CmiCommHandle) handle);
01886 }
01887
01888
01889
01890
01891
01892
01893 void CmiFreeBroadcastFn (int msgsize, char *msg)
01894 {
01895 VMI_STATUS status;
01896
01897 PVMI_BUFFER bufHandles[2];
01898 PVOID addrs[2];
01899 ULONG sz[2];
01900
01901 CMI_VMI_Handle_T *handle;
01902
01903 int i;
01904
01905 PVMI_CACHE_ENTRY cacheentry;
01906
01907 int childcount;
01908 int startrank;
01909 int destrank;
01910
01911 CMI_VMI_Publish_Message_T publish_msg;
01912
01913 void *context;
01914
01915
01916 DEBUG_PRINT ("CmiFreeBroadcastFn() called.\n");
01917
01918 CMI_VMI_MESSAGE_TYPE (msg) = CMI_VMI_MESSAGE_TYPE_STANDARD;
01919 CMI_VMI_MESSAGE_CREDITS (msg) = 0;
01920
01921 if (msgsize < CMI_VMI_Small_Message_Boundary) {
01922 addrs[0] = (PVOID) msg;
01923 sz[0] = msgsize;
01924
01925 #if CMK_BROADCAST_SPANNING_TREE
01926 CMI_SET_BROADCAST_ROOT (msg, (_Cmi_mype + 1));
01927
01928 childcount = CMI_VMI_Spanning_Children_Count (msg);
01929
01930 startrank = CMI_BROADCAST_ROOT (msg) - 1;
01931 for (i = 1; i <= CMI_VMI_BROADCAST_SPANNING_FACTOR; i++) {
01932 destrank = _Cmi_mype - startrank;
01933
01934 if (destrank < 0) {
01935 destrank += _Cmi_numpes;
01936 }
01937
01938 destrank = CMI_VMI_BROADCAST_SPANNING_FACTOR * destrank + i;
01939
01940 if (destrank > (_Cmi_numpes - 1)) {
01941 break;
01942 }
01943
01944 destrank += startrank;
01945 destrank %= _Cmi_numpes;
01946
01947 status = VMI_Stream_Send_Inline ((&CMI_VMI_Processes[destrank])->connection, addrs, sz, 1, msgsize);
01948 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send_Inline()");
01949 }
01950 #else
01951 for (i = 0; i < _Cmi_mype; i++) {
01952 status = VMI_Stream_Send_Inline ((&CMI_VMI_Processes[i])->connection, addrs, sz, 1, msgsize);
01953 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send_Inline()");
01954 }
01955
01956 for (i = (_Cmi_mype + 1); i < _Cmi_numpes; i++) {
01957 status = VMI_Stream_Send_Inline ((&CMI_VMI_Processes[i])->connection, addrs, sz, 1, msgsize);
01958 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send_Inline()");
01959 }
01960 #endif
01961
01962 CmiFree (msg);
01963 } else if (msgsize < CMI_VMI_Medium_Message_Boundary) {
01964 if (CMI_VMI_Eager_Protocol) {
01965 context = CONTEXTFIELD (msg);
01966 if (context) {
01967 cacheentry = CMI_VMI_CacheEntry_From_Context (context);
01968 } else {
01969 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01970 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01971 }
01972 } else {
01973 context = NULL;
01974 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
01975 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
01976 }
01977
01978 handle = CMI_VMI_Handle_Allocate ();
01979
01980
01981 handle->msg = msg;
01982 handle->msgsize = msgsize;
01983 handle->handle_type = CMI_VMI_HANDLE_TYPE_SEND;
01984 handle->data.send.send_handle_type = CMI_VMI_SEND_HANDLE_TYPE_STREAM;
01985 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_FREE;
01986 handle->data.send.data.stream.cacheentry = cacheentry;
01987
01988 bufHandles[0] = cacheentry->bufferHandle;
01989 addrs[0] = (PVOID) msg;
01990 sz[0] = (ULONG) msgsize;
01991
01992 #if CMK_BROADCAST_SPANNING_TREE
01993 CMI_SET_BROADCAST_ROOT (msg, (_Cmi_mype + 1));
01994
01995 childcount = CMI_VMI_Spanning_Children_Count (msg);
01996
01997 handle->refcount += childcount;
01998 CMI_VMI_AsyncMsgCount += childcount;
01999
02000 startrank = CMI_BROADCAST_ROOT (msg) - 1;
02001 for (i = 1; i <= CMI_VMI_BROADCAST_SPANNING_FACTOR; i++) {
02002 destrank = _Cmi_mype - startrank;
02003
02004 if (destrank < 0) {
02005 destrank += _Cmi_numpes;
02006 }
02007
02008 destrank = CMI_VMI_BROADCAST_SPANNING_FACTOR * destrank + i;
02009
02010 if (destrank > (_Cmi_numpes - 1)) {
02011 break;
02012 }
02013
02014 destrank += startrank;
02015 destrank %= _Cmi_numpes;
02016
02017 status = VMI_Stream_Send ((&CMI_VMI_Processes[destrank])->connection, bufHandles, addrs, sz, 1, CMI_VMI_Stream_Completion_Handler, (PVOID) handle, TRUE);
02018 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send()");
02019 }
02020 #else
02021 handle->refcount += (_Cmi_numpes - 1);
02022 CMI_VMI_AsyncMsgCount += (_Cmi_numpes - 1);
02023
02024 for (i = 0; i < _Cmi_mype; i++) {
02025 status = VMI_Stream_Send ((&CMI_VMI_Processes[i])->connection, bufHandles, addrs, sz, 1, CMI_VMI_Stream_Completion_Handler, (PVOID) handle, TRUE);
02026 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send()");
02027 }
02028
02029 for (i = (_Cmi_mype + 1); i < _Cmi_numpes; i++) {
02030 status = VMI_Stream_Send ((&CMI_VMI_Processes[i])->connection, bufHandles, addrs, sz, 1, CMI_VMI_Stream_Completion_Handler, (PVOID) handle, TRUE);
02031 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send()");
02032 }
02033 #endif
02034 } else {
02035 if (CMI_VMI_Eager_Protocol) {
02036 context = CONTEXTFIELD (msg);
02037 if (context) {
02038 cacheentry = CMI_VMI_CacheEntry_From_Context (context);
02039 } else {
02040 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
02041 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
02042 }
02043 } else {
02044 context = NULL;
02045 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
02046 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
02047 }
02048
02049 handle = CMI_VMI_Handle_Allocate ();
02050
02051
02052 handle->msg = msg;
02053 handle->msgsize = msgsize;
02054 handle->handle_type = CMI_VMI_HANDLE_TYPE_SEND;
02055 handle->data.send.send_handle_type=CMI_VMI_SEND_HANDLE_TYPE_RDMABROADCAST;
02056 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_FREE;
02057 handle->data.send.data.rdmabroadcast.cacheentry = cacheentry;
02058
02059 publish_msg.type = CMI_VMI_PUBLISH_TYPE_GET;
02060
02061 #if CMK_BROADCAST_SPANNING_TREE
02062 CMI_SET_BROADCAST_ROOT (msg, (_Cmi_mype + 1));
02063
02064 childcount = CMI_VMI_Spanning_Children_Count (msg);
02065
02066 handle->refcount += childcount;
02067 CMI_VMI_AsyncMsgCount += childcount;
02068 handle->data.send.data.rdmabroadcast.publishes_pending = childcount;
02069
02070 startrank = CMI_BROADCAST_ROOT (msg) - 1;
02071 for (i = 1; i <= CMI_VMI_BROADCAST_SPANNING_FACTOR; i++) {
02072 destrank = _Cmi_mype - startrank;
02073
02074 if (destrank < 0) {
02075 destrank += _Cmi_numpes;
02076 }
02077
02078 destrank = CMI_VMI_BROADCAST_SPANNING_FACTOR * destrank + i;
02079
02080 if (destrank > (_Cmi_numpes - 1)) {
02081 break;
02082 }
02083
02084 destrank += startrank;
02085 destrank %= _Cmi_numpes;
02086
02087 #if CMI_VMI_USE_VMI22
02088 status = VMI_RDMA_Publish_Buffer_With_Callback ((&CMI_VMI_Processes[destrank])->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg,
02089 (UINT32) msgsize, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
02090 (ULONG) sizeof (CMI_VMI_Publish_Message_T), (PVOID) handle, CMI_VMI_RDMA_Publish_Completion_Handler);
02091 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer_With_Callback()");
02092 #else
02093 status = VMI_RDMA_Publish_Buffer ((&CMI_VMI_Processes[destrank])->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg,
02094 (UINT32) msgsize, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
02095 (ULONG) sizeof (CMI_VMI_Publish_Message_T));
02096 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer()");
02097 #endif
02098 }
02099 #else
02100 handle->refcount += (_Cmi_numpes - 1);
02101 CMI_VMI_AsyncMsgCount += (_Cmi_numpes - 1);
02102 handle->data.send.data.rdmabroadcast.publishes_pending = (_Cmi_numpes - 1);
02103
02104 for (i = 0; i < _Cmi_mype; i++) {
02105 #if CMI_VMI_USE_VMI22
02106 status = VMI_RDMA_Publish_Buffer_With_Callback ((&CMI_VMI_Processes[i])->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg,
02107 (UINT32) msgsize, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
02108 (ULONG) sizeof (CMI_VMI_Publish_Message_T), (PVOID) handle, CMI_VMI_RDMA_Publish_Completion_Handler);
02109 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer_With_Callback()");
02110 #else
02111 status = VMI_RDMA_Publish_Buffer ((&CMI_VMI_Processes[i])->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg,
02112 (UINT32) msgsize, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
02113 (ULONG) sizeof (CMI_VMI_Publish_Message_T));
02114 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer()");
02115 #endif
02116 }
02117
02118 for (i = (_Cmi_mype + 1); i < _Cmi_numpes; i++) {
02119 #if CMI_VMI_USE_VMI22
02120 status = VMI_RDMA_Publish_Buffer_With_Callback ((&CMI_VMI_Processes[i])->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg,
02121 (UINT32) msgsize, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
02122 (ULONG) sizeof (CMI_VMI_Publish_Message_T), (PVOID) handle, CMI_VMI_RDMA_Publish_Completion_Handler);
02123 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer_With_Callback()");
02124 #else
02125 status = VMI_RDMA_Publish_Buffer ((&CMI_VMI_Processes[i])->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg,
02126 (UINT32) msgsize, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
02127 (ULONG) sizeof (CMI_VMI_Publish_Message_T));
02128 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer()");
02129 #endif
02130 }
02131 #endif
02132
02133 #if CMI_VMI_USE_VMI22
02134 while (handle->data.send.data.rdmabroadcast.publishes_pending > 0) {
02135 sched_yield ();
02136 status = VMI_Poll ();
02137 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
02138 }
02139 #endif
02140 }
02141 }
02142
02143
02144
02145
02146
02147
02148 void CmiSyncBroadcastAllFn (int msgsize, char *msg)
02149 {
02150 char *msgcopy;
02151
02152
02153 DEBUG_PRINT ("CmiSyncBroadcastAllFn() called.\n");
02154
02155 msgcopy = CmiAlloc (msgsize);
02156 memcpy (msgcopy, msg, msgsize);
02157 CdsFifo_Enqueue (CpvAccess (CmiLocalQueue), msgcopy);
02158
02159 CmiSyncBroadcastFn (msgsize, msg);
02160 }
02161
02162
02163
02164
02165
02166
02167 CmiCommHandle CmiAsyncBroadcastAllFn (int msgsize, char *msg)
02168 {
02169 char *msgcopy;
02170
02171
02172 DEBUG_PRINT ("CmiAsyncBroadcastAllFn() called.\n");
02173
02174 msgcopy = CmiAlloc (msgsize);
02175 memcpy (msgcopy, msg, msgsize);
02176 CdsFifo_Enqueue (CpvAccess (CmiLocalQueue), msgcopy);
02177
02178 return (CmiAsyncBroadcastFn (msgsize, msg));
02179 }
02180
02181
02182
02183
02184
02185
02186
02187
02188
02189
02190
02191
02192
02193
02194 void CmiFreeBroadcastAllFn (int msgsize, char *msg)
02195 {
02196 char *msgcopy;
02197
02198
02199 DEBUG_PRINT ("CmiFreeBroadcastAllFn() called.\n");
02200
02201 #if CMK_BROADCAST_SPANNING_TREE
02202 if (msgsize < CMI_VMI_Small_Message_Boundary) {
02203 CmiSyncBroadcastFn (msgsize, msg);
02204 CdsFifo_Enqueue (CpvAccess (CmiLocalQueue), msg);
02205 } else if (msgsize < CMI_VMI_Medium_Message_Boundary) {
02206 msgcopy = CmiAlloc (msgsize);
02207 memcpy (msgcopy, msg, msgsize);
02208 CdsFifo_Enqueue (CpvAccess (CmiLocalQueue), msgcopy);
02209
02210 CmiFreeBroadcastFn (msgsize, msg);
02211 } else {
02212 CmiSyncBroadcastFn (msgsize, msg);
02213 CdsFifo_Enqueue (CpvAccess (CmiLocalQueue), msg);
02214 }
02215 #else
02216 if (msgsize < CMI_VMI_Medium_Message_Boundary) {
02217 msgcopy = CmiAlloc (msgsize);
02218 memcpy (msgcopy, msg, msgsize);
02219 CdsFifo_Enqueue (CpvAccess (CmiLocalQueue), msgcopy);
02220
02221 CmiFreeBroadcastFn (msgsize, msg);
02222 } else {
02223 CmiSyncBroadcastFn (msgsize, msg);
02224 CdsFifo_Enqueue (CpvAccess (CmiLocalQueue), msg);
02225 }
02226 #endif
02227 }
02228
02229
02230
02231
02232
02233
02234 int CmiAsyncMsgSent (CmiCommHandle commhandle)
02235 {
02236 CMI_VMI_Handle_T *handle;
02237
02238
02239 DEBUG_PRINT ("CmiAsyncMsgSent() called.\n");
02240
02241 if (commhandle) {
02242 handle = (CMI_VMI_Handle_T *) commhandle;
02243 return (handle->refcount <= 2);
02244 }
02245
02246 return (TRUE);
02247 }
02248
02249
02250
02251
02252
02253
02254 int CmiAllAsyncMsgsSent ()
02255 {
02256 DEBUG_PRINT ("CmiAllAsyncMsgsSent() called.\n");
02257
02258 return (CMI_VMI_AsyncMsgCount < 1);
02259 }
02260
02261
02262
02263
02264
02265
02266 void CmiReleaseCommHandle (CmiCommHandle commhandle)
02267 {
02268 VMI_STATUS status;
02269
02270 CMI_VMI_Handle_T *handle;
02271
02272 void *context;
02273
02274 int i;
02275
02276
02277 DEBUG_PRINT ("CmiReleaseCommHandle() called.\n");
02278
02279 if (commhandle) {
02280 handle = (CMI_VMI_Handle_T *) commhandle;
02281 handle->refcount -= 1;
02282
02283 if (handle->refcount <= 1) {
02284 if (handle->data.send.send_handle_type == CMI_VMI_SEND_HANDLE_TYPE_STREAM) {
02285 if (CMI_VMI_Eager_Protocol) {
02286 context = CONTEXTFIELD (handle->msg);
02287 if (!context) {
02288 status = VMI_Cache_Deregister (handle->data.send.data.stream.cacheentry);
02289 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Deregister()");
02290 }
02291 } else {
02292 context = NULL;
02293 status = VMI_Cache_Deregister (handle->data.send.data.stream.cacheentry);
02294 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Deregister()");
02295 }
02296 }
02297
02298 if (handle->data.send.send_handle_type == CMI_VMI_SEND_HANDLE_TYPE_RDMAGET) {
02299 if (CMI_VMI_Eager_Protocol) {
02300 context = CONTEXTFIELD (handle->msg);
02301 if (!context) {
02302 status = VMI_Cache_Deregister (handle->data.send.data.rdmaget.cacheentry);
02303 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Deregister()");
02304 }
02305 } else {
02306 context = NULL;
02307 status = VMI_Cache_Deregister (handle->data.send.data.rdmaget.cacheentry);
02308 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Deregister()");
02309 }
02310 }
02311
02312 if (handle->data.send.send_handle_type == CMI_VMI_SEND_HANDLE_TYPE_RDMABROADCAST) {
02313 if (CMI_VMI_Eager_Protocol) {
02314 context = CONTEXTFIELD (handle->msg);
02315 if (!context) {
02316 status = VMI_Cache_Deregister (handle->data.send.data.rdmabroadcast.cacheentry);
02317 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Deregister()");
02318 }
02319 } else {
02320 context = NULL;
02321 status = VMI_Cache_Deregister (handle->data.send.data.rdmabroadcast.cacheentry);
02322 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Deregister()");
02323 }
02324 }
02325
02326 if (handle->data.send.send_handle_type == CMI_VMI_SEND_HANDLE_TYPE_EAGER_LONG) {
02327 if (CMI_VMI_Eager_Protocol) {
02328 context = CONTEXTFIELD (handle->msg);
02329 if (!context) {
02330 status = VMI_Cache_Deregister (handle->data.send.data.eager_long.cacheentry);
02331 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Deregister()");
02332 }
02333 } else {
02334 context = NULL;
02335 status = VMI_Cache_Deregister (handle->data.send.data.eager_long.cacheentry);
02336 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Deregister()");
02337 }
02338 }
02339
02340 if (handle->data.send.message_disposition == CMI_VMI_MESSAGE_DISPOSITION_FREE) {
02341 CmiFree (handle->msg);
02342 }
02343
02344 CMI_VMI_Handle_Deallocate (handle);
02345 }
02346 }
02347 }
02348
02349
02350
02351
02352
02353
02354
02355 void *CmiGetNonLocal ()
02356 {
02357 VMI_STATUS status;
02358
02359 CMI_VMI_Process_T *process;
02360 CMI_VMI_Handle_T *handle;
02361
02362 int index;
02363 char *msg;
02364 CMI_VMI_Eager_Short_Slot_Footer_T *footer;
02365 int credits_temp;
02366
02367 CMI_VMI_Credit_Message_T credit_msg;
02368 PVOID addrs[1];
02369 ULONG sz[1];
02370
02371 int i;
02372
02373
02374 DEBUG_PRINT ("CmiGetNonLocal() called.\n");
02375
02376
02377 for (i = 0; i < CMI_VMI_Eager_Short_Pollset_Size; i++) {
02378
02379 process = CMI_VMI_Eager_Short_Pollset[i];
02380
02381
02382 index = process->eager_short_receive_index;
02383 handle = process->eager_short_receive_handles[index];
02384 footer = handle->data.receive.data.eager_short.footer;
02385
02386
02387 while (footer->sentinel == CMI_VMI_EAGER_SHORT_SENTINEL_DATA) {
02388
02389 msg = (char *) ((void *) handle->data.receive.data.eager_short.footer - footer->msgsize);
02390
02391
02392
02393
02394
02395
02396 SIZEFIELD (msg) = footer->msgsize;
02397 REFFIELD (msg) = 1;
02398 CONTEXTFIELD (msg) = handle;
02399
02400
02401 footer->sentinel = CMI_VMI_EAGER_SHORT_SENTINEL_RECEIVED;
02402
02403 process->eager_short_count += 1;
02404 CMI_VMI_Message_Receive_Count += 1;
02405
02406
02407
02408 CMI_VMI_Common_Receive (process->rank, footer->msgsize, msg);
02409
02410
02411 index = (index + 1) % process->eager_short_receive_size;
02412 process->eager_short_receive_index = index;
02413 handle = process->eager_short_receive_handles[index];
02414 footer = handle->data.receive.data.eager_short.footer;
02415 }
02416 }
02417
02418 status = VMI_Poll ();
02419 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
02420
02421 #if GK_DELAY_DEVICE
02422 {
02423 struct timeval gk_tv;
02424 double gk_time_now;
02425 gk_delayed_msgs *gk_ptr;
02426 char *gk_msg;
02427 int gk_msgsize;
02428 int gk_sender;
02429
02430 if (gk_head_ptr1) {
02431 gettimeofday (&gk_tv, NULL);
02432 gk_time_now = gk_tv.tv_sec + (gk_tv.tv_usec * 0.000001);
02433
02434 if (gk_time_now > (gk_head_ptr1->time + gk_timeout1)) {
02435 gk_msg = gk_head_ptr1->msg;
02436 gk_msgsize = gk_head_ptr1->msgsize;
02437 gk_sender = gk_head_ptr1->sender;
02438
02439 if (gk_head_ptr1 == gk_tail_ptr1) {
02440 free (gk_head_ptr1);
02441 gk_head_ptr1 = NULL;
02442 gk_tail_ptr1 = NULL;
02443 } else {
02444 gk_ptr = gk_head_ptr1;
02445 gk_head_ptr1 = gk_head_ptr1->next;
02446 free (gk_ptr);
02447 }
02448
02449 #if CMK_BROADCAST_SPANNING_TREE
02450 if (CMI_BROADCAST_ROOT (gk_msg)) {
02451
02452 CMI_VMI_Send_Spanning_Children (gk_msgsize, gk_msg);
02453 } else {
02454 CdsFifo_Enqueue (CpvAccess (CMI_VMI_RemoteQueue), gk_msg);
02455 }
02456 #else
02457 CdsFifo_Enqueue (CpvAccess (CMI_VMI_RemoteQueue), gk_msg);
02458 #endif
02459 }
02460 }
02461
02462 if (gk_head_ptr2) {
02463 gettimeofday (&gk_tv, NULL);
02464 gk_time_now = gk_tv.tv_sec + (gk_tv.tv_usec * 0.000001);
02465
02466 if (gk_time_now > (gk_head_ptr2->time + gk_timeout2)) {
02467 gk_msg = gk_head_ptr2->msg;
02468 gk_msgsize = gk_head_ptr2->msgsize;
02469 gk_sender = gk_head_ptr2->sender;
02470
02471 if (gk_head_ptr2 == gk_tail_ptr2) {
02472 free (gk_head_ptr2);
02473 gk_head_ptr2 = NULL;
02474 gk_tail_ptr2 = NULL;
02475 } else {
02476 gk_ptr = gk_head_ptr2;
02477 gk_head_ptr2 = gk_head_ptr2->next;
02478 free (gk_ptr);
02479 }
02480
02481 CMI_VMI_Common_Receive (gk_sender, gk_msgsize, gk_msg);
02482 }
02483 }
02484 }
02485 #endif
02486
02487 return (CdsFifo_Dequeue (CpvAccess (CMI_VMI_RemoteQueue)));
02488 }
02489
02490
02491
02492
02493
02494
02495 void CmiProbeLatencies ()
02496 {
02497 VMI_STATUS status;
02498
02499 CMI_VMI_Latency_Vector_Request_Message_T request_msg;
02500 PVOID addrs[1];
02501 ULONG sz[1];
02502
02503 int i;
02504
02505
02506 DEBUG_PRINT ("CmiProbeLatencies() called.\n");
02507
02508 CMI_VMI_Latency_Vectors_Received = 0;
02509
02510
02511 CMI_VMI_MESSAGE_TYPE (&request_msg) = CMI_VMI_MESSAGE_TYPE_LATENCY_VECTOR_REQUEST;
02512 CMI_VMI_MESSAGE_CREDITS (&request_msg) = 0;
02513
02514 #if CMK_BROADCAST_SPANNING_TREE
02515 CMI_SET_BROADCAST_ROOT (&request_msg, 0);
02516 #endif
02517
02518 addrs[0] = (PVOID) &request_msg;
02519 sz[0] = (ULONG) (sizeof (CMI_VMI_Latency_Vector_Request_Message_T));
02520
02521 for (i = 0; i < _Cmi_mype; i++) {
02522 status = VMI_Stream_Send_Inline ((&CMI_VMI_Processes[i])->connection, addrs, sz, 1, sizeof (CMI_VMI_Latency_Vector_Request_Message_T));
02523 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send_Inline()");
02524 }
02525
02526 for (i = (_Cmi_mype + 1); i < _Cmi_numpes; i++) {
02527 status = VMI_Stream_Send_Inline ((&CMI_VMI_Processes[i])->connection, addrs, sz, 1, sizeof (CMI_VMI_Latency_Vector_Request_Message_T));
02528 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send_Inline()");
02529 }
02530
02531 (&CMI_VMI_Processes[_Cmi_mype])->latency_vector = (unsigned long *) malloc (_Cmi_numpes * sizeof (unsigned long));
02532 for (i = 0; i < _Cmi_numpes; i++) {
02533 if (i == _Cmi_mype) {
02534 (&CMI_VMI_Processes[_Cmi_mype])->latency_vector[i] = 0;
02535 } else {
02536 (&CMI_VMI_Processes[_Cmi_mype])->latency_vector[i] = VMI_CONNECT_ONE_WAY_LATENCY ((&CMI_VMI_Processes[i])->connection);
02537 }
02538 }
02539
02540 while (CMI_VMI_Latency_Vectors_Received < (_Cmi_numpes - 1)) {
02541 status = VMI_Poll ();
02542 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
02543 }
02544 }
02545
02546
02547
02548
02549
02550
02551 unsigned long CmiGetLatency (int process1, int process2)
02552 {
02553 DEBUG_PRINT ("CmiGetLatency() called.\n");
02554
02555 if ((&CMI_VMI_Processes[process1])->latency_vector) {
02556 return ((&CMI_VMI_Processes[process1])->latency_vector[process2]);
02557 } else {
02558 return (CMI_VMI_LATENCY_UNKNOWN);
02559 }
02560 }
02561
02562
02563
02564
02565
02566
02567 int CmiGetCluster (int process)
02568 {
02569 DEBUG_PRINT ("CmiGetCluster() called.\n");
02570
02571 return ((&CMI_VMI_Processes[process])->cluster);
02572 }
02573
02574
02575
02576 #if CMK_GRID_QUEUE_AVAILABLE
02577
02578
02579
02580 int CmiGridQueueGetInterval ()
02581 {
02582 return (CMI_VMI_Grid_Queue_Interval);
02583 }
02584
02585
02586
02587
02588
02589
02590 int CmiGridQueueGetThreshold ()
02591 {
02592 return (CMI_VMI_Grid_Queue_Threshold);
02593 }
02594
02595
02596
02597
02598
02599
02600 void CmiGridQueueRegister (int gid, int nInts, int index1, int index2, int index3)
02601 {
02602 DEBUG_PRINT ("CmiGridQueueRegister() called.\n");
02603
02604 if ((!CMI_VMI_Grid_Queue) || (CMI_VMI_Grid_Objects_Index >= CMI_VMI_Grid_Queue_Maximum)) {
02605 return;
02606 }
02607
02608 if (CmiGridQueueLookup (gid, nInts, index1, index2, index3)) {
02609 return;
02610 }
02611
02612 CMI_VMI_Grid_Objects[CMI_VMI_Grid_Objects_Index].gid = gid;
02613 CMI_VMI_Grid_Objects[CMI_VMI_Grid_Objects_Index].nInts = nInts;
02614 CMI_VMI_Grid_Objects[CMI_VMI_Grid_Objects_Index].index1 = index1;
02615 CMI_VMI_Grid_Objects[CMI_VMI_Grid_Objects_Index].index2 = index2;
02616 CMI_VMI_Grid_Objects[CMI_VMI_Grid_Objects_Index].index3 = index3;
02617
02618 CMI_VMI_Grid_Objects_Index += 1;
02619
02620 if (CMI_VMI_Grid_Objects_Index > 1) {
02621 qsort (CMI_VMI_Grid_Objects, CMI_VMI_Grid_Objects_Index, sizeof (CMI_VMI_Grid_Object_T), CMI_VMI_Grid_Objects_Compare);
02622 }
02623 }
02624
02625
02626
02627
02628
02629
02630 void CmiGridQueueDeregister (int gid, int nInts, int index1, int index2, int index3)
02631 {
02632 int i;
02633 int j;
02634
02635
02636 DEBUG_PRINT ("CmiGridQueueDeregister() called.\n");
02637
02638 if (!CMI_VMI_Grid_Queue || (CMI_VMI_Grid_Objects_Index == 0)) {
02639 return;
02640 }
02641
02642 for (i = 0; i < CMI_VMI_Grid_Objects_Index; i++) {
02643 if (CMI_VMI_Grid_Objects[i].gid == gid) {
02644 if ((nInts == 1) && (CMI_VMI_Grid_Objects[i].index1 == index1)) {
02645 break;
02646 }
02647 if ((nInts == 2) && ((CMI_VMI_Grid_Objects[i].index1 == index1) &&
02648 (CMI_VMI_Grid_Objects[i].index2 == index2))) {
02649 break;
02650 }
02651 if ((nInts == 3) && ((CMI_VMI_Grid_Objects[i].index1 == index1) &&
02652 (CMI_VMI_Grid_Objects[i].index2 == index2) &&
02653 (CMI_VMI_Grid_Objects[i].index3 == index3))) {
02654 break;
02655 }
02656 }
02657 }
02658
02659 if (i >= CMI_VMI_Grid_Objects_Index) {
02660 return;
02661 }
02662
02663 for (j = i; j < CMI_VMI_Grid_Objects_Index; j++) {
02664 CMI_VMI_Grid_Objects[j].gid = CMI_VMI_Grid_Objects[j+1].gid;
02665 CMI_VMI_Grid_Objects[j].nInts = CMI_VMI_Grid_Objects[j+1].nInts;
02666 CMI_VMI_Grid_Objects[j].index1 = CMI_VMI_Grid_Objects[j+1].index1;
02667 CMI_VMI_Grid_Objects[j].index2 = CMI_VMI_Grid_Objects[j+1].index2;
02668 CMI_VMI_Grid_Objects[j].index3 = CMI_VMI_Grid_Objects[j+1].index3;
02669 }
02670
02671 CMI_VMI_Grid_Objects_Index -= 1;
02672 }
02673
02674
02675
02676
02677
02678
02679 void CmiGridQueueDeregisterAll ()
02680 {
02681 DEBUG_PRINT ("CmiGridQueueDeregisterAll() called.\n");
02682
02683 CMI_VMI_Grid_Objects_Index = 0;
02684 }
02685
02686
02687
02688
02689
02690
02691 int CmiGridQueueLookup (int gid, int nInts, int index1, int index2, int index3)
02692 {
02693 int i;
02694 void *ptr;
02695 CMI_VMI_Grid_Object_T key;
02696
02697
02698 DEBUG_PRINT ("CmiGridQueueLookup() called.\n");
02699
02700 if (!CMI_VMI_Grid_Queue || (CMI_VMI_Grid_Objects_Index == 0)) {
02701 return (0);
02702 }
02703
02704 key.gid = gid;
02705 key.nInts = nInts;
02706 key.index1 = index1;
02707 key.index2 = index2;
02708 key.index3 = index3;
02709
02710 ptr = bsearch (&key, CMI_VMI_Grid_Objects, CMI_VMI_Grid_Objects_Index, sizeof (CMI_VMI_Grid_Object_T), CMI_VMI_Grid_Objects_Compare);
02711
02712 if (ptr != NULL) {
02713 return (1);
02714 }
02715
02716 return (0);
02717
02718
02719
02720
02721
02722
02723
02724
02725
02726
02727
02728
02729
02730
02731
02732
02733
02734
02735
02736
02737
02738 }
02739
02740
02741
02742
02743
02744
02745 int CmiGridQueueLookupMsg (char *msg)
02746 {
02747 CMI_VMI_Envelope *env;
02748
02749
02750 DEBUG_PRINT ("CmiGridQueueLookupMsg() called.\n");
02751
02752 env = (CMI_VMI_Envelope *) msg;
02753 if (env->s_attribs.mtype == 16) {
02754 return (CmiGridQueueLookup (env->u_type.array.arr, env->u_type.array.index.nInts,
02755 env->u_type.array.index.index[0], env->u_type.array.index.index[1], env->u_type.array.index.index[2]));
02756 }
02757 return (0);
02758 }
02759
02760
02761
02762
02763
02764 int CMI_VMI_Grid_Objects_Compare (const void *ptr1, const void *ptr2)
02765 {
02766 CMI_VMI_Grid_Object_T *obj1;
02767 CMI_VMI_Grid_Object_T *obj2;
02768
02769
02770 obj1 = (CMI_VMI_Grid_Object_T *) ptr1;
02771 obj2 = (CMI_VMI_Grid_Object_T *) ptr2;
02772
02773 if (obj1->gid < obj2->gid) {
02774 return (-1);
02775 }
02776
02777 if (obj1->gid > obj2->gid) {
02778 return (1);
02779 }
02780
02781
02782
02783
02784
02785
02786 if (obj1->nInts != obj2->nInts) {
02787 CmiAbort ("Invalid data stored in Grid Queue lookup table.");
02788 }
02789
02790 if (obj1->nInts == 1) {
02791 if (obj1->index1 < obj2->index1) {
02792 return (-1);
02793 }
02794
02795 if (obj1->index1 > obj2->index1) {
02796 return (1);
02797 }
02798
02799 return (0);
02800 }
02801
02802 if (obj1->nInts == 2) {
02803 if (obj1->index1 < obj2->index1) {
02804 return (-1);
02805 }
02806
02807 if (obj1->index1 > obj2->index1) {
02808 return (1);
02809 }
02810
02811
02812
02813 if (obj1->index2 < obj2->index2) {
02814 return (-1);
02815 }
02816
02817 if (obj1->index2 > obj2->index2) {
02818 return (1);
02819 }
02820
02821 return (0);
02822 }
02823
02824 if (obj1->nInts == 3) {
02825 if (obj1->index1 < obj2->index1) {
02826 return (-1);
02827 }
02828
02829 if (obj1->index1 > obj2->index1) {
02830 return (1);
02831 }
02832
02833
02834
02835 if (obj1->index2 < obj2->index2) {
02836 return (-1);
02837 }
02838
02839 if (obj1->index2 > obj2->index2) {
02840 return (1);
02841 }
02842
02843
02844
02845 if (obj1->index3 < obj2->index3) {
02846 return (-1);
02847 }
02848
02849 if (obj1->index3 > obj2->index3) {
02850 return (1);
02851 }
02852
02853 return (0);
02854 }
02855
02856 CmiAbort ("Invalid data stored in Grid Queue lookup table.");
02857 }
02858 #endif
02859
02860
02861
02862 #if CMK_PERSISTENT_COMM
02863
02864
02865
02866 void CmiPersistentInit ()
02867 {
02868 DEBUG_PRINT ("CmiPersistentInit() called.\n");
02869 }
02870
02871
02872
02873
02874
02875
02876 PersistentHandle CmiCreatePersistent (int destrank, int maxsize)
02877 {
02878 VMI_STATUS status;
02879
02880 CMI_VMI_Persistent_Request_Message_T request_msg;
02881 PVOID addrs[1];
02882 ULONG sz[1];
02883
02884
02885 DEBUG_PRINT ("CmiCreatePersistent() called.\n");
02886
02887 if (CMI_VMI_Eager_Protocol) {
02888 CMI_VMI_MESSAGE_TYPE (&request_msg) = CMI_VMI_MESSAGE_TYPE_PERSISTENT_REQUEST;
02889 CMI_VMI_MESSAGE_CREDITS (&request_msg) = 0;
02890
02891 #if CMK_BROADCAST_SPANNING_TREE
02892 CMI_SET_BROADCAST_ROOT (&request_msg, 0);
02893 #endif
02894
02895 request_msg.maxsize = maxsize;
02896
02897 addrs[0] = (PVOID) &request_msg;
02898 sz[0] = (ULONG) (sizeof (CMI_VMI_Persistent_Request_Message_T));
02899
02900 status = VMI_Stream_Send_Inline ((&CMI_VMI_Processes[destrank])->connection, addrs, sz, 1, sizeof (CMI_VMI_Persistent_Request_Message_T));
02901 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send_Inline()");
02902 }
02903
02904 return ((PersistentHandle) NULL);
02905 }
02906
02907
02908
02909
02910
02911
02912 void CmiUsePersistentHandle (PersistentHandle *handle_array, int array_size)
02913 {
02914 DEBUG_PRINT ("CmiUserPersistentHandle() called.\n");
02915 }
02916
02917
02918
02919
02920
02921
02922 void CmiDestroyPersistent (PersistentHandle phandle)
02923 {
02924 DEBUG_PRINT ("CmiDestroyPersistent() called.\n");
02925 }
02926
02927
02928
02929
02930
02931
02932 void CmiDestroyAllPersistent ()
02933 {
02934 DEBUG_PRINT ("CmiDestroyAllPersistent() called.\n");
02935 }
02936
02937
02938
02939
02940
02941
02942 PersistentReq CmiCreateReceiverPersistent (int maxsize)
02943 {
02944 PersistentReq request;
02945
02946
02947 DEBUG_PRINT ("CmiCreateReceiverPersistent() called.\n");
02948
02949 request.pe = _Cmi_mype;
02950 request.maxBytes = maxsize;
02951
02952 return (request);
02953 }
02954
02955
02956
02957
02958
02959
02960 PersistentHandle CmiRegisterReceivePersistent (PersistentReq request)
02961 {
02962 DEBUG_PRINT ("CmiRegisterReceivePersistent() called.\n");
02963
02964 if (CMI_VMI_Eager_Protocol) {
02965 CMI_VMI_Eager_Short_Setup (request.pe);
02966
02967 if (request.maxBytes > CMI_VMI_Eager_Short_Message_Boundary) {
02968 if (request.maxBytes < CMI_VMI_Eager_Long_Buffer_Size) {
02969 CMI_VMI_Eager_Long_Setup (request.pe, CMI_VMI_Eager_Long_Buffer_Size);
02970 } else {
02971 CMI_VMI_Eager_Long_Setup (request.pe, request.maxBytes);
02972 }
02973 }
02974 }
02975
02976 return ((PersistentHandle) NULL);
02977 }
02978 #endif
02979
02980
02981
02982
02983
02984
02985 void CMI_VMI_Read_Environment ()
02986 {
02987 char *value;
02988
02989 int dummy1;
02990 int dummy2;
02991
02992
02993 DEBUG_PRINT ("CMI_VMI_Read_Environment() called.\n");
02994
02995
02996 if (value = (getpwuid (getuid ()))->pw_name) {
02997 if (!(CMI_VMI_Username = strdup (value))) {
02998 CmiAbort ("Unable to allocate memory for the username.");
02999 }
03000 } else {
03001 CmiAbort ("Unable to get the username for this process.");
03002 }
03003
03004
03005 if (value = getenv ("VMI_KEY")) {
03006
03007 free (CMI_VMI_Program_Key);
03008
03009 if (!(CMI_VMI_Program_Key = strdup (value))) {
03010 CmiAbort ("Unable to allocate memory for the program key.");
03011 }
03012 }
03013
03014
03015 if (value = getenv ("VMI_PROCS")) {
03016 _Cmi_numpes = atoi (value);
03017 } else {
03018 CmiAbort ("Unable to determine the number of processes in the computation (VMI_PROCS).");
03019 }
03020
03021
03022 if (value = getenv ("CMI_VMI_WAN_LATENCY")) {
03023 CMI_VMI_WAN_Latency = atoi (value);
03024 }
03025
03026 if (value = getenv ("CMI_VMI_CLUSTER")) {
03027 CMI_VMI_Cluster = atoi (value);
03028 }
03029
03030 if (value = getenv ("CMI_VMI_PROBE_CLUSTERS")) {
03031 CMI_VMI_Probe_Clusters = atoi (value);
03032 }
03033
03034 #if CMK_GRID_QUEUE_AVAILABLE
03035 if (value = getenv ("CMI_VMI_GRID_QUEUE")) {
03036 CMI_VMI_Grid_Queue = atoi (value);
03037 }
03038
03039 if (value = getenv ("CMI_VMI_GRID_QUEUE_MAXIMUM")) {
03040 CMI_VMI_Grid_Queue_Maximum = atoi (value);
03041 }
03042
03043 if (value = getenv ("CMI_VMI_GRID_QUEUE_INTERVAL")) {
03044 CMI_VMI_Grid_Queue_Interval = atoi (value);
03045 }
03046
03047 if (value = getenv ("CMI_VMI_GRID_QUEUE_THRESHOLD")) {
03048 CMI_VMI_Grid_Queue_Threshold = atoi (value);
03049 }
03050 #endif
03051
03052 if (value = getenv ("CMI_VMI_MEMORY_POOL")) {
03053 CMI_VMI_Memory_Pool = atoi (value);
03054 }
03055
03056 if (value = getenv ("CMI_VMI_TERMINATE_VMI_HACK")) {
03057 CMI_VMI_Terminate_VMI_Hack = atoi (value);
03058 }
03059
03060 if (value = getenv ("CMI_VMI_CONNECTION_TIMEOUT")) {
03061 CMI_VMI_Connection_Timeout = atoi (value);
03062 }
03063
03064 if (value = getenv ("CMI_VMI_MAXIMUM_HANDLES")) {
03065 CMI_VMI_Maximum_Handles = atoi (value);
03066 }
03067
03068 if (value = getenv ("CMI_VMI_SMALL_MESSAGE_BOUNDARY")) {
03069 CMI_VMI_Small_Message_Boundary = atoi (value);
03070 }
03071
03072 if (value = getenv ("CMI_VMI_MEDIUM_MESSAGE_BOUNDARY")) {
03073 CMI_VMI_Medium_Message_Boundary = atoi (value);
03074 }
03075
03076 if (value = getenv ("CMI_VMI_EAGER_PROTOCOL")) {
03077 CMI_VMI_Eager_Protocol = atoi (value);
03078 }
03079
03080 if (value = getenv ("CMI_VMI_EAGER_INTERVAL")) {
03081 CMI_VMI_Eager_Interval = atoi (value);
03082 }
03083
03084 if (value = getenv ("CMI_VMI_EAGER_THRESHOLD")) {
03085 CMI_VMI_Eager_Threshold = atoi (value);
03086 }
03087
03088 if (value = getenv ("CMI_VMI_EAGER_SHORT_POLLSET_SIZE_MAXIMUM")) {
03089 CMI_VMI_Eager_Short_Pollset_Size_Maximum = atoi (value);
03090 }
03091
03092 if (value = getenv ("CMI_VMI_EAGER_SHORT_SLOTS")) {
03093 CMI_VMI_Eager_Short_Slots = atoi (value);
03094 }
03095
03096 if (value = getenv ("CMI_VMI_EAGER_SHORT_MESSAGE_BOUNDARY")) {
03097 CMI_VMI_Eager_Short_Message_Boundary = atoi (value);
03098
03099
03100
03101
03102
03103
03104
03105 if (CMI_VMI_Eager_Short_Message_Boundary > 65536) {
03106 CMI_VMI_Eager_Short_Message_Boundary = 65536;
03107 }
03108 }
03109
03110 if (value = getenv ("CMI_VMI_EAGER_LONG_BUFFERS")) {
03111 CMI_VMI_Eager_Long_Buffers = atoi (value);
03112 }
03113
03114 if (value = getenv ("CMI_VMI_EAGER_LONG_BUFFER_SIZE")) {
03115 CMI_VMI_Eager_Long_Buffer_Size = atoi (value);
03116 }
03117
03118
03119 value = getenv ("CRM");
03120 if (value) {
03121 CMI_VMI_Startup_Type = CMI_VMI_STARTUP_TYPE_CRM;
03122 if (strstr (value, ":")) {
03123 CMI_VMI_CRM_Hostname = strdup (value);
03124 dummy1 = 0;
03125 while (CMI_VMI_CRM_Hostname[dummy1] != ':') {
03126 dummy1 += 1;
03127 }
03128 CMI_VMI_CRM_Hostname[dummy1] = 0;
03129 CMI_VMI_CRM_Port = atoi (value + dummy1 + 1);
03130 } else {
03131 CMI_VMI_CRM_Hostname = strdup (value);
03132 CMI_VMI_CRM_Port = CMI_VMI_CRM_PORT;
03133 }
03134 return;
03135 }
03136
03137 value = getenv ("NETSTART");
03138 if (value) {
03139 CMI_VMI_Startup_Type = CMI_VMI_STARTUP_TYPE_CHARMRUN;
03140 sscanf (value, "%d%s%d%d%d", &_Cmi_mype, CMI_VMI_Charmrun_IP, &CMI_VMI_Charmrun_Port, &dummy1, &dummy2);
03141 return;
03142 }
03143 }
03144
03145
03146
03147
03148
03149
03150 int CMI_VMI_Startup_CRM ()
03151 {
03152 pid_t myPID;
03153
03154 struct hostent *host_ent;
03155
03156 struct sockaddr_in serv_addr;
03157 int rc;
03158
03159 CMI_VMI_CRM_Register_Message_T msg_register;
03160
03161 int msg_code;
03162 int msg_error;
03163
03164 int msg_numpes;
03165
03166 CMI_VMI_CRM_Nodeblock_Message_T *msg_nodeblock;
03167
03168 char crm_ip[1024];
03169
03170 struct sockaddr_in local;
03171 socklen_t sockaddr_len;
03172 int myIP;
03173
03174 int i;
03175
03176
03177 DEBUG_PRINT ("CMI_VMI_Startup_CRM() called.\n");
03178
03179 myPID = getpid ();
03180
03181 CMI_VMI_CRM_Socket = socket (AF_INET, SOCK_STREAM, 0);
03182 if (CMI_VMI_CRM_Socket < 0) {
03183 DEBUG_PRINT ("Error opening socket to CRM.\n");
03184 return (-1);
03185 }
03186
03187 host_ent = gethostbyname (CMI_VMI_CRM_Hostname);
03188 if (!host_ent) {
03189 DEBUG_PRINT ("Error in gethostbyname() while contacting CRM.\n");
03190 return (-1);
03191 }
03192
03193 strcpy (crm_ip, inet_ntoa (*((struct in_addr *) host_ent->h_addr_list[0])));
03194
03195
03196 memset ((void *) &serv_addr, 0, sizeof (struct sockaddr_in));
03197 serv_addr.sin_family = AF_INET;
03198 serv_addr.sin_addr.s_addr = inet_addr (crm_ip);
03199 serv_addr.sin_port = htons (CMI_VMI_CRM_Port);
03200
03201
03202 rc = connect (CMI_VMI_CRM_Socket, (struct sockaddr *) &serv_addr, sizeof (struct sockaddr_in));
03203 if (rc < 0) {
03204 DEBUG_PRINT ("Error connecting to CRM.\n");
03205 return (rc);
03206 }
03207
03208 memset ((void *) &local, 0, sizeof (struct sockaddr_in));
03209 sockaddr_len = sizeof (struct sockaddr_in);
03210 rc = getsockname (CMI_VMI_CRM_Socket, (struct sockaddr *) &local, &sockaddr_len);
03211 if (rc < 0) {
03212 DEBUG_PRINT ("Error getting local TCP/IP address while synchronizing with CRM.\n");
03213 close (CMI_VMI_CRM_Socket);
03214 return (rc);
03215 }
03216 myIP = (int) local.sin_addr.s_addr;
03217
03218 msg_code = htonl (CMI_VMI_CRM_MESSAGE_REGISTER);
03219
03220 rc = CMI_VMI_Socket_Send (CMI_VMI_CRM_Socket, (const void *) &msg_code, sizeof (int));
03221 if (rc < 0) {
03222 DEBUG_PRINT ("Error sending to CRM.\n");
03223 close (CMI_VMI_CRM_Socket);
03224 return (rc);
03225 }
03226
03227 msg_register.numpes = htonl (_Cmi_numpes);
03228 msg_register.cluster = htonl (CMI_VMI_Cluster);
03229 msg_register.node_context = htonl (myPID);
03230 msg_register.key_length = htonl (strlen (CMI_VMI_Program_Key));
03231 strcpy ((char *) &msg_register.key, CMI_VMI_Program_Key);
03232
03233 rc = CMI_VMI_Socket_Send (CMI_VMI_CRM_Socket, (const void *) &msg_register, ((4 * sizeof (int)) + strlen (CMI_VMI_Program_Key)));
03234 if (rc < 0) {
03235 DEBUG_PRINT ("Error sending to CRM.\n");
03236 close (CMI_VMI_CRM_Socket);
03237 return (rc);
03238 }
03239
03240 rc = CMI_VMI_Socket_Receive (CMI_VMI_CRM_Socket, &msg_code, sizeof (int));
03241 if (rc < 0) {
03242 DEBUG_PRINT ("Error receiveing from CRM.\n");
03243 close (CMI_VMI_CRM_Socket);
03244 return (rc);
03245 }
03246
03247 msg_code = ntohl (msg_code);
03248
03249 switch (msg_code)
03250 {
03251 case CMI_VMI_CRM_MESSAGE_SUCCESS:
03252 rc = CMI_VMI_Socket_Receive (CMI_VMI_CRM_Socket, &msg_numpes, sizeof (int));
03253 if (rc < 0) {
03254 DEBUG_PRINT ("Error receiveing from CRM.\n");
03255 close (CMI_VMI_CRM_Socket);
03256 return (rc);
03257 }
03258
03259 msg_numpes = ntohl (msg_numpes);
03260
03261 msg_nodeblock = malloc (msg_numpes * sizeof (CMI_VMI_CRM_Nodeblock_Message_T));
03262 if (!msg_nodeblock) {
03263 DEBUG_PRINT ("Unable to allocate memory to receive nodeblock from CRM.\n");
03264 close (CMI_VMI_CRM_Socket);
03265 return (-1);
03266 }
03267
03268 rc = CMI_VMI_Socket_Receive (CMI_VMI_CRM_Socket, msg_nodeblock, msg_numpes * sizeof (CMI_VMI_CRM_Nodeblock_Message_T));
03269 if (rc < 0) {
03270 DEBUG_PRINT ("Error receiveing from CRM.\n");
03271 close (CMI_VMI_CRM_Socket);
03272 return (rc);
03273 }
03274
03275 _Cmi_mype = -1;
03276 for (i = 0; i < msg_numpes; i++) {
03277 (&CMI_VMI_Processes[i])->rank = i;
03278 (&CMI_VMI_Processes[i])->node_IP = (&msg_nodeblock[i])->node_IP;
03279 (&CMI_VMI_Processes[i])->cluster = ntohl ((&msg_nodeblock[i])->cluster);
03280
03281 (&msg_nodeblock[i])->node_context = ntohl ((&msg_nodeblock[i])->node_context);
03282
03283 if (((&msg_nodeblock[i])->node_IP == myIP) && ((&msg_nodeblock[i])->node_context) == myPID) {
03284 _Cmi_mype = i;
03285 }
03286 }
03287
03288 free (msg_nodeblock);
03289
03290 close (CMI_VMI_CRM_Socket);
03291
03292 return (0);
03293
03294 break;
03295
03296 case CMI_VMI_CRM_MESSAGE_FAILURE:
03297 rc = CMI_VMI_Socket_Receive (CMI_VMI_CRM_Socket, &msg_error, sizeof (int));
03298 if (rc < 0) {
03299 DEBUG_PRINT ("Error receiveing from CRM.\n");
03300 close (CMI_VMI_CRM_Socket);
03301 return (rc);
03302 }
03303
03304 msg_error = ntohl (msg_error);
03305
03306 switch (msg_error)
03307 {
03308 case CMI_VMI_CRM_ERROR_CONFLICT:
03309 CmiPrintf ("Error synchronizing with CRM (key/# PE conflict).\n");
03310 break;
03311
03312 case CMI_VMI_CRM_ERROR_TIMEOUT:
03313 CmiPrintf ("Error synchronizing with CRM (timeout).\n");
03314 break;
03315
03316 default:
03317 CmiPrintf ("Error synchronizing with CRM (unknown problem).\n");
03318 break;
03319 }
03320
03321 return (-1);
03322
03323 close (CMI_VMI_CRM_Socket);
03324
03325 break;
03326
03327 default:
03328 printf ("Unknown message code received from CRM.\n");
03329 return (-1);
03330 break;
03331 }
03332
03333
03334 return (-2);
03335 }
03336
03337
03338
03339
03340
03341
03342 int CMI_VMI_Startup_Charmrun ()
03343 {
03344 pid_t myPID;
03345
03346 CMI_VMI_Charmrun_Message_Header_T hdr;
03347 CMI_VMI_Charmrun_Register_Message_T msg_register;
03348 int msg_numnodes;
03349 CMI_VMI_Charmrun_Nodeblock_Message_T *msg_nodeblock;
03350
03351 struct sockaddr_in serv_addr;
03352 int rc;
03353
03354 int i;
03355 int j;
03356
03357
03358 DEBUG_PRINT ("CMI_VMI_Startup_Charmrun() called.\n");
03359
03360 myPID = getpid ();
03361
03362 CMI_VMI_Charmrun_Socket = socket (AF_INET, SOCK_STREAM, 0);
03363 if (CMI_VMI_Charmrun_Socket < 0) {
03364 DEBUG_PRINT ("Error opening socket to charmrun.\n");
03365 return (-1);
03366 }
03367
03368
03369 memset ((void *) &serv_addr, 0, sizeof (struct sockaddr_in));
03370 serv_addr.sin_family = AF_INET;
03371 serv_addr.sin_addr.s_addr = inet_addr (CMI_VMI_Charmrun_IP);
03372 serv_addr.sin_port = htons (CMI_VMI_Charmrun_Port);
03373
03374 rc = connect (CMI_VMI_Charmrun_Socket, (struct sockaddr *) &serv_addr, sizeof (serv_addr));
03375 if (rc < 0) {
03376 DEBUG_PRINT ("Error connecting to charmrun.\n");
03377 return (rc);
03378 }
03379
03380 hdr.msg_len = htonl (sizeof (CMI_VMI_Charmrun_Register_Message_T));
03381 strcpy (hdr.msg_type, "initnode");
03382
03383 msg_register.node_number = htonl (_Cmi_mype);
03384 msg_register.numpes = htonl (0);
03385 msg_register.dataport = htonl (myPID);
03386 msg_register.mach_id = htonl (0);
03387 msg_register.node_IP = htonl (0);
03388
03389 rc = CMI_VMI_Socket_Send (CMI_VMI_Charmrun_Socket, (const void *) &hdr, sizeof (CMI_VMI_Charmrun_Message_Header_T));
03390 if (rc < 0) {
03391 DEBUG_PRINT ("Error sending to charmrun.\n");
03392 return (rc);
03393 }
03394 rc = CMI_VMI_Socket_Send (CMI_VMI_Charmrun_Socket, (const void *) &msg_register, sizeof (CMI_VMI_Charmrun_Register_Message_T));
03395 if (rc < 0) {
03396 DEBUG_PRINT ("Error sending to charmrun.\n");
03397 return (rc);
03398 }
03399
03400 rc = CMI_VMI_Socket_Receive (CMI_VMI_Charmrun_Socket, (void *) &hdr, sizeof (CMI_VMI_Charmrun_Message_Header_T));
03401 if (rc < 0) {
03402 DEBUG_PRINT ("Error receiving from charmrun.\n");
03403 return (rc);
03404 }
03405 rc = CMI_VMI_Socket_Receive (CMI_VMI_Charmrun_Socket, (void *) &msg_numnodes, sizeof (int));
03406 if (rc < 0) {
03407 DEBUG_PRINT ("Error receiving from charmrun.\n");
03408 return (rc);
03409 }
03410
03411 msg_numnodes = ntohl (msg_numnodes);
03412
03413 msg_nodeblock = (CMI_VMI_Charmrun_Nodeblock_Message_T *) malloc (msg_numnodes * sizeof (CMI_VMI_Charmrun_Nodeblock_Message_T));
03414
03415 rc = CMI_VMI_Socket_Receive (CMI_VMI_Charmrun_Socket, (void *) msg_nodeblock, (msg_numnodes * sizeof (CMI_VMI_Charmrun_Nodeblock_Message_T)));
03416 if (rc < 0) {
03417 DEBUG_PRINT ("Error receiving from charmrun.\n");
03418 return (rc);
03419 }
03420
03421 for (i = 0; i < msg_numnodes; i++) {
03422 (&CMI_VMI_Processes[i])->node_IP = (&msg_nodeblock[i])->node_IP;
03423 (&CMI_VMI_Processes[i])->rank = i;
03424 }
03425
03426 free (msg_nodeblock);
03427
03428
03429 return (0);
03430 }
03431
03432
03433
03434
03435
03436
03437
03438
03439
03440
03441
03442
03443 int CMI_VMI_Initialize_VMI ()
03444 {
03445 VMI_STATUS status;
03446
03447 char *vmi_key;
03448 char *vmi_inlined_data_size;
03449
03450
03451 DEBUG_PRINT ("CMI_VMI_Initialize_VMI() called.\n");
03452
03453
03454 vmi_key = (char *) malloc ((strlen (CMI_VMI_Program_Key)) + 32);
03455 if (!vmi_key) {
03456 DEBUG_PRINT ("Unable to allocate memory for VMI key.");
03457 return (-1);
03458 }
03459
03460 sprintf (vmi_key, "VMI_KEY=%s:%d\0", CMI_VMI_Program_Key, _Cmi_mype);
03461
03462 if (putenv (vmi_key) < 0) {
03463 DEBUG_PRINT ("Unable to set VMI_KEY environment variable.");
03464 return (-1);
03465 }
03466
03467
03468 vmi_inlined_data_size = (char *) malloc (32);
03469 if (!vmi_inlined_data_size) {
03470 DEBUG_PRINT ("Unable to allocate memory for VMI inlined data size.");
03471 return (-1);
03472 }
03473
03474 sprintf (vmi_inlined_data_size, "VMI_INLINED_DATA_SZ=%d\0", CMI_VMI_Medium_Message_Boundary);
03475
03476 if (putenv (vmi_inlined_data_size) < 0) {
03477 DEBUG_PRINT ("Unable to set VMI_INLINED_DATA_SZ environment variable.");
03478 return (-1);
03479 }
03480
03481 DEBUG_PRINT ("Initializing VMI with key %s.\n", vmi_key);
03482
03483
03484 status = VMI_Init (0, NULL);
03485 CMI_VMI_CHECK_SUCCESS (status, "VMI_Init()");
03486
03487
03488 status = VMI_Connection_Accept_Fn (CMI_VMI_Connection_Handler);
03489 CMI_VMI_CHECK_SUCCESS (status, "VMI_Connection_Accept_Fn()");
03490
03491
03492 status = VMI_Connection_Disconnect_Fn (CMI_VMI_Disconnection_Handler);
03493 CMI_VMI_CHECK_SUCCESS (status, "VMI_Connection_Disconnect_Fn()");
03494
03495
03496 VMI_STREAM_SET_RECV_FUNCTION (CMI_VMI_Stream_Notification_Handler);
03497
03498
03499 if (CMI_VMI_Memory_Pool) {
03500 status = VMI_Pool_Create_Buffer_Pool (CMI_VMI_BUCKET1_SIZE, sizeof (PVOID), CMI_VMI_BUCKET1_PREALLOCATE,
03501 CMI_VMI_BUCKET1_GROW, VMI_POOL_CLEARONCE, &CMI_VMI_Bucket1_Pool);
03502 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Create_Buffer_Pool()");
03503
03504 status = VMI_Pool_Create_Buffer_Pool (CMI_VMI_BUCKET2_SIZE, sizeof (PVOID), CMI_VMI_BUCKET2_PREALLOCATE,
03505 CMI_VMI_BUCKET2_GROW, VMI_POOL_CLEARONCE, &CMI_VMI_Bucket2_Pool);
03506 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Create_Buffer_Pool()");
03507
03508 status = VMI_Pool_Create_Buffer_Pool (CMI_VMI_BUCKET3_SIZE, sizeof (PVOID), CMI_VMI_BUCKET3_PREALLOCATE,
03509 CMI_VMI_BUCKET3_GROW, VMI_POOL_CLEARONCE, &CMI_VMI_Bucket3_Pool);
03510 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Create_Buffer_Pool()");
03511
03512 status = VMI_Pool_Create_Buffer_Pool (CMI_VMI_BUCKET4_SIZE, sizeof (PVOID), CMI_VMI_BUCKET4_PREALLOCATE,
03513 CMI_VMI_BUCKET4_GROW, VMI_POOL_CLEARONCE, &CMI_VMI_Bucket4_Pool);
03514 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Create_Buffer_Pool()");
03515
03516 status = VMI_Pool_Create_Buffer_Pool (CMI_VMI_BUCKET5_SIZE, sizeof (PVOID), CMI_VMI_BUCKET5_PREALLOCATE,
03517 CMI_VMI_BUCKET5_GROW, VMI_POOL_CLEARONCE, &CMI_VMI_Bucket5_Pool);
03518 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Create_Buffer_Pool()");
03519 }
03520
03521
03522 free (vmi_inlined_data_size);
03523 free (vmi_key);
03524
03525
03526 return (0);
03527 }
03528
03529
03530
03531
03532
03533
03534 int CMI_VMI_Terminate_VMI ()
03535 {
03536 VMI_STATUS status;
03537
03538
03539 DEBUG_PRINT ("CMI_VMI_Terminate_VMI() called.\n");
03540
03541
03542 if (CMI_VMI_Memory_Pool) {
03543 status = VMI_Pool_Destroy_Buffer_Pool (CMI_VMI_Bucket1_Pool);
03544 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Destroy_Buffer_Pool()");
03545
03546 status = VMI_Pool_Destroy_Buffer_Pool (CMI_VMI_Bucket2_Pool);
03547 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Destroy_Buffer_Pool()");
03548
03549 status = VMI_Pool_Destroy_Buffer_Pool (CMI_VMI_Bucket3_Pool);
03550 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Destroy_Buffer_Pool()");
03551
03552 status = VMI_Pool_Destroy_Buffer_Pool (CMI_VMI_Bucket4_Pool);
03553 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Destroy_Buffer_Pool()");
03554
03555 status = VMI_Pool_Destroy_Buffer_Pool (CMI_VMI_Bucket5_Pool);
03556 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Destroy_Buffer_Pool()");
03557 }
03558
03559
03560 SET_VMI_SUCCESS (status);
03561 VMI_Terminate (status);
03562
03563
03564
03565 return (0);
03566 }
03567
03568
03569
03570
03571
03572
03573 int CMI_VMI_Socket_Send (int sockfd, const void *msg, int size)
03574 {
03575 int sent;
03576 int rc;
03577
03578
03579 DEBUG_PRINT ("CMI_VMI_Socket_Send() called.\n");
03580
03581 sent = 0;
03582 while (sent < size) {
03583 rc = send (sockfd, (const void *) (msg + sent), (size - sent), 0);
03584 if (rc < 0) {
03585 return (rc);
03586 } else {
03587 sent += rc;
03588 }
03589 }
03590
03591 return (sent);
03592 }
03593
03594
03595
03596
03597
03598
03599 int CMI_VMI_Socket_Receive (int sockfd, void *msg, int size)
03600 {
03601 int received;
03602 int rc;
03603
03604
03605 DEBUG_PRINT ("CMI_VMI_Socket_Receive() called.\n");
03606
03607 received = 0;
03608 while (received < size) {
03609 rc = recv (sockfd, (void *) (msg + received), (size - received), 0);
03610 if (rc < 0) {
03611 return (rc);
03612 } else {
03613 received += rc;
03614 }
03615 }
03616
03617 return (received);
03618 }
03619
03620
03621
03622
03623
03624
03625
03626
03627
03628
03629
03630
03631
03632
03633
03634 int CMI_VMI_Open_Connections ()
03635 {
03636 VMI_STATUS status;
03637
03638 char *remote_key;
03639
03640 PVMI_BUFFER connect_message_buffer;
03641 CMI_VMI_Connect_Message_T *connect_message_data;
03642
03643 int i;
03644
03645
03646
03647 struct timeval tp;
03648 long start_time;
03649 long now_time;
03650 BOOLEAN pending;
03651
03652
03653 DEBUG_PRINT ("CMI_VMI_Open_Connections() called.\n");
03654
03655
03656 remote_key = malloc ((strlen (CMI_VMI_Program_Key)) + 32);
03657 if (!remote_key) {
03658 DEBUG_PRINT ("Unable to allocate memory for remote key.\n");
03659 return (-1);
03660 }
03661
03662
03663 status = VMI_Buffer_Allocate (sizeof (CMI_VMI_Connect_Message_T), &connect_message_buffer);
03664 if (!VMI_SUCCESS (status)) {
03665 DEBUG_PRINT ("Unable to allocate connection message buffer.\n");
03666 free (remote_key);
03667 return (-1);
03668 }
03669
03670
03671 connect_message_data = (CMI_VMI_Connect_Message_T *) VMI_BUFFER_ADDRESS (connect_message_buffer);
03672 connect_message_data->rank = htonl (_Cmi_mype);
03673
03674
03675 for (i = 0; i < _Cmi_mype; i++) {
03676
03677 sprintf (remote_key, "%s:%u\0", CMI_VMI_Program_Key, (&CMI_VMI_Processes[i])->rank);
03678
03679 CMI_VMI_Open_Connection (i, remote_key, connect_message_buffer);
03680
03681 DEBUG_PRINT ("Issued a connection to process %d:\n", i);
03682 DEBUG_PRINT ("\tRank - %d\n", (&CMI_VMI_Processes[i])->rank);
03683 DEBUG_PRINT ("\tKey - %s\n", remote_key);
03684 DEBUG_PRINT ("\tHostname - %s\n", remote_host->h_name);
03685 DEBUG_PRINT ("\tIP - [%d.%d.%d.%d].\n", ((process->node_IP >> 0) & 0xFF),
03686 ((process->node_IP >> 8) & 0xFF),
03687 ((process->node_IP >> 16) & 0xFF),
03688 ((process->node_IP >> 24) & 0xFF));
03689 }
03690
03691
03692 (&CMI_VMI_Processes[_Cmi_mype])->connection_state = CMI_VMI_CONNECTION_CONNECTED;
03693
03694
03695 gettimeofday (&tp, NULL);
03696 start_time = tp.tv_sec;
03697 now_time = tp.tv_sec;
03698 pending = TRUE;
03699
03700 while (pending && ((start_time + CMI_VMI_Connection_Timeout) > now_time)) {
03701 sched_yield ();
03702 status = VMI_Poll ();
03703 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
03704
03705 gettimeofday (&tp, NULL);
03706 now_time = tp.tv_sec;
03707
03708 pending = FALSE;
03709 for (i = 0; i < _Cmi_numpes; i++) {
03710 pending = pending || ((&CMI_VMI_Processes[i])->connection_state != CMI_VMI_CONNECTION_CONNECTED);
03711 }
03712
03713
03714 if (pending && ((now_time - start_time) % 30 == 0)) {
03715 for (i = 0; i < _Cmi_mype; i++) {
03716 if ((&CMI_VMI_Processes[i])->connection_state == CMI_VMI_CONNECTION_ERROR) {
03717 sprintf (remote_key, "%s:%u\0", CMI_VMI_Program_Key, (&CMI_VMI_Processes[i])->rank);
03718 CMI_VMI_Open_Connection (i, remote_key, connect_message_buffer);
03719 }
03720 }
03721 }
03722 }
03723
03724
03725 free (remote_key);
03726 VMI_Buffer_Deallocate (connect_message_buffer);
03727
03728
03729 if (pending) {
03730 DEBUG_PRINT ("There were connection errors for process %d.\n", _Cmi_mype);
03731 return (-1);
03732 }
03733
03734 DEBUG_PRINT ("All connections are open for process %d.\n", _Cmi_mype);
03735
03736 return (0);
03737 }
03738
03739
03740
03741
03742
03743
03744 int CMI_VMI_Open_Connection (int remote_rank, char *remote_key, PVMI_BUFFER connect_message_buffer)
03745 {
03746 VMI_STATUS status;
03747
03748 CMI_VMI_Process_T *process;
03749 struct hostent *remote_host;
03750 PVMI_NETADDRESS remote_address;
03751
03752
03753 DEBUG_PRINT ("CMI_VMI_Open_Connection() called.\n");
03754
03755
03756 process = &CMI_VMI_Processes[remote_rank];
03757
03758
03759 status = VMI_Connection_Create (&process->connection);
03760 if (!VMI_SUCCESS (status)) {
03761 DEBUG_PRINT ("Unable to create connection to process %d.\n", remote_rank);
03762 return (-1);
03763 }
03764
03765
03766 remote_host = gethostbyaddr (&process->node_IP, sizeof (process->node_IP), AF_INET);
03767 if (!remote_host) {
03768 DEBUG_PRINT ("Error looking up host [%d.%d.%d.%d].\n", ((process->node_IP >> 0) & 0xFF),
03769 ((process->node_IP >> 8) & 0xFF),
03770 ((process->node_IP >> 16) & 0xFF),
03771 ((process->node_IP >> 24) & 0xFF));
03772 return (-1);
03773 }
03774
03775
03776 status = VMI_Connection_Allocate_IPV4_Address (remote_host->h_name, 0, CMI_VMI_Username, remote_key, &remote_address);
03777 if (!VMI_SUCCESS (status)) {
03778 DEBUG_PRINT ("Unable to allocate remote node IP V4 address.\n");
03779 return (-1);
03780 }
03781
03782
03783 status = VMI_Connection_Bind (*localAddress, *remote_address, process->connection);
03784 if (!VMI_SUCCESS (status)) {
03785 DEBUG_PRINT ("Error binding connection for process %d.\n", i);
03786 return (-1);
03787 }
03788
03789
03790
03791
03792
03793 process->connection_state = CMI_VMI_CONNECTION_CONNECTING;
03794
03795
03796 status = VMI_Connection_Issue (process->connection, connect_message_buffer, (VMIConnectIssue) CMI_VMI_Connection_Response_Handler, process);
03797 if (!VMI_SUCCESS (status)) {
03798 DEBUG_PRINT ("Error issuing connection for process %d.\n", i);
03799 return (-1);
03800 }
03801 }
03802
03803
03804
03805
03806
03807
03808
03809 VMI_CONNECT_RESPONSE CMI_VMI_Connection_Handler (PVMI_CONNECT connection, PVMI_SLAB slab, ULONG data_size)
03810 {
03811 VMI_STATUS status;
03812
03813 CMI_VMI_Connect_Message_T *data;
03814 ULONG rank;
03815 ULONG size;
03816 PVMI_SLAB_STATE state;
03817
03818
03819 DEBUG_PRINT ("CMI_VMI_Connection_Handler() called.\n");
03820
03821
03822 size = sizeof (CMI_VMI_Connect_Message_T);
03823
03824
03825 if (data_size != size) {
03826 return VMI_CONNECT_RESPONSE_ERROR;
03827 }
03828
03829
03830 data = (CMI_VMI_Connect_Message_T *) malloc (size);
03831 if (!data) {
03832 return VMI_CONNECT_RESPONSE_ERROR;
03833 }
03834
03835
03836 status = VMI_Slab_Save_State (slab, &state);
03837 if (!VMI_SUCCESS (status)) {
03838 free (data);
03839 return VMI_CONNECT_RESPONSE_ERROR;
03840 }
03841
03842
03843 status = VMI_Slab_Copy_Bytes (slab, size, data);
03844 if (!VMI_SUCCESS (status)) {
03845 VMI_Slab_Restore_State (slab, state);
03846 free (data);
03847 return VMI_CONNECT_RESPONSE_ERROR;
03848 }
03849
03850
03851 rank = ntohl (data->rank);
03852
03853 DEBUG_PRINT ("Accepting a connection request from rank %u.\n", rank);
03854
03855
03856 (&CMI_VMI_Processes[rank])->connection = connection;
03857 (&CMI_VMI_Processes[rank])->connection_state = CMI_VMI_CONNECTION_CONNECTED;
03858
03859
03860 VMI_CONNECT_SET_RECEIVE_CONTEXT (connection, (&CMI_VMI_Processes[rank]));
03861
03862
03863 status = VMI_RDMA_Set_Publish_Callback (connection, (VMIRDMABuffer) CMI_VMI_RDMA_Publish_Notification_Handler);
03864
03865
03866 status = VMI_RDMA_Set_Put_Notification_Callback (connection, CMI_VMI_RDMA_Put_Notification_Handler);
03867
03868
03869 status = VMI_RDMA_Set_Get_Notification_Callback (connection, CMI_VMI_RDMA_Get_Notification_Handler);
03870
03871
03872
03873 free (data);
03874
03875
03876 return VMI_CONNECT_RESPONSE_ACCEPT;
03877 }
03878
03879
03880
03881
03882
03883
03884
03885 void CMI_VMI_Connection_Response_Handler (PVOID context, PVOID response, USHORT size, PVOID handle, VMI_CONNECT_RESPONSE remote_status)
03886 {
03887 VMI_STATUS status;
03888
03889 CMI_VMI_Process_T *process;
03890
03891
03892 DEBUG_PRINT ("CMI_VMI_Connection_Response_Handler() called.\n");
03893
03894
03895 process = (CMI_VMI_Process_T *) context;
03896
03897 switch (remote_status)
03898 {
03899 case VMI_CONNECT_RESPONSE_ACCEPT:
03900 DEBUG_PRINT ("Process %d accepted connection.\n", process->rank);
03901
03902
03903 process->connection_state = CMI_VMI_CONNECTION_CONNECTED;
03904
03905 VMI_CONNECT_SET_RECEIVE_CONTEXT (process->connection, process);
03906
03907
03908 status = VMI_RDMA_Set_Publish_Callback (process->connection, CMI_VMI_RDMA_Publish_Notification_Handler);
03909
03910
03911 status = VMI_RDMA_Set_Put_Notification_Callback (process->connection, CMI_VMI_RDMA_Put_Notification_Handler);
03912
03913
03914 status = VMI_RDMA_Set_Get_Notification_Callback (process->connection, CMI_VMI_RDMA_Get_Notification_Handler);
03915
03916
03917 break;
03918
03919 case VMI_CONNECT_RESPONSE_REJECT:
03920 DEBUG_PRINT ("Process %d rejected connection.\n", process->rank);
03921
03922
03923 process->connection_state = CMI_VMI_CONNECTION_DISCONNECTED;
03924
03925 break;
03926
03927 case VMI_CONNECT_RESPONSE_ERROR:
03928 DEBUG_PRINT ("Error connecting to process %d [%d.%d.%d.%d].\n", process->rank, ((process->node_IP >> 0) & 0xFF),
03929 ((process->node_IP >> 8) & 0xFF),
03930 ((process->node_IP >> 16) & 0xFF),
03931 ((process->node_IP >> 24) & 0xFF));
03932
03933
03934 process->connection_state = CMI_VMI_CONNECTION_ERROR;
03935
03936 break;
03937
03938 default:
03939 DEBUG_PRINT ("Error connecting to process %d\n", process->rank);
03940 DEBUG_PRINT ("Error code 0x%08x\n", status);
03941
03942
03943 process->connection_state = CMI_VMI_CONNECTION_ERROR;
03944
03945 break;
03946 }
03947
03948
03949 VMI_Buffer_Deallocate ((PVMI_BUFFER) context);
03950 }
03951
03952
03953
03954
03955
03956
03957 int CMI_VMI_Close_Connections ()
03958 {
03959 VMI_STATUS status;
03960
03961 struct timeval tp;
03962 long start_time;
03963 long now_time;
03964 BOOLEAN pending;
03965
03966 int i;
03967
03968
03969 DEBUG_PRINT ("CMI_VMI_Close_Connections() called.\n");
03970
03971
03972 for (i = 0; i < _Cmi_mype; i++) {
03973 (&CMI_VMI_Processes[i])->connection_state = CMI_VMI_CONNECTION_DISCONNECTING;
03974
03975 status = VMI_Connection_Disconnect ((&CMI_VMI_Processes[i])->connection, CMI_VMI_Disconnection_Response_Handler, (PVOID) (&CMI_VMI_Processes[i]));
03976 CMI_VMI_CHECK_SUCCESS (status, "VMI_Connection_Disconnect()");
03977 }
03978
03979
03980 (&CMI_VMI_Processes[_Cmi_mype])->connection_state = CMI_VMI_CONNECTION_DISCONNECTED;
03981
03982
03983 gettimeofday (&tp, NULL);
03984 start_time = tp.tv_sec;
03985 now_time = tp.tv_sec;
03986 pending = TRUE;
03987
03988 while (pending && ((start_time + CMI_VMI_Connection_Timeout) > now_time)) {
03989 sched_yield ();
03990 status = VMI_Poll ();
03991 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
03992
03993 gettimeofday (&tp, NULL);
03994 now_time = tp.tv_sec;
03995
03996 pending = FALSE;
03997 for (i = 0; i < _Cmi_numpes; i++) {
03998 pending = (pending || ((&CMI_VMI_Processes[i])->connection_state != CMI_VMI_CONNECTION_DISCONNECTED));
03999 }
04000 }
04001
04002
04003 if (pending) {
04004 return (-1);
04005 }
04006
04007 return (0);
04008 }
04009
04010
04011
04012
04013
04014
04015
04016 void CMI_VMI_Disconnection_Handler (PVMI_CONNECT connection)
04017 {
04018 CMI_VMI_Process_T *process;
04019
04020
04021 DEBUG_PRINT ("CMI_VMI_Disconnection_Handler() called.\n");
04022
04023 process = (CMI_VMI_Process_T *) VMI_CONNECT_GET_RECEIVE_CONTEXT (connection);
04024 process->connection_state = CMI_VMI_CONNECTION_DISCONNECTED;
04025 }
04026
04027
04028
04029
04030
04031
04032
04033 void CMI_VMI_Disconnection_Response_Handler (PVMI_CONNECT connection, PVOID context, VMI_STATUS remote_status)
04034 {
04035 CMI_VMI_Process_T *process;
04036
04037
04038 DEBUG_PRINT ("CMI_VMI_Disconnection_Response_Handler() called.\n");
04039
04040 process = (CMI_VMI_Process_T *) context;
04041 process->connection_state = CMI_VMI_CONNECTION_DISCONNECTED;
04042 }
04043
04044
04045
04046
04047
04048
04049 void CMI_VMI_Reply_Latencies (int sourcerank)
04050 {
04051 VMI_STATUS status;
04052
04053 CMI_VMI_Latency_Vector_Reply_Message_T *reply_msg;
04054 int reply_msgsize;
04055
04056 PVMI_CACHE_ENTRY cacheentry;
04057
04058 PVMI_BUFFER bufHandles[1];
04059 PVOID addrs[1];
04060 ULONG sz[1];
04061
04062 CMI_VMI_Handle_T *handle;
04063
04064 int i;
04065
04066
04067 DEBUG_PRINT ("CMI_VMI_Reply_Latencies() called.\n");
04068
04069 reply_msgsize = CmiMsgHeaderSizeBytes + (_Cmi_numpes * sizeof (unsigned long));
04070 reply_msg = (CMI_VMI_Latency_Vector_Reply_Message_T *) CmiAlloc (reply_msgsize);
04071
04072 CMI_VMI_MESSAGE_TYPE (reply_msg) = CMI_VMI_MESSAGE_TYPE_LATENCY_VECTOR_REPLY;
04073 CMI_VMI_MESSAGE_CREDITS (reply_msg) = 0;
04074
04075 #if CMK_BROADCAST_SPANNING_TREE
04076 CMI_SET_BROADCAST_ROOT (reply_msg, 0);
04077 #endif
04078
04079 for (i = 0; i < _Cmi_numpes; i++) {
04080 if (i == _Cmi_mype) {
04081 reply_msg->latency[i] = 0;
04082 } else {
04083 reply_msg->latency[i] = VMI_CONNECT_ONE_WAY_LATENCY ((&CMI_VMI_Processes[i])->connection);
04084 }
04085 }
04086
04087 status = VMI_Cache_Register (reply_msg, reply_msgsize, &cacheentry);
04088 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
04089
04090 handle = CMI_VMI_Handle_Allocate ();
04091
04092
04093 handle->msg = (char *) reply_msg;
04094 handle->msgsize = reply_msgsize;
04095 handle->handle_type = CMI_VMI_HANDLE_TYPE_SEND;
04096 handle->data.send.send_handle_type = CMI_VMI_SEND_HANDLE_TYPE_STREAM;
04097 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_FREE;
04098 handle->data.send.data.stream.cacheentry = cacheentry;
04099
04100 bufHandles[0] = cacheentry->bufferHandle;
04101 addrs[0] = (PVOID) reply_msg;
04102 sz[0] = reply_msgsize;
04103
04104 handle->refcount += 1;
04105 CMI_VMI_AsyncMsgCount += 1;
04106
04107 status = VMI_Stream_Send ((&CMI_VMI_Processes[sourcerank])->connection, bufHandles, addrs, sz, 1, CMI_VMI_Stream_Completion_Handler, (PVOID) handle, TRUE);
04108 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send()");
04109 }
04110
04111
04112
04113
04114
04115
04116 void CMI_VMI_Compute_Cluster_Mapping ()
04117 {
04118 int i;
04119 int j;
04120 int cluster;
04121 BOOLEAN found_flag;
04122
04123
04124 DEBUG_PRINT ("CMI_VMI_Compute_Cluster_Mapping() called.\n");
04125
04126 for (i = 0; i < _Cmi_numpes; i++) {
04127 (&CMI_VMI_Processes[i])->cluster = CMI_VMI_CLUSTER_UNKNOWN;
04128 }
04129
04130 cluster = 0;
04131 for (i = 0; i < _Cmi_numpes; i++) {
04132 found_flag = FALSE;
04133 for (j = 0; j < _Cmi_numpes; j++) {
04134 if ((&CMI_VMI_Processes[i])->latency_vector[j] < CMI_VMI_WAN_Latency) {
04135 if ((&CMI_VMI_Processes[j])->cluster == CMI_VMI_CLUSTER_UNKNOWN) {
04136 (&CMI_VMI_Processes[j])->cluster = cluster;
04137 found_flag = TRUE;
04138 }
04139 }
04140 }
04141 if (found_flag) {
04142 cluster += 1;
04143 }
04144 }
04145 }
04146
04147
04148
04149
04150
04151
04152 void CMI_VMI_Distribute_Cluster_Mapping ()
04153 {
04154 VMI_STATUS status;
04155
04156 CMI_VMI_Cluster_Mapping_Message_T *mapping_msg;
04157 int mapping_msgsize;
04158
04159 PVMI_CACHE_ENTRY cacheentry;
04160
04161 PVMI_BUFFER bufHandles[1];
04162 PVOID addrs[1];
04163 ULONG sz[1];
04164
04165 CMI_VMI_Handle_T *handle;
04166
04167 int i;
04168
04169
04170 DEBUG_PRINT ("CMI_VMI_Distribute_Cluster_Mapping() called.\n");
04171
04172 mapping_msgsize = CmiMsgHeaderSizeBytes + (_Cmi_numpes * sizeof (int));
04173 mapping_msg = (CMI_VMI_Cluster_Mapping_Message_T *) CmiAlloc (mapping_msgsize);
04174
04175 CMI_VMI_MESSAGE_TYPE (mapping_msg) = CMI_VMI_MESSAGE_TYPE_CLUSTER_MAPPING;
04176 CMI_VMI_MESSAGE_CREDITS (mapping_msg) = 0;
04177
04178 #if CMK_BROADCAST_SPANNING_TREE
04179 CMI_SET_BROADCAST_ROOT (mapping_msg, 0);
04180 #endif
04181
04182 for (i = 0; i < _Cmi_numpes; i++) {
04183 mapping_msg->cluster[i] = (&CMI_VMI_Processes[i])->cluster;
04184 }
04185
04186 status = VMI_Cache_Register (mapping_msg, mapping_msgsize, &cacheentry);
04187 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
04188
04189 handle = CMI_VMI_Handle_Allocate ();
04190
04191
04192 handle->msg = (char *) mapping_msg;
04193 handle->msgsize = mapping_msgsize;
04194 handle->handle_type = CMI_VMI_HANDLE_TYPE_SEND;
04195 handle->data.send.send_handle_type = CMI_VMI_SEND_HANDLE_TYPE_STREAM;
04196 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_FREE;
04197 handle->data.send.data.stream.cacheentry = cacheentry;
04198
04199 bufHandles[0] = cacheentry->bufferHandle;
04200 addrs[0] = (PVOID) mapping_msg;
04201 sz[0] = mapping_msgsize;
04202
04203 handle->refcount += (_Cmi_numpes - 1);
04204 CMI_VMI_AsyncMsgCount += (_Cmi_numpes - 1);
04205
04206 for (i = 0; i < _Cmi_mype; i++) {
04207 status = VMI_Stream_Send ((&CMI_VMI_Processes[i])->connection, bufHandles, addrs, sz, 1, CMI_VMI_Stream_Completion_Handler, (PVOID) handle, TRUE);
04208 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send()");
04209 }
04210
04211 for (i = (_Cmi_mype + 1); i < _Cmi_numpes; i++) {
04212 status = VMI_Stream_Send ((&CMI_VMI_Processes[i])->connection, bufHandles, addrs, sz, 1, CMI_VMI_Stream_Completion_Handler, (PVOID) handle, TRUE);
04213 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send()");
04214 }
04215 }
04216
04217
04218
04219
04220
04221
04222 void CMI_VMI_Wait_Cluster_Mapping ()
04223 {
04224 VMI_STATUS status;
04225
04226
04227 DEBUG_PRINT ("CMI_VMI_Wait_Cluster_Mapping() called.\n");
04228
04229 while (!CMI_VMI_Cluster_Mapping_Received) {
04230 status = VMI_Poll ();
04231 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
04232 }
04233 }
04234
04235
04236
04237
04238
04239
04240 void *CMI_VMI_CmiAlloc (int request_size)
04241 {
04242 VMI_STATUS status;
04243
04244 int size;
04245 void *ptr;
04246
04247
04248 DEBUG_PRINT ("CMI_VMI_CmiAlloc() called.\n");
04249
04250 if (CMI_VMI_Eager_Protocol) {
04251 size = request_size + (sizeof (CMI_VMI_Memory_Chunk_T) - sizeof (CmiChunkHeader));
04252 } else {
04253 size = request_size;
04254 }
04255
04256 if (CMI_VMI_Memory_Pool) {
04257 if (size <= CMI_VMI_BUCKET1_SIZE) {
04258 status = VMI_Pool_Allocate_Buffer (CMI_VMI_Bucket1_Pool, &ptr, NULL);
04259 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Allocate_Buffer()");
04260 } else if (size <= CMI_VMI_BUCKET2_SIZE) {
04261 status = VMI_Pool_Allocate_Buffer (CMI_VMI_Bucket2_Pool, &ptr, NULL);
04262 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Allocate_Buffer()");
04263 } else if (size <= CMI_VMI_BUCKET3_SIZE) {
04264 status = VMI_Pool_Allocate_Buffer (CMI_VMI_Bucket3_Pool, &ptr, NULL);
04265 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Allocate_Buffer()");
04266 } else if (size <= CMI_VMI_BUCKET4_SIZE) {
04267 status = VMI_Pool_Allocate_Buffer (CMI_VMI_Bucket4_Pool, &ptr, NULL);
04268 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Allocate_Buffer()");
04269 } else if (size <= CMI_VMI_BUCKET5_SIZE) {
04270 status = VMI_Pool_Allocate_Buffer (CMI_VMI_Bucket5_Pool, &ptr, NULL);
04271 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Allocate_Buffer()");
04272 } else {
04273 ptr = malloc (size);
04274 }
04275 } else {
04276 ptr = malloc (size);
04277 }
04278
04279 if (CMI_VMI_Eager_Protocol) {
04280 ptr += sizeof (CMI_VMI_Memory_Chunk_T);
04281 CONTEXTFIELD (ptr) = NULL;
04282
04283 ptr -= sizeof (CmiChunkHeader);
04284 }
04285
04286 return (ptr);
04287 }
04288
04289
04290
04291
04292
04293
04294 void CMI_VMI_CmiFree (void *ptr)
04295 {
04296 VMI_STATUS status;
04297
04298 int size;
04299
04300 void *context;
04301
04302 CMI_VMI_Process_T *process;
04303 CMI_VMI_Handle_T *handle;
04304
04305 CMI_VMI_Eager_Short_Slot_Footer_T *footer;
04306 int sender_rank;
04307 int credits_temp;
04308 int index;
04309
04310 PVMI_CACHE_ENTRY cacheentry;
04311 char *publish_buffer;
04312 int buffer_size;
04313
04314 CMI_VMI_Publish_Message_T publish_msg;
04315
04316
04317 DEBUG_PRINT ("CMI_VMI_CmiFree() called.\n");
04318
04319 ptr += sizeof (CmiChunkHeader);
04320
04321 if (CMI_VMI_Eager_Protocol) {
04322 size = SIZEFIELD (ptr) + sizeof (CMI_VMI_Memory_Chunk_T);
04323 context = CONTEXTFIELD (ptr);
04324 } else {
04325 size = SIZEFIELD (ptr) + sizeof (CmiChunkHeader);
04326 context = NULL;
04327 }
04328
04329 if (context) {
04330 handle = (CMI_VMI_Handle_T *) context;
04331
04332 if (handle->data.receive.receive_handle_type == CMI_VMI_RECEIVE_HANDLE_TYPE_EAGER_SHORT) {
04333 sender_rank = handle->data.receive.data.eager_short.sender_rank;
04334 process = &CMI_VMI_Processes[sender_rank];
04335
04336 footer = handle->data.receive.data.eager_short.footer;
04337 footer->sentinel = CMI_VMI_EAGER_SHORT_SENTINEL_FREE;
04338
04339 credits_temp = 0;
04340 index = process->eager_short_receive_dirty;
04341 handle = process->eager_short_receive_handles[index];
04342 footer = handle->data.receive.data.eager_short.footer;
04343 while (footer->sentinel == CMI_VMI_EAGER_SHORT_SENTINEL_FREE) {
04344 footer->sentinel = CMI_VMI_EAGER_SHORT_SENTINEL_READY;
04345 credits_temp += 1;
04346
04347 index = (index + 1) % process->eager_short_receive_size;
04348 handle = process->eager_short_receive_handles[index];
04349 footer = handle->data.receive.data.eager_short.footer;
04350 }
04351
04352 process->eager_short_receive_dirty = index;
04353 process->eager_short_receive_credits_replentish += credits_temp;
04354 } else {
04355 sender_rank = handle->data.receive.data.eager_long.sender_rank;
04356 process = &CMI_VMI_Processes[sender_rank];
04357
04358 publish_buffer = handle->msg;
04359 buffer_size = handle->data.receive.data.eager_long.maxsize;
04360 cacheentry = handle->data.receive.data.eager_long.cacheentry;
04361
04362 handle->data.receive.data.eager_long.publishes_pending = 1;
04363
04364
04365 publish_msg.type = CMI_VMI_PUBLISH_TYPE_EAGER_LONG;
04366
04367
04368
04369
04370
04371
04372
04373 status = VMI_RDMA_Publish_Buffer (process->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) publish_buffer,
04374 (UINT32) buffer_size, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index,
04375 (PVOID) &publish_msg, (ULONG) sizeof (CMI_VMI_Publish_Message_T));
04376 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer()");
04377 }
04378 } else {
04379 if (CMI_VMI_Eager_Protocol) {
04380 ptr -= sizeof (CMI_VMI_Memory_Chunk_T);
04381 } else {
04382 ptr -= sizeof (CmiChunkHeader);
04383 }
04384
04385 if (CMI_VMI_Memory_Pool) {
04386 if (size <= CMI_VMI_BUCKET1_SIZE) {
04387 status = VMI_Pool_Deallocate_Buffer (CMI_VMI_Bucket1_Pool, ptr);
04388 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Deallocate_Buffer()");
04389 } else if (size <= CMI_VMI_BUCKET2_SIZE) {
04390 status = VMI_Pool_Deallocate_Buffer (CMI_VMI_Bucket2_Pool, ptr);
04391 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Deallocate_Buffer()");
04392 } else if (size <= CMI_VMI_BUCKET3_SIZE) {
04393 status = VMI_Pool_Deallocate_Buffer (CMI_VMI_Bucket3_Pool, ptr);
04394 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Deallocate_Buffer()");
04395 } else if (size <= CMI_VMI_BUCKET4_SIZE) {
04396 status = VMI_Pool_Deallocate_Buffer (CMI_VMI_Bucket4_Pool, ptr);
04397 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Deallocate_Buffer()");
04398 } else if (size <= CMI_VMI_BUCKET5_SIZE) {
04399 status = VMI_Pool_Deallocate_Buffer (CMI_VMI_Bucket5_Pool, ptr);
04400 CMI_VMI_CHECK_SUCCESS (status, "VMI_Pool_Deallocate_Buffer()");
04401 } else {
04402 free (ptr);
04403 }
04404 } else {
04405 free (ptr);
04406 }
04407 }
04408 }
04409
04410
04411
04412
04413
04414
04415 PVMI_CACHE_ENTRY CMI_VMI_CacheEntry_From_Context (void *context)
04416 {
04417 CMI_VMI_Handle_T *handle;
04418
04419
04420 DEBUG_PRINT ("CMI_VMI_CacheEntry_From_Context() called.\n");
04421
04422 handle = (CMI_VMI_Handle_T *) context;
04423
04424 switch (handle->data.receive.receive_handle_type)
04425 {
04426 case CMI_VMI_RECEIVE_HANDLE_TYPE_EAGER_SHORT:
04427 return (handle->data.receive.data.eager_short.cacheentry);
04428 break;
04429
04430 case CMI_VMI_RECEIVE_HANDLE_TYPE_EAGER_LONG:
04431 return (handle->data.receive.data.eager_long.cacheentry);
04432 break;
04433
04434 default:
04435 CmiAbort ("CMI_VMI_CacheEntry_From_Context() called on invalid handle type.");
04436 break;
04437 }
04438 }
04439
04440
04441
04442
04443
04444
04445 CMI_VMI_Handle_T *CMI_VMI_Handle_Allocate ()
04446 {
04447 VMI_STATUS status;
04448
04449 int i;
04450 int j;
04451
04452
04453 DEBUG_PRINT ("CMI_VMI_Handle_Allocate() called.\n");
04454
04455 i = CMI_VMI_Next_Handle;
04456 j = CMI_VMI_Next_Handle;
04457 while ((&CMI_VMI_Handles[i])->refcount > 0) {
04458 i = ((i + 1) % CMI_VMI_Maximum_Handles);
04459
04460 if (i == j) {
04461 i = CMI_VMI_Maximum_Handles;
04462 CMI_VMI_Maximum_Handles *= 2;
04463 CMI_VMI_Handles = (CMI_VMI_Handle_T *) realloc (CMI_VMI_Handles, CMI_VMI_Maximum_Handles * sizeof (CMI_VMI_Handle_T));
04464 for (j = i; j < CMI_VMI_Maximum_Handles; j++) {
04465 (&CMI_VMI_Handles[j])->index = j;
04466 (&CMI_VMI_Handles[j])->refcount = 0;
04467 }
04468 }
04469 }
04470
04471 (&CMI_VMI_Handles[i])->refcount = 1;
04472
04473 CMI_VMI_Next_Handle = ((i + 1) % CMI_VMI_Maximum_Handles);
04474
04475 return (&CMI_VMI_Handles[i]);
04476 }
04477
04478
04479
04480
04481
04482
04483 void CMI_VMI_Handle_Deallocate (CMI_VMI_Handle_T *handle)
04484 {
04485 DEBUG_PRINT ("CMI_VMI_Handle_Deallocate() called.\n");
04486
04487 handle->refcount = 0;
04488 }
04489
04490
04491
04492
04493
04494
04495 void CMI_VMI_Eager_Short_Setup (int sender_rank)
04496 {
04497 VMI_STATUS status;
04498
04499 CMI_VMI_Process_T *process;
04500 CMI_VMI_Handle_T *handle;
04501
04502 int slot_size;
04503 int buffer_size;
04504 int i;
04505 int index;
04506
04507 char *publish_buffer;
04508 char *eager_buffer;
04509
04510 PVMI_CACHE_ENTRY cacheentry;
04511
04512 CMI_VMI_Eager_Short_Slot_Footer_T *footer;
04513
04514 CMI_VMI_Publish_Message_T publish_msg;
04515
04516
04517 DEBUG_PRINT ("CMI_VMI_Eager_Short_Setup() called.\n");
04518
04519
04520 process = &CMI_VMI_Processes[sender_rank];
04521
04522
04523 slot_size = sizeof (CMI_VMI_Memory_Chunk_T) + CMI_VMI_Eager_Short_Message_Boundary + sizeof (CMI_VMI_Eager_Short_Slot_Footer_T);
04524 buffer_size = CMI_VMI_Eager_Short_Slots * slot_size;
04525
04526
04527 publish_buffer = CmiAlloc (buffer_size);
04528
04529
04530 status = VMI_Cache_Register (publish_buffer, buffer_size, &cacheentry);
04531 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
04532
04533
04534 for (i = 0; i < CMI_VMI_Eager_Short_Slots; i++) {
04535 handle = CMI_VMI_Handle_Allocate ();
04536
04537 eager_buffer = publish_buffer + (slot_size * i);
04538 footer = (CMI_VMI_Eager_Short_Slot_Footer_T *) (eager_buffer + sizeof (CMI_VMI_Memory_Chunk_T) + CMI_VMI_Eager_Short_Message_Boundary);
04539
04540 handle->refcount += 1;
04541 handle->msg = NULL;
04542 handle->msgsize = -1;
04543 handle->handle_type = CMI_VMI_HANDLE_TYPE_RECEIVE;
04544 handle->data.receive.receive_handle_type = CMI_VMI_RECEIVE_HANDLE_TYPE_EAGER_SHORT;
04545 handle->data.receive.data.eager_short.sender_rank = sender_rank;
04546 handle->data.receive.data.eager_short.publish_buffer = publish_buffer;
04547 handle->data.receive.data.eager_short.cacheentry = cacheentry;
04548 handle->data.receive.data.eager_short.eager_buffer = eager_buffer;
04549 handle->data.receive.data.eager_short.footer = footer;
04550
04551 footer->msgsize = -1;
04552 footer->sentinel = CMI_VMI_EAGER_SHORT_SENTINEL_READY;
04553
04554 index = process->eager_short_receive_size;
04555 process->eager_short_receive_handles[index] = handle;
04556 process->eager_short_receive_size += 1;
04557 }
04558
04559
04560 index = CMI_VMI_Eager_Short_Pollset_Size;
04561 CMI_VMI_Eager_Short_Pollset[index] = &CMI_VMI_Processes[sender_rank];
04562 CMI_VMI_Eager_Short_Pollset_Size += 1;
04563
04564
04565 publish_msg.type = CMI_VMI_PUBLISH_TYPE_EAGER_SHORT;
04566
04567 handle->data.receive.data.eager_short.publishes_pending = 1;
04568
04569
04570 #if CMI_VMI_USE_VMI22
04571 status = VMI_RDMA_Publish_Buffer_With_Callback (process->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) publish_buffer,
04572 (UINT32) buffer_size, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) 0, (PVOID) &publish_msg,
04573 (ULONG) sizeof (CMI_VMI_Publish_Message_T), (PVOID) handle, CMI_VMI_RDMA_Publish_Completion_Handler);
04574 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer_With_Callback()");
04575
04576 while (handle->data.receive.data.eager_short.publishes_pending > 0) {
04577 sched_yield ();
04578 status = VMI_Poll ();
04579 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
04580 }
04581 #else
04582 status = VMI_RDMA_Publish_Buffer (process->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) publish_buffer,
04583 (UINT32) buffer_size, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) 0, (PVOID) &publish_msg,
04584 (ULONG) sizeof (CMI_VMI_Publish_Message_T));
04585 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer()");
04586 #endif
04587 }
04588
04589
04590
04591
04592
04593
04594 void CMI_VMI_Eager_Long_Setup (int sender_rank, int maxsize)
04595 {
04596 VMI_STATUS status;
04597
04598 CMI_VMI_Process_T *process;
04599 CMI_VMI_Handle_T *handle;
04600
04601 int i;
04602 int index;
04603
04604 char *publish_buffer;
04605
04606 PVMI_CACHE_ENTRY cacheentry;
04607
04608 CMI_VMI_Publish_Message_T publish_msg;
04609
04610
04611 DEBUG_PRINT ("CMI_VMI_Eager_Long_Setup() called.\n");
04612
04613
04614 process = &CMI_VMI_Processes[sender_rank];
04615
04616 for (i = 0; i < CMI_VMI_Eager_Long_Buffers; i++) {
04617 publish_buffer = CmiAlloc (maxsize);
04618
04619 status = VMI_Cache_Register (publish_buffer, maxsize, &cacheentry);
04620 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
04621
04622 handle = CMI_VMI_Handle_Allocate ();
04623
04624 handle->refcount += 1;
04625 handle->msg = publish_buffer;
04626 handle->msgsize = -1;
04627 handle->handle_type = CMI_VMI_HANDLE_TYPE_RECEIVE;
04628 handle->data.receive.receive_handle_type = CMI_VMI_RECEIVE_HANDLE_TYPE_EAGER_LONG;
04629 handle->data.receive.data.eager_long.sender_rank = sender_rank;
04630 handle->data.receive.data.eager_long.maxsize = maxsize;
04631 handle->data.receive.data.eager_long.cacheentry = cacheentry;
04632
04633 index = process->eager_long_receive_size;
04634 process->eager_long_receive_handles[index] = handle;
04635 process->eager_long_receive_size += 1;
04636
04637
04638 publish_msg.type = CMI_VMI_PUBLISH_TYPE_EAGER_LONG;
04639
04640 handle->data.receive.data.eager_long.publishes_pending = 1;
04641
04642
04643 #if CMI_VMI_USE_VMI22
04644 status = VMI_RDMA_Publish_Buffer_With_Callback (process->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) publish_buffer,
04645 (UINT32) maxsize, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
04646 (ULONG) sizeof (CMI_VMI_Publish_Message_T), (PVOID) handle, CMI_VMI_RDMA_Publish_Completion_Handler);
04647 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer_With_Callback()");
04648
04649 while (handle->data.receive.data.eager_long.publishes_pending > 0) {
04650 sched_yield ();
04651 status = VMI_Poll ();
04652 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
04653 }
04654 #else
04655 status = VMI_RDMA_Publish_Buffer (process->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) publish_buffer,
04656 (UINT32) maxsize, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index,
04657 (PVOID) &publish_msg, (ULONG) sizeof (CMI_VMI_Publish_Message_T));
04658 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer()");
04659 #endif
04660 }
04661 }
04662
04663
04664
04665
04666
04667
04668
04669
04670
04671 VMI_RECV_STATUS CMI_VMI_Stream_Notification_Handler (PVMI_CONNECT connection, PVMI_STREAM_RECV stream, VMI_STREAM_COMMAND command, PVOID context, PVMI_SLAB slab)
04672 {
04673 VMI_STATUS status;
04674
04675 ULONG msgsize;
04676 char *msg;
04677 PVMI_SLAB_STATE state;
04678
04679 CMI_VMI_Process_T *process;
04680
04681
04682 DEBUG_PRINT ("CMI_VMI_Stream_Notification_Handler() called.\n");
04683
04684
04685 status = VMI_Slab_Save_State (slab, &state);
04686 CMI_VMI_CHECK_SUCCESS (status, "VMI_Slab_Save_State()");
04687
04688 msgsize = VMI_SLAB_BYTES_REMAINING (slab);
04689
04690 msg = CmiAlloc (msgsize);
04691
04692
04693 status = VMI_Slab_Copy_Bytes (slab, msgsize, msg);
04694 CMI_VMI_CHECK_SUCCESS (status, "VMI_Slab_Copy_Bytes()");
04695
04696
04697 status = VMI_Slab_Restore_State (slab, state);
04698 CMI_VMI_CHECK_SUCCESS (status, "VMI_Slab_Restore_State()");
04699
04700 process = (CMI_VMI_Process_T *) VMI_CONNECT_GET_RECEIVE_CONTEXT (connection);
04701 process->normal_short_count += 1;
04702 CMI_VMI_Message_Receive_Count += 1;
04703
04704 CMI_VMI_Common_Receive (process->rank, msgsize, msg);
04705
04706
04707 return (VMI_SLAB_DONE);
04708 }
04709
04710
04711
04712
04713
04714
04715
04716
04717
04718 void CMI_VMI_Stream_Completion_Handler (PVOID context, VMI_STATUS remote_status)
04719 {
04720 VMI_STATUS status;
04721
04722 CMI_VMI_Handle_T *handle;
04723
04724 void *mem_context;
04725
04726
04727 DEBUG_PRINT ("CMI_VMI_Stream_Completion_Handler() called.\n");
04728
04729 handle = (CMI_VMI_Handle_T *) context;
04730
04731 CMI_VMI_AsyncMsgCount -= 1;
04732 handle->refcount -= 1;
04733
04734 if (handle->refcount <= 1) {
04735 if (CMI_VMI_Eager_Protocol) {
04736 mem_context = CONTEXTFIELD (handle->msg);
04737 if (!mem_context) {
04738 status = VMI_Cache_Deregister (handle->data.send.data.stream.cacheentry);
04739 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Deregister()");
04740 }
04741 } else {
04742 mem_context = NULL;
04743 status = VMI_Cache_Deregister (handle->data.send.data.stream.cacheentry);
04744 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Deregister()");
04745 }
04746
04747 if (handle->data.send.message_disposition == CMI_VMI_MESSAGE_DISPOSITION_FREE) {
04748 CmiFree (handle->msg);
04749 }
04750
04751 #if CMK_BROADCAST_SPANNING_TREE
04752 if (handle->data.send.message_disposition == CMI_VMI_MESSAGE_DISPOSITION_ENQUEUE) {
04753 CdsFifo_Enqueue (CpvAccess (CMI_VMI_RemoteQueue), handle->msg);
04754 }
04755 #endif
04756
04757 CMI_VMI_Handle_Deallocate (handle);
04758 }
04759 }
04760
04761
04762
04763
04764
04765
04766
04767
04768
04769
04770
04771
04772
04773
04774
04775
04776
04777 void CMI_VMI_RDMA_Publish_Notification_Handler (PVMI_CONNECT connection, PVMI_REMOTE_BUFFER remote_buffer, PVMI_SLAB publish_data, ULONG publish_data_size)
04778 {
04779 VMI_STATUS status;
04780
04781 CMI_VMI_Handle_T *handle;
04782 PVMI_CACHE_ENTRY cacheentry;
04783 PVMI_RDMA_OP rdmaop;
04784 ULONG msgsize;
04785 char *msg;
04786
04787 PVMI_BUFFER_OP msgop;
04788 CMI_VMI_Publish_Message_T *publish_msg;
04789
04790 CMI_VMI_Process_T *process;
04791 int slot_size;
04792 int i;
04793 int offset;
04794 int index;
04795
04796
04797 DEBUG_PRINT ("CMI_VMI_RDMA_Publish_Notification_Handler() called.\n");
04798
04799 process = (CMI_VMI_Process_T *) VMI_CONNECT_GET_RECEIVE_CONTEXT (connection);
04800
04801 msgop = VMI_SLAB_GET_BUFFEROPS (publish_data);
04802 publish_msg = (CMI_VMI_Publish_Message_T *) VMI_BUFFEROP_GET_ADDRESS (msgop);
04803
04804 switch (publish_msg->type)
04805 {
04806 case CMI_VMI_PUBLISH_TYPE_GET:
04807 msgsize = remote_buffer->rsz;
04808 msg = CmiAlloc (msgsize);
04809
04810 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
04811 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
04812
04813 status = VMI_RDMA_Alloc_Op (&rdmaop);
04814 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Alloc_Op()");
04815
04816 rdmaop->numBufs = 1;
04817 rdmaop->buffers[0] = cacheentry->bufferHandle;
04818 rdmaop->addr[0] = msg;
04819 rdmaop->sz[0] = msgsize;
04820 rdmaop->rbuffer = remote_buffer;
04821 rdmaop->roffset = 0;
04822 rdmaop->notify = TRUE;
04823
04824 handle = CMI_VMI_Handle_Allocate ();
04825
04826 handle->refcount += 1;
04827 handle->msg = msg;
04828 handle->msgsize = msgsize;
04829 handle->handle_type = CMI_VMI_HANDLE_TYPE_RECEIVE;
04830 handle->data.receive.receive_handle_type = CMI_VMI_RECEIVE_HANDLE_TYPE_RDMAGET;
04831 handle->data.receive.data.rdmaget.cacheentry = cacheentry;
04832 handle->data.receive.data.rdmaget.process = (void *) process;
04833
04834 status = VMI_RDMA_Get (connection, rdmaop, (PVOID) handle, CMI_VMI_RDMA_Get_Completion_Handler);
04835 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Get()");
04836
04837 break;
04838
04839 case CMI_VMI_PUBLISH_TYPE_EAGER_SHORT:
04840 slot_size = sizeof (CMI_VMI_Memory_Chunk_T) + CMI_VMI_Eager_Short_Message_Boundary + sizeof (CMI_VMI_Eager_Short_Slot_Footer_T);
04841
04842 for (i = 0; i < CMI_VMI_Eager_Short_Slots; i++) {
04843 offset = (i * slot_size) + sizeof (CMI_VMI_Memory_Chunk_T);
04844
04845 msg = CmiAlloc (CMI_VMI_Eager_Short_Message_Boundary + sizeof (CMI_VMI_Eager_Short_Slot_Footer_T));
04846
04847 status = VMI_Cache_Register (msg, CMI_VMI_Eager_Short_Message_Boundary + sizeof (CMI_VMI_Eager_Short_Slot_Footer_T), &cacheentry);
04848 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
04849
04850 status = VMI_RDMA_Alloc_Op (&rdmaop);
04851 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Alloc_Op()");
04852
04853 handle = CMI_VMI_Handle_Allocate ();
04854
04855 handle->refcount += 1;
04856 handle->msg = msg;
04857 handle->msgsize = -1;
04858 handle->handle_type = CMI_VMI_HANDLE_TYPE_SEND;
04859 handle->data.send.send_handle_type = CMI_VMI_SEND_HANDLE_TYPE_EAGER_SHORT;
04860 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_NONE;
04861 handle->data.send.data.eager_short.remote_buffer = remote_buffer;
04862 handle->data.send.data.eager_short.offset = offset;
04863 handle->data.send.data.eager_short.cacheentry = cacheentry;
04864 handle->data.send.data.eager_short.rdmaop = rdmaop;
04865
04866 index = process->eager_short_send_size;
04867 process->eager_short_send_handles[index] = handle;
04868 process->eager_short_send_size += 1;
04869 process->eager_short_send_credits_available += 1;
04870 }
04871
04872 break;
04873
04874 case CMI_VMI_PUBLISH_TYPE_EAGER_LONG:
04875 handle = CMI_VMI_Handle_Allocate ();
04876
04877 handle->refcount += 1;
04878 handle->msg = NULL;
04879 handle->msgsize = -1;
04880 handle->handle_type = CMI_VMI_HANDLE_TYPE_SEND;
04881 handle->data.send.send_handle_type = CMI_VMI_SEND_HANDLE_TYPE_EAGER_LONG;
04882 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_NONE;
04883 handle->data.send.data.eager_long.maxsize = remote_buffer->rsz;
04884 handle->data.send.data.eager_long.remote_buffer = remote_buffer;
04885 handle->data.send.data.eager_long.cacheentry = NULL;
04886
04887 index = process->eager_long_send_size;
04888 process->eager_long_send_handles[index] = handle;
04889 process->eager_long_send_size += 1;
04890
04891 break;
04892 }
04893 }
04894
04895
04896
04897
04898
04899
04900 void CMI_VMI_RDMA_Publish_Completion_Handler (PVOID context, VMI_STATUS remote_status)
04901 {
04902 CMI_VMI_Handle_T *handle;
04903
04904
04905 DEBUG_PRINT ("CMI_VMI_RDMA_Publish_Completion_Handler() called.\n");
04906
04907 handle = (CMI_VMI_Handle_T *) context;
04908
04909 if (handle->handle_type == CMI_VMI_HANDLE_TYPE_SEND) {
04910 if (handle->data.send.send_handle_type == CMI_VMI_SEND_HANDLE_TYPE_RDMAGET) {
04911 handle->data.send.data.rdmaget.publishes_pending -= 1;
04912 } else {
04913 handle->data.send.data.rdmabroadcast.publishes_pending -= 1;
04914 }
04915 } else {
04916 if (handle->data.receive.receive_handle_type == CMI_VMI_RECEIVE_HANDLE_TYPE_EAGER_SHORT) {
04917 handle->data.receive.data.eager_short.publishes_pending -= 1;
04918 } else {
04919 handle->data.receive.data.eager_long.publishes_pending -= 1;
04920 }
04921 }
04922 }
04923
04924
04925
04926
04927
04928
04929 void CMI_VMI_RDMA_Put_Notification_Handler (PVMI_CONNECT connection, UINT32 rdma_size, UINT32 context, VMI_STATUS remote_status)
04930 {
04931 VMI_STATUS status;
04932
04933 CMI_VMI_Handle_T *handle;
04934 CMI_VMI_Process_T *process;
04935
04936 PVMI_CACHE_ENTRY cacheentry;
04937 PVMI_RDMA_OP rdmaop;
04938
04939 char *publish_buffer;
04940
04941 CMI_VMI_Publish_Message_T publish_msg;
04942
04943 int buffer_size;
04944
04945 char *msg;
04946
04947
04948 DEBUG_PRINT ("CMI_VMI_RDMA_Put_Notification_Handler() called.\n");
04949
04950
04951 handle = &CMI_VMI_Handles[context];
04952
04953 msg = handle->msg;
04954 SIZEFIELD (msg) = rdma_size;
04955 REFFIELD (msg) = 1;
04956 CONTEXTFIELD (msg) = handle;
04957
04958 process = (CMI_VMI_Process_T *) VMI_CONNECT_GET_RECEIVE_CONTEXT (connection);
04959 process->eager_long_count += 1;
04960 CMI_VMI_Message_Receive_Count += 1;
04961
04962
04963 CMI_VMI_Common_Receive (process->rank, rdma_size, msg);
04964 }
04965
04966
04967
04968
04969
04970
04971 void CMI_VMI_RDMA_Put_Completion_Handler (PVMI_RDMA_OP rdmaop, PVOID context, VMI_STATUS remote_status)
04972 {
04973 VMI_STATUS status;
04974
04975 CMI_VMI_Handle_T *handle;
04976
04977 void *mem_context;
04978
04979
04980 DEBUG_PRINT ("CMI_VMI_RDMA_Put_Completion_Handler() called.\n");
04981
04982 handle = (CMI_VMI_Handle_T *) context;
04983
04984 CMI_VMI_AsyncMsgCount -= 1;
04985 handle->refcount -= 1;
04986
04987 status = VMI_RDMA_Dealloc_Buffer (rdmaop->rbuffer);
04988 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Dealloc_Buffer()");
04989
04990 status = VMI_RDMA_Dealloc_Op (rdmaop);
04991 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Dealloc_Op()");
04992
04993 if (handle->refcount <= 1) {
04994
04995 mem_context = CONTEXTFIELD (handle->msg);
04996 if (!mem_context) {
04997 status = VMI_Cache_Deregister (handle->data.send.data.eager_long.cacheentry);
04998 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Deregister()");
04999 }
05000
05001 if (handle->data.send.message_disposition == CMI_VMI_MESSAGE_DISPOSITION_FREE) {
05002 CmiFree (handle->msg);
05003 }
05004
05005 CMI_VMI_Handle_Deallocate (handle);
05006 }
05007 }
05008
05009
05010
05011
05012
05013
05014
05015
05016
05017 void CMI_VMI_RDMA_Get_Notification_Handler (PVMI_CONNECT connection, UINT32 context, VMI_STATUS remote_status)
05018 {
05019 VMI_STATUS status;
05020
05021 CMI_VMI_Handle_T *handle;
05022
05023 void *mem_context;
05024
05025
05026 DEBUG_PRINT ("CMI_VMI_RDMA_Get_Notification_Handler() called.\n");
05027
05028 handle = &(CMI_VMI_Handles[context]);
05029
05030 if (CMI_VMI_Eager_Protocol) {
05031 mem_context = CONTEXTFIELD (handle->msg);
05032 if (!mem_context) {
05033 status = VMI_Cache_Deregister (handle->data.send.data.rdmaget.cacheentry);
05034 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Deregister()");
05035 }
05036 } else {
05037 mem_context = NULL;
05038 status = VMI_Cache_Deregister (handle->data.send.data.rdmaget.cacheentry);
05039 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Deregister()");
05040 }
05041
05042 handle->refcount -= 1;
05043 CMI_VMI_AsyncMsgCount -= 1;
05044
05045 if (handle->refcount <= 1) {
05046 if (handle->data.send.message_disposition == CMI_VMI_MESSAGE_DISPOSITION_FREE) {
05047 CmiFree (handle->msg);
05048 }
05049
05050 #if CMK_BROADCAST_SPANNING_TREE
05051 if (handle->data.send.message_disposition == CMI_VMI_MESSAGE_DISPOSITION_ENQUEUE) {
05052 CdsFifo_Enqueue (CpvAccess (CMI_VMI_RemoteQueue), handle->msg);
05053 }
05054 #endif
05055
05056 CMI_VMI_Handle_Deallocate (handle);
05057 }
05058 }
05059
05060
05061
05062
05063
05064
05065 void CMI_VMI_RDMA_Get_Completion_Handler (PVMI_RDMA_OP rdmaop, PVOID context, VMI_STATUS remote_status)
05066 {
05067 VMI_STATUS status;
05068
05069 ULONG msgsize;
05070 char *msg;
05071
05072 CMI_VMI_Handle_T *handle;
05073 CMI_VMI_Process_T *process;
05074
05075 int credits_temp;
05076
05077
05078 DEBUG_PRINT ("CMI_VMI_RDMA_Get_Completion_Handler() called.\n");
05079
05080 handle = (CMI_VMI_Handle_T *) context;
05081
05082 msg = handle->msg;
05083 msgsize = handle->msgsize;
05084
05085 status = VMI_Cache_Deregister (handle->data.receive.data.rdmaget.cacheentry);
05086 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Deregister()");
05087
05088 status = VMI_RDMA_Dealloc_Buffer (rdmaop->rbuffer);
05089 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Dealloc_Buffer()");
05090
05091 status = VMI_RDMA_Dealloc_Op (rdmaop);
05092 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Dealloc_Op()");
05093
05094 process = (CMI_VMI_Process_T *) handle->data.receive.data.rdmaget.process;
05095 process->normal_long_count += 1;
05096 CMI_VMI_Message_Receive_Count += 1;
05097
05098 #ifdef GK_DELAY_DEVICE
05099 if (CmiGetCluster (_Cmi_mype) == CmiGetCluster (process->rank)) {
05100 CMI_VMI_Common_Receive (process->rank, msgsize, msg);
05101 } else {
05102 struct timeval gk_tv;
05103 double gk_time_now;
05104 gk_delayed_msgs *gk_new_node;
05105
05106 gettimeofday (&gk_tv, NULL);
05107 gk_time_now = gk_tv.tv_sec + (gk_tv.tv_usec * 0.000001);
05108
05109 gk_new_node = malloc (sizeof (gk_delayed_msgs));
05110 gk_new_node->time = gk_time_now;
05111 gk_new_node->msg = msg;
05112 gk_new_node->msgsize = msgsize;
05113 gk_new_node->sender = process->rank;
05114 gk_new_node->next = NULL;
05115
05116 if (gk_head_ptr2) {
05117 gk_tail_ptr2->next = gk_new_node;
05118 gk_tail_ptr2 = gk_new_node;
05119 } else {
05120 gk_head_ptr2 = gk_new_node;
05121 gk_tail_ptr2 = gk_new_node;
05122 }
05123 }
05124 #else
05125 CMI_VMI_Common_Receive (process->rank, msgsize, msg);
05126 #endif
05127
05128 CMI_VMI_Handle_Deallocate (handle);
05129 }
05130
05131
05132
05133 #if CMK_BROADCAST_SPANNING_TREE
05134
05135
05136
05137
05138 int CMI_VMI_Spanning_Children_Count (char *msg)
05139 {
05140 int startrank;
05141 int destrank;
05142 int childcount;
05143
05144 int i;
05145
05146
05147 DEBUG_PRINT ("CMI_VMI_Spanning_Children_Count() called.\n");
05148
05149 childcount = 0;
05150
05151 startrank = CMI_BROADCAST_ROOT (msg) - 1;
05152 for (i = 1; i <= CMI_VMI_BROADCAST_SPANNING_FACTOR; i++) {
05153 destrank = _Cmi_mype - startrank;
05154
05155 if (destrank < 0) {
05156 destrank += _Cmi_numpes;
05157 }
05158
05159 destrank = CMI_VMI_BROADCAST_SPANNING_FACTOR * destrank + i;
05160
05161 if (destrank > (_Cmi_numpes - 1)) {
05162 break;
05163 }
05164
05165 destrank += startrank;
05166 destrank %= _Cmi_numpes;
05167
05168 childcount++;
05169 }
05170
05171 return (childcount);
05172 }
05173
05174
05175
05176
05177
05178
05179 void CMI_VMI_Send_Spanning_Children (int msgsize, char *msg)
05180 {
05181 VMI_STATUS status;
05182
05183 PVMI_BUFFER bufHandles[1];
05184 PVOID addrs[1];
05185 ULONG sz[1];
05186
05187 CMI_VMI_Handle_T *handle;
05188
05189 int i;
05190
05191 PVMI_CACHE_ENTRY cacheentry;
05192
05193 int childcount;
05194 int startrank;
05195 int destrank;
05196
05197 CMI_VMI_Publish_Message_T publish_msg;
05198
05199
05200 DEBUG_PRINT ("CMI_VMI_Send_Spanning_Children() called.\n");
05201
05202 childcount = CMI_VMI_Spanning_Children_Count (msg);
05203
05204 if (childcount == 0) {
05205 CdsFifo_Enqueue (CpvAccess (CMI_VMI_RemoteQueue), msg);
05206 return;
05207 }
05208
05209 if (msgsize < CMI_VMI_Medium_Message_Boundary) {
05210 handle = CMI_VMI_Handle_Allocate ();
05211
05212 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
05213 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
05214
05215
05216 handle->msg = msg;
05217 handle->msgsize = msgsize;
05218 handle->handle_type = CMI_VMI_HANDLE_TYPE_SEND;
05219 handle->data.send.send_handle_type = CMI_VMI_SEND_HANDLE_TYPE_STREAM;
05220 handle->data.send.message_disposition = CMI_VMI_MESSAGE_DISPOSITION_ENQUEUE;
05221 handle->data.send.data.stream.cacheentry = cacheentry;
05222
05223 bufHandles[0] = cacheentry->bufferHandle;
05224 addrs[0] = (PVOID) msg;
05225 sz[0] = (ULONG) msgsize;
05226
05227 handle->refcount += childcount;
05228 CMI_VMI_AsyncMsgCount += childcount;
05229
05230 startrank = CMI_BROADCAST_ROOT (msg) - 1;
05231 for (i = 1; i <= CMI_VMI_BROADCAST_SPANNING_FACTOR; i++) {
05232 destrank = _Cmi_mype - startrank;
05233
05234 if (destrank < 0) {
05235 destrank += _Cmi_numpes;
05236 }
05237
05238 destrank = CMI_VMI_BROADCAST_SPANNING_FACTOR * destrank + i;
05239
05240 if (destrank > (_Cmi_numpes - 1)) {
05241 break;
05242 }
05243
05244 destrank += startrank;
05245 destrank %= _Cmi_numpes;
05246
05247 status = VMI_Stream_Send ((&CMI_VMI_Processes[destrank])->connection, bufHandles, addrs, sz, 1, CMI_VMI_Stream_Completion_Handler, (PVOID) handle, TRUE);
05248 CMI_VMI_CHECK_SUCCESS (status, "VMI_Stream_Send()");
05249 }
05250 } else {
05251 status = VMI_Cache_Register (msg, msgsize, &cacheentry);
05252 CMI_VMI_CHECK_SUCCESS (status, "VMI_Cache_Register()");
05253
05254 handle = CMI_VMI_Handle_Allocate ();
05255
05256
05257 handle->msg = msg;
05258 handle->msgsize = msgsize;
05259 handle->handle_type = CMI_VMI_HANDLE_TYPE_SEND;
05260 handle->data.send.send_handle_type=CMI_VMI_SEND_HANDLE_TYPE_RDMABROADCAST;
05261 handle->data.send.message_disposition=CMI_VMI_MESSAGE_DISPOSITION_ENQUEUE;
05262 handle->data.send.data.rdmabroadcast.cacheentry = cacheentry;
05263
05264 handle->refcount += childcount;
05265 CMI_VMI_AsyncMsgCount += childcount;
05266 handle->data.send.data.rdmabroadcast.publishes_pending = childcount;
05267
05268 startrank = CMI_BROADCAST_ROOT (msg) - 1;
05269 for (i = 1; i <= CMI_VMI_BROADCAST_SPANNING_FACTOR; i++) {
05270 destrank = _Cmi_mype - startrank;
05271
05272 if (destrank < 0) {
05273 destrank += _Cmi_numpes;
05274 }
05275
05276 destrank = CMI_VMI_BROADCAST_SPANNING_FACTOR * destrank + i;
05277
05278 if (destrank > (_Cmi_numpes - 1)) {
05279 break;
05280 }
05281
05282 destrank += startrank;
05283 destrank %= _Cmi_numpes;
05284
05285 publish_msg.type = CMI_VMI_PUBLISH_TYPE_GET;
05286
05287 #if CMI_VMI_USE_VMI22
05288 status = VMI_RDMA_Publish_Buffer_With_Callback ((&CMI_VMI_Processes[destrank])->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg,
05289 (UINT32) msgsize, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
05290 (ULONG) sizeof (CMI_VMI_Publish_Message_T), (PVOID) handle, CMI_VMI_RDMA_Publish_Completion_Handler);
05291 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer_With_Callback()");
05292 #else
05293 status = VMI_RDMA_Publish_Buffer ((&CMI_VMI_Processes[destrank])->connection, cacheentry->bufferHandle, (VMI_virt_addr_t) (VMI_ADDR_CAST) msg,
05294 (UINT32) msgsize, (VMI_virt_addr_t) (VMI_ADDR_CAST) NULL, (UINT32) handle->index, (PVOID) &publish_msg,
05295 (ULONG) sizeof (CMI_VMI_Publish_Message_T));
05296 CMI_VMI_CHECK_SUCCESS (status, "VMI_RDMA_Publish_Buffer()");
05297 #endif
05298 }
05299 #if CMI_VMI_USE_VMI22
05300 while (handle->data.send.data.rdmabroadcast.publishes_pending > 0) {
05301 sched_yield ();
05302 status = VMI_Poll ();
05303 CMI_VMI_CHECK_SUCCESS (status, "VMI_Poll()");
05304 }
05305 #endif
05306 }
05307 }
05308 #endif
05309
05310
05311
05312
05313
05314
05315 void CMI_VMI_Common_Receive (int sourcerank, int msgsize, char *msg)
05316 {
05317 CMI_VMI_Process_T *process;
05318
05319 int credits_temp;
05320
05321 CMI_VMI_Persistent_Request_Message_T *persistent_request_msg;
05322 CMI_VMI_Latency_Vector_Reply_Message_T *latency_vector_reply_msg;
05323 CMI_VMI_Cluster_Mapping_Message_T *mapping_msg;
05324
05325 int i;
05326
05327
05328 DEBUG_PRINT ("CMI_VMI_Common_Receive() called.\n");
05329
05330 process = &CMI_VMI_Processes[sourcerank];
05331
05332
05333 credits_temp = CMI_VMI_MESSAGE_CREDITS (msg);
05334 process->eager_short_send_credits_available += credits_temp;
05335
05336 switch (CMI_VMI_MESSAGE_TYPE (msg))
05337 {
05338 case CMI_VMI_MESSAGE_TYPE_STANDARD:
05339 #ifdef GK_DELAY_DEVICE
05340 if (CmiGetCluster (_Cmi_mype) == CmiGetCluster (process->rank)) {
05341 #if CMK_BROADCAST_SPANNING_TREE
05342 if (CMI_BROADCAST_ROOT (msg)) {
05343
05344 CMI_VMI_Send_Spanning_Children (msgsize, msg);
05345 } else {
05346 CdsFifo_Enqueue (CpvAccess (CMI_VMI_RemoteQueue), msg);
05347 }
05348 #else
05349 CdsFifo_Enqueue (CpvAccess (CMI_VMI_RemoteQueue), msg);
05350 #endif
05351 } else {
05352 struct timeval gk_tv;
05353 double gk_time_now;
05354 gk_delayed_msgs *gk_new_node;
05355
05356 gettimeofday (&gk_tv, NULL);
05357 gk_time_now = gk_tv.tv_sec + (gk_tv.tv_usec * 0.000001);
05358
05359 gk_new_node = malloc (sizeof (gk_delayed_msgs));
05360 gk_new_node->time = gk_time_now;
05361 gk_new_node->msg = msg;
05362 gk_new_node->msgsize = msgsize;
05363 gk_new_node->sender = process->rank;
05364 gk_new_node->next = NULL;
05365
05366 if (gk_head_ptr1) {
05367 gk_tail_ptr1->next = gk_new_node;
05368 gk_tail_ptr1 = gk_new_node;
05369 } else {
05370 gk_head_ptr1 = gk_new_node;
05371 gk_tail_ptr1 = gk_new_node;
05372 }
05373 }
05374 break;
05375 #else
05376 #if CMK_BROADCAST_SPANNING_TREE
05377 if (CMI_BROADCAST_ROOT (msg)) {
05378
05379 CMI_VMI_Send_Spanning_Children (msgsize, msg);
05380 } else {
05381 CdsFifo_Enqueue (CpvAccess (CMI_VMI_RemoteQueue), msg);
05382 }
05383 #else
05384 CdsFifo_Enqueue (CpvAccess (CMI_VMI_RemoteQueue), msg);
05385 #endif
05386 break;
05387 #endif
05388
05389 case CMI_VMI_MESSAGE_TYPE_BARRIER:
05390 CMI_VMI_Barrier_Count++;
05391 CmiFree (msg);
05392 break;
05393
05394 case CMI_VMI_MESSAGE_TYPE_PERSISTENT_REQUEST:
05395 persistent_request_msg = (CMI_VMI_Persistent_Request_Message_T *) msg;
05396 CMI_VMI_Eager_Short_Setup (sourcerank);
05397 if (persistent_request_msg->maxsize > CMI_VMI_Eager_Short_Message_Boundary) {
05398 if (persistent_request_msg->maxsize < CMI_VMI_Eager_Long_Buffer_Size) {
05399 CMI_VMI_Eager_Long_Setup (sourcerank, CMI_VMI_Eager_Long_Buffer_Size);
05400 } else {
05401 CMI_VMI_Eager_Long_Setup (sourcerank, persistent_request_msg->maxsize);
05402 }
05403 }
05404 CmiFree (msg);
05405 break;
05406
05407 case CMI_VMI_MESSAGE_TYPE_CREDIT:
05408 CmiFree (msg);
05409 break;
05410
05411 case CMI_VMI_MESSAGE_TYPE_LATENCY_VECTOR_REQUEST:
05412 CMI_VMI_Reply_Latencies (sourcerank);
05413 CmiFree (msg);
05414 break;
05415
05416 case CMI_VMI_MESSAGE_TYPE_LATENCY_VECTOR_REPLY:
05417 latency_vector_reply_msg = (CMI_VMI_Latency_Vector_Reply_Message_T *) msg;
05418 (&CMI_VMI_Processes[sourcerank])->latency_vector = (unsigned long *) malloc (_Cmi_numpes * sizeof (unsigned long));
05419 for (i = 0; i < _Cmi_numpes; i++) {
05420 (&CMI_VMI_Processes[sourcerank])->latency_vector[i] = latency_vector_reply_msg->latency[i];
05421 }
05422 CMI_VMI_Latency_Vectors_Received += 1;
05423 CmiFree (msg);
05424 break;
05425
05426 case CMI_VMI_MESSAGE_TYPE_CLUSTER_MAPPING:
05427 mapping_msg = (CMI_VMI_Cluster_Mapping_Message_T *) msg;
05428 for (i = 0; i < _Cmi_numpes; i++) {
05429 (&CMI_VMI_Processes[i])->cluster = mapping_msg->cluster[i];
05430 }
05431 CMI_VMI_Cluster_Mapping_Received = TRUE;
05432 CmiFree (msg);
05433 break;
05434
05435 case CMI_VMI_MESSAGE_TYPE_UNKNOWN:
05436 break;
05437
05438 default:
05439 break;
05440 }
05441 }
05442