00001
00016
00020 #ifndef _PLASMA_GLOBAL_H_
00021 #define _PLASMA_GLOBAL_H_
00022
00023 #include <plasma.h>
00024
00025 #include <string.h>
00026
00027 #if defined( _WIN32 ) || defined( _WIN64 )
00028 #include "plasmawinthread.h"
00029 #else
00030 #include <pthread.h>
00031 #endif
00032
00033
00036
00037 #define CONTEXTS_MAX 256
00038
00039 #define CONTEXT_THREADS_MAX 256
00040
00041 #define ARGS_BUFF_SIZE 512
00042
00043 #define CACHE_LINE_SIZE 128
00044
00045 #define STANDARD_PAGE_SIZE 4096
00046
00047
00050 #define PLASMA_ACT_STAND_BY 0
00051 #define PLASMA_ACT_PARALLEL 1
00052 #define PLASMA_ACT_DYNAMIC 2
00053 #define PLASMA_ACT_FINALIZE 3
00054
00055
00058 #define PLASMA_FUNC_SGELS 1
00059 #define PLASMA_FUNC_SPOSV 2
00060 #define PLASMA_FUNC_SGESV 3
00061 #define PLASMA_FUNC_DGELS 4
00062 #define PLASMA_FUNC_DPOSV 5
00063 #define PLASMA_FUNC_DGESV 6
00064 #define PLASMA_FUNC_CGELS 7
00065 #define PLASMA_FUNC_CPOSV 8
00066 #define PLASMA_FUNC_CGESV 9
00067 #define PLASMA_FUNC_ZGELS 10
00068 #define PLASMA_FUNC_ZPOSV 11
00069 #define PLASMA_FUNC_ZGESV 12
00070 #define PLASMA_FUNC_ZCGESV 13
00071 #define PLASMA_FUNC_DSGESV 14
00072 #define PLASMA_FUNC_ZCPOSV 15
00073 #define PLASMA_FUNC_DSPOSV 16
00074 #define PLASMA_FUNC_DSGELS 17
00075 #define PLASMA_FUNC_ZCGELS 18
00076 #define PLASMA_FUNC_SGEMM 19
00077 #define PLASMA_FUNC_DGEMM 20
00078 #define PLASMA_FUNC_CGEMM 21
00079 #define PLASMA_FUNC_ZGEMM 22
00080 #define PLASMA_FUNC_SSYMM 23
00081 #define PLASMA_FUNC_DSYMM 24
00082 #define PLASMA_FUNC_CSYMM 25
00083 #define PLASMA_FUNC_ZSYMM 26
00084 #define PLASMA_FUNC_CHERK 27
00085 #define PLASMA_FUNC_ZHERK 28
00086 #define PLASMA_FUNC_SSYRK 29
00087 #define PLASMA_FUNC_DSYRK 30
00088 #define PLASMA_FUNC_CSYRK 31
00089 #define PLASMA_FUNC_ZSYRK 32
00090 #define PLASMA_FUNC_CHEMM 33
00091 #define PLASMA_FUNC_ZHEMM 34
00092
00093
00096 #define plasma_pack_args_1( \
00097 type1, arg1) \
00098 { \
00099 type1 var1 = (arg1); \
00100 unsigned char *plasma_ptr = plasma->args_buff; \
00101 if (sizeof(type1) > ARGS_BUFF_SIZE) \
00102 plasma_fatal_error("plasma_pack_args_1", "arguments buffer too small"); \
00103 memcpy(plasma_ptr, &var1, sizeof(type1)); plasma_ptr += sizeof(type1); \
00104 }
00105
00106 #define plasma_pack_args_2( \
00107 type1, arg1, \
00108 type2, arg2) \
00109 { \
00110 type1 var1 = (arg1); \
00111 type2 var2 = (arg2); \
00112 unsigned char *plasma_ptr = plasma->args_buff; \
00113 if (sizeof(type1) + \
00114 sizeof(type2) > ARGS_BUFF_SIZE) \
00115 plasma_fatal_error("plasma_pack_args_2", "arguments buffer too small"); \
00116 memcpy(plasma_ptr, &var1, sizeof(type1)); plasma_ptr += sizeof(type1); \
00117 memcpy(plasma_ptr, &var2, sizeof(type2)); plasma_ptr += sizeof(type2); \
00118 }
00119
00120 #define plasma_pack_args_3( \
00121 type1, arg1, \
00122 type2, arg2, \
00123 type3, arg3) \
00124 { \
00125 type1 var1 = (arg1); \
00126 type2 var2 = (arg2); \
00127 type3 var3 = (arg3); \
00128 unsigned char *plasma_ptr = plasma->args_buff; \
00129 if (sizeof(type1) + \
00130 sizeof(type2) + \
00131 sizeof(type3) > ARGS_BUFF_SIZE) \
00132 plasma_fatal_error("plasma_pack_args_3", "arguments buffer too small"); \
00133 memcpy(plasma_ptr, &var1, sizeof(type1)); plasma_ptr += sizeof(type1); \
00134 memcpy(plasma_ptr, &var2, sizeof(type2)); plasma_ptr += sizeof(type2); \
00135 memcpy(plasma_ptr, &var3, sizeof(type3)); plasma_ptr += sizeof(type3); \
00136 }
00137
00138 #define plasma_pack_args_4( \
00139 type1, arg1, \
00140 type2, arg2, \
00141 type3, arg3, \
00142 type4, arg4) \
00143 { \
00144 type1 var1 = (arg1); \
00145 type2 var2 = (arg2); \
00146 type3 var3 = (arg3); \
00147 type4 var4 = (arg4); \
00148 unsigned char *plasma_ptr = plasma->args_buff; \
00149 if (sizeof(type1) + \
00150 sizeof(type2) + \
00151 sizeof(type3) + \
00152 sizeof(type4) > ARGS_BUFF_SIZE) \
00153 plasma_fatal_error("plasma_pack_args_4", "arguments buffer too small"); \
00154 memcpy(plasma_ptr, &var1, sizeof(type1)); plasma_ptr += sizeof(type1); \
00155 memcpy(plasma_ptr, &var2, sizeof(type2)); plasma_ptr += sizeof(type2); \
00156 memcpy(plasma_ptr, &var3, sizeof(type3)); plasma_ptr += sizeof(type3); \
00157 memcpy(plasma_ptr, &var4, sizeof(type4)); plasma_ptr += sizeof(type4); \
00158 }
00159
00160 #define plasma_pack_args_5( \
00161 type1, arg1, \
00162 type2, arg2, \
00163 type3, arg3, \
00164 type4, arg4, \
00165 type5, arg5) \
00166 { \
00167 type1 var1 = (arg1); \
00168 type2 var2 = (arg2); \
00169 type3 var3 = (arg3); \
00170 type4 var4 = (arg4); \
00171 type5 var5 = (arg5); \
00172 unsigned char *plasma_ptr = plasma->args_buff; \
00173 if (sizeof(type1) + \
00174 sizeof(type2) + \
00175 sizeof(type3) + \
00176 sizeof(type4) + \
00177 sizeof(type5) > ARGS_BUFF_SIZE) \
00178 plasma_fatal_error("plasma_pack_args_5", "arguments buffer too small"); \
00179 memcpy(plasma_ptr, &var1, sizeof(type1)); plasma_ptr += sizeof(type1); \
00180 memcpy(plasma_ptr, &var2, sizeof(type2)); plasma_ptr += sizeof(type2); \
00181 memcpy(plasma_ptr, &var3, sizeof(type3)); plasma_ptr += sizeof(type3); \
00182 memcpy(plasma_ptr, &var4, sizeof(type4)); plasma_ptr += sizeof(type4); \
00183 memcpy(plasma_ptr, &var5, sizeof(type5)); plasma_ptr += sizeof(type5); \
00184 }
00185
00186 #define plasma_pack_args_6( \
00187 type1, arg1, \
00188 type2, arg2, \
00189 type3, arg3, \
00190 type4, arg4, \
00191 type5, arg5, \
00192 type6, arg6) \
00193 { \
00194 type1 var1 = (arg1); \
00195 type2 var2 = (arg2); \
00196 type3 var3 = (arg3); \
00197 type4 var4 = (arg4); \
00198 type5 var5 = (arg5); \
00199 type6 var6 = (arg6); \
00200 unsigned char *plasma_ptr = plasma->args_buff; \
00201 if (sizeof(type1) + \
00202 sizeof(type2) + \
00203 sizeof(type3) + \
00204 sizeof(type4) + \
00205 sizeof(type5) + \
00206 sizeof(type6) > ARGS_BUFF_SIZE) \
00207 plasma_fatal_error("plasma_pack_args_6", "arguments buffer too small"); \
00208 memcpy(plasma_ptr, &var1, sizeof(type1)); plasma_ptr += sizeof(type1); \
00209 memcpy(plasma_ptr, &var2, sizeof(type2)); plasma_ptr += sizeof(type2); \
00210 memcpy(plasma_ptr, &var3, sizeof(type3)); plasma_ptr += sizeof(type3); \
00211 memcpy(plasma_ptr, &var4, sizeof(type4)); plasma_ptr += sizeof(type4); \
00212 memcpy(plasma_ptr, &var5, sizeof(type5)); plasma_ptr += sizeof(type5); \
00213 memcpy(plasma_ptr, &var6, sizeof(type6)); plasma_ptr += sizeof(type6); \
00214 }
00215
00216 #define plasma_pack_args_7( \
00217 type1, arg1, \
00218 type2, arg2, \
00219 type3, arg3, \
00220 type4, arg4, \
00221 type5, arg5, \
00222 type6, arg6, \
00223 type7, arg7) \
00224 { \
00225 type1 var1 = (arg1); \
00226 type2 var2 = (arg2); \
00227 type3 var3 = (arg3); \
00228 type4 var4 = (arg4); \
00229 type5 var5 = (arg5); \
00230 type6 var6 = (arg6); \
00231 type7 var7 = (arg7); \
00232 unsigned char *plasma_ptr = plasma->args_buff; \
00233 if (sizeof(type1) + \
00234 sizeof(type2) + \
00235 sizeof(type3) + \
00236 sizeof(type4) + \
00237 sizeof(type5) + \
00238 sizeof(type6) + \
00239 sizeof(type7) > ARGS_BUFF_SIZE) \
00240 plasma_fatal_error("plasma_pack_args_7", "arguments buffer too small"); \
00241 memcpy(plasma_ptr, &var1, sizeof(type1)); plasma_ptr += sizeof(type1); \
00242 memcpy(plasma_ptr, &var2, sizeof(type2)); plasma_ptr += sizeof(type2); \
00243 memcpy(plasma_ptr, &var3, sizeof(type3)); plasma_ptr += sizeof(type3); \
00244 memcpy(plasma_ptr, &var4, sizeof(type4)); plasma_ptr += sizeof(type4); \
00245 memcpy(plasma_ptr, &var5, sizeof(type5)); plasma_ptr += sizeof(type5); \
00246 memcpy(plasma_ptr, &var6, sizeof(type6)); plasma_ptr += sizeof(type6); \
00247 memcpy(plasma_ptr, &var7, sizeof(type7)); plasma_ptr += sizeof(type7); \
00248 }
00249
00250 #define plasma_pack_args_8( \
00251 type1, arg1, \
00252 type2, arg2, \
00253 type3, arg3, \
00254 type4, arg4, \
00255 type5, arg5, \
00256 type6, arg6, \
00257 type7, arg7, \
00258 type8, arg8) \
00259 { \
00260 type1 var1 = (arg1); \
00261 type2 var2 = (arg2); \
00262 type3 var3 = (arg3); \
00263 type4 var4 = (arg4); \
00264 type5 var5 = (arg5); \
00265 type6 var6 = (arg6); \
00266 type7 var7 = (arg7); \
00267 type8 var8 = (arg8); \
00268 unsigned char *plasma_ptr = plasma->args_buff; \
00269 if (sizeof(type1) + \
00270 sizeof(type2) + \
00271 sizeof(type3) + \
00272 sizeof(type4) + \
00273 sizeof(type5) + \
00274 sizeof(type6) + \
00275 sizeof(type7) + \
00276 sizeof(type8) > ARGS_BUFF_SIZE) \
00277 plasma_fatal_error("plasma_pack_args_8", "arguments buffer too small"); \
00278 memcpy(plasma_ptr, &var1, sizeof(type1)); plasma_ptr += sizeof(type1); \
00279 memcpy(plasma_ptr, &var2, sizeof(type2)); plasma_ptr += sizeof(type2); \
00280 memcpy(plasma_ptr, &var3, sizeof(type3)); plasma_ptr += sizeof(type3); \
00281 memcpy(plasma_ptr, &var4, sizeof(type4)); plasma_ptr += sizeof(type4); \
00282 memcpy(plasma_ptr, &var5, sizeof(type5)); plasma_ptr += sizeof(type5); \
00283 memcpy(plasma_ptr, &var6, sizeof(type6)); plasma_ptr += sizeof(type6); \
00284 memcpy(plasma_ptr, &var7, sizeof(type7)); plasma_ptr += sizeof(type7); \
00285 memcpy(plasma_ptr, &var8, sizeof(type8)); plasma_ptr += sizeof(type8); \
00286 }
00287
00288 #define plasma_pack_args_9( \
00289 type1, arg1, \
00290 type2, arg2, \
00291 type3, arg3, \
00292 type4, arg4, \
00293 type5, arg5, \
00294 type6, arg6, \
00295 type7, arg7, \
00296 type8, arg8, \
00297 type9, arg9) \
00298 { \
00299 type1 var1 = (arg1); \
00300 type2 var2 = (arg2); \
00301 type3 var3 = (arg3); \
00302 type4 var4 = (arg4); \
00303 type5 var5 = (arg5); \
00304 type6 var6 = (arg6); \
00305 type7 var7 = (arg7); \
00306 type8 var8 = (arg8); \
00307 type9 var9 = (arg9); \
00308 unsigned char *plasma_ptr = plasma->args_buff; \
00309 if (sizeof(type1) + \
00310 sizeof(type2) + \
00311 sizeof(type3) + \
00312 sizeof(type4) + \
00313 sizeof(type5) + \
00314 sizeof(type6) + \
00315 sizeof(type7) + \
00316 sizeof(type8) + \
00317 sizeof(type9) > ARGS_BUFF_SIZE) \
00318 plasma_fatal_error("plasma_pack_args_9", "arguments buffer too small"); \
00319 memcpy(plasma_ptr, &var1, sizeof(type1)); plasma_ptr += sizeof(type1); \
00320 memcpy(plasma_ptr, &var2, sizeof(type2)); plasma_ptr += sizeof(type2); \
00321 memcpy(plasma_ptr, &var3, sizeof(type3)); plasma_ptr += sizeof(type3); \
00322 memcpy(plasma_ptr, &var4, sizeof(type4)); plasma_ptr += sizeof(type4); \
00323 memcpy(plasma_ptr, &var5, sizeof(type5)); plasma_ptr += sizeof(type5); \
00324 memcpy(plasma_ptr, &var6, sizeof(type6)); plasma_ptr += sizeof(type6); \
00325 memcpy(plasma_ptr, &var7, sizeof(type7)); plasma_ptr += sizeof(type7); \
00326 memcpy(plasma_ptr, &var8, sizeof(type8)); plasma_ptr += sizeof(type8); \
00327 memcpy(plasma_ptr, &var9, sizeof(type9)); plasma_ptr += sizeof(type9); \
00328 }
00329
00330 #define plasma_pack_args_10( \
00331 type1, arg1, \
00332 type2, arg2, \
00333 type3, arg3, \
00334 type4, arg4, \
00335 type5, arg5, \
00336 type6, arg6, \
00337 type7, arg7, \
00338 type8, arg8, \
00339 type9, arg9, \
00340 type10, arg10) \
00341 { \
00342 type1 var1 = (arg1); \
00343 type2 var2 = (arg2); \
00344 type3 var3 = (arg3); \
00345 type4 var4 = (arg4); \
00346 type5 var5 = (arg5); \
00347 type6 var6 = (arg6); \
00348 type7 var7 = (arg7); \
00349 type8 var8 = (arg8); \
00350 type9 var9 = (arg9); \
00351 type10 var10 = (arg10); \
00352 unsigned char *plasma_ptr = plasma->args_buff; \
00353 if (sizeof(type1) + \
00354 sizeof(type2) + \
00355 sizeof(type3) + \
00356 sizeof(type4) + \
00357 sizeof(type5) + \
00358 sizeof(type6) + \
00359 sizeof(type7) + \
00360 sizeof(type8) + \
00361 sizeof(type9) + \
00362 sizeof(type10) > ARGS_BUFF_SIZE) \
00363 plasma_fatal_error("plasma_pack_args_9", "arguments buffer too small"); \
00364 memcpy(plasma_ptr, &var1, sizeof(type1)); plasma_ptr += sizeof(type1); \
00365 memcpy(plasma_ptr, &var2, sizeof(type2)); plasma_ptr += sizeof(type2); \
00366 memcpy(plasma_ptr, &var3, sizeof(type3)); plasma_ptr += sizeof(type3); \
00367 memcpy(plasma_ptr, &var4, sizeof(type4)); plasma_ptr += sizeof(type4); \
00368 memcpy(plasma_ptr, &var5, sizeof(type5)); plasma_ptr += sizeof(type5); \
00369 memcpy(plasma_ptr, &var6, sizeof(type6)); plasma_ptr += sizeof(type6); \
00370 memcpy(plasma_ptr, &var7, sizeof(type7)); plasma_ptr += sizeof(type7); \
00371 memcpy(plasma_ptr, &var8, sizeof(type8)); plasma_ptr += sizeof(type8); \
00372 memcpy(plasma_ptr, &var9, sizeof(type9)); plasma_ptr += sizeof(type9); \
00373 memcpy(plasma_ptr, &var10, sizeof(type10)); plasma_ptr += sizeof(type10); \
00374 }
00375
00376
00379 #define plasma_dynamic_sync() \
00380 { \
00381 if (plasma->dynamic_section) { \
00382 QUARK_Waitall(plasma->quark); \
00383 plasma_barrier(plasma); \
00384 plasma->dynamic_section = PLASMA_FALSE; \
00385 } \
00386 }
00387
00388
00391 #define plasma_static_call(parallel_function) \
00392 { \
00393 if (plasma->dynamic_section) \
00394 plasma_dynamic_sync(); \
00395 pthread_mutex_lock(&plasma->action_mutex); \
00396 plasma->action = PLASMA_ACT_PARALLEL; \
00397 plasma->parallel_func_ptr = ¶llel_function; \
00398 pthread_mutex_unlock(&plasma->action_mutex); \
00399 pthread_cond_broadcast(&plasma->action_condt); \
00400 plasma_barrier(plasma); \
00401 plasma->action = PLASMA_ACT_STAND_BY; \
00402 parallel_function(plasma); \
00403 plasma_barrier(plasma); \
00404 }
00405
00406
00409 #define plasma_dynamic_spawn() \
00410 { \
00411 if (!plasma->dynamic_section) { \
00412 plasma->dynamic_section = PLASMA_TRUE; \
00413 pthread_mutex_lock(&plasma->action_mutex); \
00414 plasma->action = PLASMA_ACT_DYNAMIC; \
00415 pthread_mutex_unlock(&plasma->action_mutex); \
00416 pthread_cond_broadcast(&plasma->action_condt); \
00417 plasma_barrier(plasma); \
00418 plasma->action = PLASMA_ACT_STAND_BY; \
00419 } \
00420 }
00421
00422
00425 #define plasma_static_call_1( \
00426 parallel_function, \
00427 type1, arg1) \
00428 plasma_pack_args_1( \
00429 type1, (arg1)) \
00430 plasma_static_call(parallel_function) \
00431
00432 #define plasma_static_call_2( \
00433 parallel_function, \
00434 type1, arg1, \
00435 type2, arg2) \
00436 plasma_pack_args_2( \
00437 type1, (arg1), \
00438 type2, (arg2)) \
00439 plasma_static_call(parallel_function) \
00440
00441 #define plasma_static_call_3( \
00442 parallel_function, \
00443 type1, arg1, \
00444 type2, arg2, \
00445 type3, arg3) \
00446 plasma_pack_args_3( \
00447 type1, (arg1), \
00448 type2, (arg2), \
00449 type3, (arg3)) \
00450 plasma_static_call(parallel_function) \
00451
00452 #define plasma_static_call_4( \
00453 parallel_function, \
00454 type1, arg1, \
00455 type2, arg2, \
00456 type3, arg3, \
00457 type4, arg4) \
00458 plasma_pack_args_4( \
00459 type1, (arg1), \
00460 type2, (arg2), \
00461 type3, (arg3), \
00462 type4, (arg4)) \
00463 plasma_static_call(parallel_function) \
00464
00465 #define plasma_static_call_5( \
00466 parallel_function, \
00467 type1, arg1, \
00468 type2, arg2, \
00469 type3, arg3, \
00470 type4, arg4, \
00471 type5, arg5) \
00472 plasma_pack_args_5( \
00473 type1, (arg1), \
00474 type2, (arg2), \
00475 type3, (arg3), \
00476 type4, (arg4), \
00477 type5, (arg5)) \
00478 plasma_static_call(parallel_function) \
00479
00480 #define plasma_static_call_6( \
00481 parallel_function, \
00482 type1, arg1, \
00483 type2, arg2, \
00484 type3, arg3, \
00485 type4, arg4, \
00486 type5, arg5, \
00487 type6, arg6) \
00488 plasma_pack_args_6( \
00489 type1, (arg1), \
00490 type2, (arg2), \
00491 type3, (arg3), \
00492 type4, (arg4), \
00493 type5, (arg5), \
00494 type6, (arg6)) \
00495 plasma_static_call(parallel_function) \
00496
00497 #define plasma_static_call_7( \
00498 parallel_function, \
00499 type1, arg1, \
00500 type2, arg2, \
00501 type3, arg3, \
00502 type4, arg4, \
00503 type5, arg5, \
00504 type6, arg6, \
00505 type7, arg7) \
00506 plasma_pack_args_7( \
00507 type1, (arg1), \
00508 type2, (arg2), \
00509 type3, (arg3), \
00510 type4, (arg4), \
00511 type5, (arg5), \
00512 type6, (arg6), \
00513 type7, (arg7)) \
00514 plasma_static_call(parallel_function) \
00515
00516 #define plasma_static_call_8( \
00517 parallel_function, \
00518 type1, arg1, \
00519 type2, arg2, \
00520 type3, arg3, \
00521 type4, arg4, \
00522 type5, arg5, \
00523 type6, arg6, \
00524 type7, arg7, \
00525 type8, arg8) \
00526 plasma_pack_args_8( \
00527 type1, (arg1), \
00528 type2, (arg2), \
00529 type3, (arg3), \
00530 type4, (arg4), \
00531 type5, (arg5), \
00532 type6, (arg6), \
00533 type7, (arg7), \
00534 type8, (arg8)) \
00535 plasma_static_call(parallel_function) \
00536
00537 #define plasma_static_call_9( \
00538 parallel_function, \
00539 type1, arg1, \
00540 type2, arg2, \
00541 type3, arg3, \
00542 type4, arg4, \
00543 type5, arg5, \
00544 type6, arg6, \
00545 type7, arg7, \
00546 type8, arg8, \
00547 type9, arg9) \
00548 plasma_pack_args_9( \
00549 type1, (arg1), \
00550 type2, (arg2), \
00551 type3, (arg3), \
00552 type4, (arg4), \
00553 type5, (arg5), \
00554 type6, (arg6), \
00555 type7, (arg7), \
00556 type8, (arg8), \
00557 type9, (arg9)) \
00558 plasma_static_call(parallel_function) \
00559
00560 #define plasma_static_call_10( \
00561 parallel_function, \
00562 type1, arg1, \
00563 type2, arg2, \
00564 type3, arg3, \
00565 type4, arg4, \
00566 type5, arg5, \
00567 type6, arg6, \
00568 type7, arg7, \
00569 type8, arg8, \
00570 type9, arg9, \
00571 type10, arg10) \
00572 plasma_pack_args_10( \
00573 type1, (arg1), \
00574 type2, (arg2), \
00575 type3, (arg3), \
00576 type4, (arg4), \
00577 type5, (arg5), \
00578 type6, (arg6), \
00579 type7, (arg7), \
00580 type8, (arg8), \
00581 type9, (arg9), \
00582 type10, (arg10)) \
00583 plasma_static_call(parallel_function) \
00584
00585
00588 #define plasma_parallel_call_1( \
00589 parallel_function, \
00590 type1, arg1) \
00591 if (PLASMA_SCHEDULING == PLASMA_STATIC_SCHEDULING) { \
00592 plasma_pack_args_1( \
00593 type1, (arg1)) \
00594 plasma_static_call(parallel_function) \
00595 } else { \
00596 plasma_dynamic_spawn(); \
00597 parallel_function##_quark( \
00598 arg1); \
00599 }
00600
00601 #define plasma_parallel_call_2( \
00602 parallel_function, \
00603 type1, arg1, \
00604 type2, arg2) \
00605 if (PLASMA_SCHEDULING == PLASMA_STATIC_SCHEDULING) { \
00606 plasma_pack_args_2( \
00607 type1, (arg1), \
00608 type2, (arg2)) \
00609 plasma_static_call(parallel_function) \
00610 } else { \
00611 plasma_dynamic_spawn(); \
00612 parallel_function##_quark( \
00613 arg1, \
00614 arg2); \
00615 }
00616
00617 #define plasma_parallel_call_3( \
00618 parallel_function, \
00619 type1, arg1, \
00620 type2, arg2, \
00621 type3, arg3) \
00622 if (PLASMA_SCHEDULING == PLASMA_STATIC_SCHEDULING) { \
00623 plasma_pack_args_3( \
00624 type1, (arg1), \
00625 type2, (arg2), \
00626 type3, (arg3)) \
00627 plasma_static_call(parallel_function) \
00628 } else { \
00629 plasma_dynamic_spawn(); \
00630 parallel_function##_quark( \
00631 arg1, \
00632 arg2, \
00633 arg3); \
00634 }
00635
00636 #define plasma_parallel_call_4( \
00637 parallel_function, \
00638 type1, arg1, \
00639 type2, arg2, \
00640 type3, arg3, \
00641 type4, arg4) \
00642 if (PLASMA_SCHEDULING == PLASMA_STATIC_SCHEDULING) { \
00643 plasma_pack_args_4( \
00644 type1, (arg1), \
00645 type2, (arg2), \
00646 type3, (arg3), \
00647 type4, (arg4)) \
00648 plasma_static_call(parallel_function) \
00649 } else { \
00650 plasma_dynamic_spawn(); \
00651 parallel_function##_quark( \
00652 arg1, \
00653 arg2, \
00654 arg3, \
00655 arg4); \
00656 }
00657
00658 #define plasma_parallel_call_5( \
00659 parallel_function, \
00660 type1, arg1, \
00661 type2, arg2, \
00662 type3, arg3, \
00663 type4, arg4, \
00664 type5, arg5) \
00665 if (PLASMA_SCHEDULING == PLASMA_STATIC_SCHEDULING) { \
00666 plasma_pack_args_5( \
00667 type1, (arg1), \
00668 type2, (arg2), \
00669 type3, (arg3), \
00670 type4, (arg4), \
00671 type5, (arg5)) \
00672 plasma_static_call(parallel_function) \
00673 } else { \
00674 plasma_dynamic_spawn(); \
00675 parallel_function##_quark( \
00676 arg1, \
00677 arg2, \
00678 arg3, \
00679 arg4, \
00680 arg5); \
00681 }
00682
00683 #define plasma_parallel_call_6( \
00684 parallel_function, \
00685 type1, arg1, \
00686 type2, arg2, \
00687 type3, arg3, \
00688 type4, arg4, \
00689 type5, arg5, \
00690 type6, arg6) \
00691 if (PLASMA_SCHEDULING == PLASMA_STATIC_SCHEDULING) { \
00692 plasma_pack_args_6( \
00693 type1, (arg1), \
00694 type2, (arg2), \
00695 type3, (arg3), \
00696 type4, (arg4), \
00697 type5, (arg5), \
00698 type6, (arg6)) \
00699 plasma_static_call(parallel_function) \
00700 } else { \
00701 plasma_dynamic_spawn(); \
00702 parallel_function##_quark( \
00703 arg1, \
00704 arg2, \
00705 arg3, \
00706 arg4, \
00707 arg5, \
00708 arg6); \
00709 }
00710
00711 #define plasma_parallel_call_7( \
00712 parallel_function, \
00713 type1, arg1, \
00714 type2, arg2, \
00715 type3, arg3, \
00716 type4, arg4, \
00717 type5, arg5, \
00718 type6, arg6, \
00719 type7, arg7) \
00720 if (PLASMA_SCHEDULING == PLASMA_STATIC_SCHEDULING) { \
00721 plasma_pack_args_7( \
00722 type1, (arg1), \
00723 type2, (arg2), \
00724 type3, (arg3), \
00725 type4, (arg4), \
00726 type5, (arg5), \
00727 type6, (arg6), \
00728 type7, (arg7)) \
00729 plasma_static_call(parallel_function) \
00730 } else { \
00731 plasma_dynamic_spawn(); \
00732 parallel_function##_quark( \
00733 arg1, \
00734 arg2, \
00735 arg3, \
00736 arg4, \
00737 arg5, \
00738 arg6, \
00739 arg7); \
00740 }
00741
00742 #define plasma_parallel_call_8( \
00743 parallel_function, \
00744 type1, arg1, \
00745 type2, arg2, \
00746 type3, arg3, \
00747 type4, arg4, \
00748 type5, arg5, \
00749 type6, arg6, \
00750 type7, arg7, \
00751 type8, arg8) \
00752 if (PLASMA_SCHEDULING == PLASMA_STATIC_SCHEDULING) { \
00753 plasma_pack_args_8( \
00754 type1, (arg1), \
00755 type2, (arg2), \
00756 type3, (arg3), \
00757 type4, (arg4), \
00758 type5, (arg5), \
00759 type6, (arg6), \
00760 type7, (arg7), \
00761 type8, (arg8)) \
00762 plasma_static_call(parallel_function) \
00763 } else { \
00764 plasma_dynamic_spawn(); \
00765 parallel_function##_quark( \
00766 arg1, \
00767 arg2, \
00768 arg3, \
00769 arg4, \
00770 arg5, \
00771 arg6, \
00772 arg7, \
00773 arg8); \
00774 }
00775
00776 #define plasma_parallel_call_9( \
00777 parallel_function, \
00778 type1, arg1, \
00779 type2, arg2, \
00780 type3, arg3, \
00781 type4, arg4, \
00782 type5, arg5, \
00783 type6, arg6, \
00784 type7, arg7, \
00785 type8, arg8, \
00786 type9, arg9) \
00787 if (PLASMA_SCHEDULING == PLASMA_STATIC_SCHEDULING) { \
00788 plasma_pack_args_9( \
00789 type1, (arg1), \
00790 type2, (arg2), \
00791 type3, (arg3), \
00792 type4, (arg4), \
00793 type5, (arg5), \
00794 type6, (arg6), \
00795 type7, (arg7), \
00796 type8, (arg8), \
00797 type9, (arg9)) \
00798 plasma_static_call(parallel_function) \
00799 } else { \
00800 plasma_dynamic_spawn(); \
00801 parallel_function##_quark( \
00802 arg1, \
00803 arg2, \
00804 arg3, \
00805 arg4, \
00806 arg5, \
00807 arg6, \
00808 arg7, \
00809 arg8, \
00810 arg9); \
00811 }
00812
00813 #define plasma_parallel_call_10( \
00814 parallel_function, \
00815 type1, arg1, \
00816 type2, arg2, \
00817 type3, arg3, \
00818 type4, arg4, \
00819 type5, arg5, \
00820 type6, arg6, \
00821 type7, arg7, \
00822 type8, arg8, \
00823 type9, arg9, \
00824 type10, arg10) \
00825 if (PLASMA_SCHEDULING == PLASMA_STATIC_SCHEDULING) { \
00826 plasma_pack_args_10( \
00827 type1, (arg1), \
00828 type2, (arg2), \
00829 type3, (arg3), \
00830 type4, (arg4), \
00831 type5, (arg5), \
00832 type6, (arg6), \
00833 type7, (arg7), \
00834 type8, (arg8), \
00835 type9, (arg9), \
00836 type10, (arg10)) \
00837 plasma_static_call(parallel_function) \
00838 } else { \
00839 plasma_dynamic_spawn(); \
00840 parallel_function##_quark( \
00841 arg1, \
00842 arg2, \
00843 arg3, \
00844 arg4, \
00845 arg5, \
00846 arg6, \
00847 arg7, \
00848 arg8, \
00849 arg9, \
00850 arg10); \
00851 }
00852
00853
00856 #define plasma_dynamic_call_1( \
00857 parallel_function, \
00858 type1, arg1) \
00859 plasma_dynamic_spawn(); \
00860 parallel_function##_quark( \
00861 arg1); \
00862
00863 #define plasma_dynamic_call_2( \
00864 parallel_function, \
00865 type1, arg1, \
00866 type2, arg2) \
00867 plasma_dynamic_spawn(); \
00868 parallel_function##_quark( \
00869 arg1, \
00870 arg2); \
00871
00872 #define plasma_dynamic_call_3( \
00873 parallel_function, \
00874 type1, arg1, \
00875 type2, arg2, \
00876 type3, arg3) \
00877 plasma_dynamic_spawn(); \
00878 parallel_function##_quark( \
00879 arg1, \
00880 arg2, \
00881 arg3); \
00882
00883 #define plasma_dynamic_call_4( \
00884 parallel_function, \
00885 type1, arg1, \
00886 type2, arg2, \
00887 type3, arg3, \
00888 type4, arg4) \
00889 plasma_dynamic_spawn(); \
00890 parallel_function##_quark( \
00891 arg1, \
00892 arg2, \
00893 arg3, \
00894 arg4); \
00895
00896 #define plasma_dynamic_call_5( \
00897 parallel_function, \
00898 type1, arg1, \
00899 type2, arg2, \
00900 type3, arg3, \
00901 type4, arg4, \
00902 type5, arg5) \
00903 plasma_dynamic_spawn(); \
00904 parallel_function##_quark( \
00905 arg1, \
00906 arg2, \
00907 arg3, \
00908 arg4, \
00909 arg5); \
00910
00911 #define plasma_dynamic_call_6( \
00912 parallel_function, \
00913 type1, arg1, \
00914 type2, arg2, \
00915 type3, arg3, \
00916 type4, arg4, \
00917 type5, arg5, \
00918 type6, arg6) \
00919 plasma_dynamic_spawn(); \
00920 parallel_function##_quark( \
00921 arg1, \
00922 arg2, \
00923 arg3, \
00924 arg4, \
00925 arg5, \
00926 arg6); \
00927
00928 #define plasma_dynamic_call_7( \
00929 parallel_function, \
00930 type1, arg1, \
00931 type2, arg2, \
00932 type3, arg3, \
00933 type4, arg4, \
00934 type5, arg5, \
00935 type6, arg6, \
00936 type7, arg7) \
00937 plasma_dynamic_spawn(); \
00938 parallel_function##_quark( \
00939 arg1, \
00940 arg2, \
00941 arg3, \
00942 arg4, \
00943 arg5, \
00944 arg6, \
00945 arg7); \
00946
00947 #define plasma_dynamic_call_8( \
00948 parallel_function, \
00949 type1, arg1, \
00950 type2, arg2, \
00951 type3, arg3, \
00952 type4, arg4, \
00953 type5, arg5, \
00954 type6, arg6, \
00955 type7, arg7, \
00956 type8, arg8) \
00957 plasma_dynamic_spawn(); \
00958 parallel_function##_quark( \
00959 arg1, \
00960 arg2, \
00961 arg3, \
00962 arg4, \
00963 arg5, \
00964 arg6, \
00965 arg7, \
00966 arg8); \
00967
00968 #define plasma_dynamic_call_9( \
00969 parallel_function, \
00970 type1, arg1, \
00971 type2, arg2, \
00972 type3, arg3, \
00973 type4, arg4, \
00974 type5, arg5, \
00975 type6, arg6, \
00976 type7, arg7, \
00977 type8, arg8, \
00978 type9, arg9) \
00979 plasma_dynamic_spawn(); \
00980 parallel_function##_quark( \
00981 arg1, \
00982 arg2, \
00983 arg3, \
00984 arg4, \
00985 arg5, \
00986 arg6, \
00987 arg7, \
00988 arg8, \
00989 arg9);
00990
00991 #define plasma_dynamic_call_10( \
00992 parallel_function, \
00993 type1, arg1, \
00994 type2, arg2, \
00995 type3, arg3, \
00996 type4, arg4, \
00997 type5, arg5, \
00998 type6, arg6, \
00999 type7, arg7, \
01000 type8, arg8, \
01001 type9, arg9, \
01002 type10, arg10) \
01003 plasma_dynamic_spawn(); \
01004 parallel_function##_quark( \
01005 arg1, \
01006 arg2, \
01007 arg3, \
01008 arg4, \
01009 arg5, \
01010 arg6, \
01011 arg7, \
01012 arg8, \
01013 arg9, \
01014 arg10);
01015
01016
01019 #define plasma_unpack_args_1( \
01020 arg1) \
01021 { \
01022 unsigned char *plasma_ptr = plasma->args_buff; \
01023 memcpy(&arg1, plasma_ptr, sizeof(arg1)); plasma_ptr += sizeof(arg1); \
01024 }
01025
01026 #define plasma_unpack_args_2( \
01027 arg1, \
01028 arg2) \
01029 { \
01030 unsigned char *plasma_ptr = plasma->args_buff; \
01031 memcpy(&arg1, plasma_ptr, sizeof(arg1)); plasma_ptr += sizeof(arg1); \
01032 memcpy(&arg2, plasma_ptr, sizeof(arg2)); plasma_ptr += sizeof(arg2); \
01033 }
01034
01035 #define plasma_unpack_args_3( \
01036 arg1, \
01037 arg2, \
01038 arg3) \
01039 { \
01040 unsigned char *plasma_ptr = plasma->args_buff; \
01041 memcpy(&arg1, plasma_ptr, sizeof(arg1)); plasma_ptr += sizeof(arg1); \
01042 memcpy(&arg2, plasma_ptr, sizeof(arg2)); plasma_ptr += sizeof(arg2); \
01043 memcpy(&arg3, plasma_ptr, sizeof(arg3)); plasma_ptr += sizeof(arg3); \
01044 }
01045
01046 #define plasma_unpack_args_4( \
01047 arg1, \
01048 arg2, \
01049 arg3, \
01050 arg4) \
01051 { \
01052 unsigned char *plasma_ptr = plasma->args_buff; \
01053 memcpy(&arg1, plasma_ptr, sizeof(arg1)); plasma_ptr += sizeof(arg1); \
01054 memcpy(&arg2, plasma_ptr, sizeof(arg2)); plasma_ptr += sizeof(arg2); \
01055 memcpy(&arg3, plasma_ptr, sizeof(arg3)); plasma_ptr += sizeof(arg3); \
01056 memcpy(&arg4, plasma_ptr, sizeof(arg4)); plasma_ptr += sizeof(arg4); \
01057 }
01058
01059 #define plasma_unpack_args_5( \
01060 arg1, \
01061 arg2, \
01062 arg3, \
01063 arg4, \
01064 arg5) \
01065 { \
01066 unsigned char *plasma_ptr = plasma->args_buff; \
01067 memcpy(&arg1, plasma_ptr, sizeof(arg1)); plasma_ptr += sizeof(arg1); \
01068 memcpy(&arg2, plasma_ptr, sizeof(arg2)); plasma_ptr += sizeof(arg2); \
01069 memcpy(&arg3, plasma_ptr, sizeof(arg3)); plasma_ptr += sizeof(arg3); \
01070 memcpy(&arg4, plasma_ptr, sizeof(arg4)); plasma_ptr += sizeof(arg4); \
01071 memcpy(&arg5, plasma_ptr, sizeof(arg5)); plasma_ptr += sizeof(arg5); \
01072 }
01073
01074 #define plasma_unpack_args_6( \
01075 arg1, \
01076 arg2, \
01077 arg3, \
01078 arg4, \
01079 arg5, \
01080 arg6) \
01081 { \
01082 unsigned char *plasma_ptr = plasma->args_buff; \
01083 memcpy(&arg1, plasma_ptr, sizeof(arg1)); plasma_ptr += sizeof(arg1); \
01084 memcpy(&arg2, plasma_ptr, sizeof(arg2)); plasma_ptr += sizeof(arg2); \
01085 memcpy(&arg3, plasma_ptr, sizeof(arg3)); plasma_ptr += sizeof(arg3); \
01086 memcpy(&arg4, plasma_ptr, sizeof(arg4)); plasma_ptr += sizeof(arg4); \
01087 memcpy(&arg5, plasma_ptr, sizeof(arg5)); plasma_ptr += sizeof(arg5); \
01088 memcpy(&arg6, plasma_ptr, sizeof(arg6)); plasma_ptr += sizeof(arg6); \
01089 }
01090
01091 #define plasma_unpack_args_7( \
01092 arg1, \
01093 arg2, \
01094 arg3, \
01095 arg4, \
01096 arg5, \
01097 arg6, \
01098 arg7) \
01099 { \
01100 unsigned char *plasma_ptr = plasma->args_buff; \
01101 memcpy(&arg1, plasma_ptr, sizeof(arg1)); plasma_ptr += sizeof(arg1); \
01102 memcpy(&arg2, plasma_ptr, sizeof(arg2)); plasma_ptr += sizeof(arg2); \
01103 memcpy(&arg3, plasma_ptr, sizeof(arg3)); plasma_ptr += sizeof(arg3); \
01104 memcpy(&arg4, plasma_ptr, sizeof(arg4)); plasma_ptr += sizeof(arg4); \
01105 memcpy(&arg5, plasma_ptr, sizeof(arg5)); plasma_ptr += sizeof(arg5); \
01106 memcpy(&arg6, plasma_ptr, sizeof(arg6)); plasma_ptr += sizeof(arg6); \
01107 memcpy(&arg7, plasma_ptr, sizeof(arg7)); plasma_ptr += sizeof(arg7); \
01108 }
01109
01110 #define plasma_unpack_args_8( \
01111 arg1, \
01112 arg2, \
01113 arg3, \
01114 arg4, \
01115 arg5, \
01116 arg6, \
01117 arg7, \
01118 arg8) \
01119 { \
01120 unsigned char *plasma_ptr = plasma->args_buff; \
01121 memcpy(&arg1, plasma_ptr, sizeof(arg1)); plasma_ptr += sizeof(arg1); \
01122 memcpy(&arg2, plasma_ptr, sizeof(arg2)); plasma_ptr += sizeof(arg2); \
01123 memcpy(&arg3, plasma_ptr, sizeof(arg3)); plasma_ptr += sizeof(arg3); \
01124 memcpy(&arg4, plasma_ptr, sizeof(arg4)); plasma_ptr += sizeof(arg4); \
01125 memcpy(&arg5, plasma_ptr, sizeof(arg5)); plasma_ptr += sizeof(arg5); \
01126 memcpy(&arg6, plasma_ptr, sizeof(arg6)); plasma_ptr += sizeof(arg6); \
01127 memcpy(&arg7, plasma_ptr, sizeof(arg7)); plasma_ptr += sizeof(arg7); \
01128 memcpy(&arg8, plasma_ptr, sizeof(arg8)); plasma_ptr += sizeof(arg8); \
01129 }
01130
01131 #define plasma_unpack_args_9( \
01132 arg1, \
01133 arg2, \
01134 arg3, \
01135 arg4, \
01136 arg5, \
01137 arg6, \
01138 arg7, \
01139 arg8, \
01140 arg9) \
01141 { \
01142 unsigned char *plasma_ptr = plasma->args_buff; \
01143 memcpy(&arg1, plasma_ptr, sizeof(arg1)); plasma_ptr += sizeof(arg1); \
01144 memcpy(&arg2, plasma_ptr, sizeof(arg2)); plasma_ptr += sizeof(arg2); \
01145 memcpy(&arg3, plasma_ptr, sizeof(arg3)); plasma_ptr += sizeof(arg3); \
01146 memcpy(&arg4, plasma_ptr, sizeof(arg4)); plasma_ptr += sizeof(arg4); \
01147 memcpy(&arg5, plasma_ptr, sizeof(arg5)); plasma_ptr += sizeof(arg5); \
01148 memcpy(&arg6, plasma_ptr, sizeof(arg6)); plasma_ptr += sizeof(arg6); \
01149 memcpy(&arg7, plasma_ptr, sizeof(arg7)); plasma_ptr += sizeof(arg7); \
01150 memcpy(&arg8, plasma_ptr, sizeof(arg8)); plasma_ptr += sizeof(arg8); \
01151 memcpy(&arg9, plasma_ptr, sizeof(arg9)); plasma_ptr += sizeof(arg9); \
01152 }
01153
01154 #define plasma_unpack_args_10( \
01155 arg1, \
01156 arg2, \
01157 arg3, \
01158 arg4, \
01159 arg5, \
01160 arg6, \
01161 arg7, \
01162 arg8, \
01163 arg9, \
01164 arg10) \
01165 { \
01166 unsigned char *plasma_ptr = plasma->args_buff; \
01167 memcpy(&arg1, plasma_ptr, sizeof(arg1)); plasma_ptr += sizeof(arg1); \
01168 memcpy(&arg2, plasma_ptr, sizeof(arg2)); plasma_ptr += sizeof(arg2); \
01169 memcpy(&arg3, plasma_ptr, sizeof(arg3)); plasma_ptr += sizeof(arg3); \
01170 memcpy(&arg4, plasma_ptr, sizeof(arg4)); plasma_ptr += sizeof(arg4); \
01171 memcpy(&arg5, plasma_ptr, sizeof(arg5)); plasma_ptr += sizeof(arg5); \
01172 memcpy(&arg6, plasma_ptr, sizeof(arg6)); plasma_ptr += sizeof(arg6); \
01173 memcpy(&arg7, plasma_ptr, sizeof(arg7)); plasma_ptr += sizeof(arg7); \
01174 memcpy(&arg8, plasma_ptr, sizeof(arg8)); plasma_ptr += sizeof(arg8); \
01175 memcpy(&arg9, plasma_ptr, sizeof(arg9)); plasma_ptr += sizeof(arg9); \
01176 memcpy(&arg10, plasma_ptr, sizeof(arg10)); plasma_ptr += sizeof(arg10); \
01177 }
01178 #endif