本文整理汇总了C++中MPI_Win_lock函数的典型用法代码示例。如果您正苦于以下问题:C++ MPI_Win_lock函数的具体用法?C++ MPI_Win_lock怎么用?C++ MPI_Win_lock使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了MPI_Win_lock函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: main
int main(int argc, char *argv[])
{
MPI_Win win;
int flag, tmp, rank;
int base[1024], errs = 0;
MPI_Request req;
MTest_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Win_create(base, 1024 * sizeof(int), sizeof(int), MPI_INFO_NULL, MPI_COMM_WORLD, &win);
if (rank == 0) {
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, 0, win);
MPI_Barrier(MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
MPI_Win_unlock(0, win);
} else {
MPI_Barrier(MPI_COMM_WORLD);
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, 0, win);
MPI_Rput(&tmp, 1, MPI_INT, 0, 0, 1, MPI_INT, win, &req);
MPI_Test(&req, &flag, MPI_STATUS_IGNORE);
MPI_Barrier(MPI_COMM_WORLD);
MPI_Win_unlock(0, win);
}
MPI_Win_free(&win);
MTest_Finalize(errs);
return MTestReturnValue(errs);
}
开发者ID:jeffhammond,项目名称:mpich,代码行数:31,代码来源:nb_test.c
示例2: main
int main(int argc, char **argv) {
int i, rank, nproc, mpi_type_size;
int errors = 0, all_errors = 0;
TYPE_C *val_ptr, *res_ptr;
MPI_Win win;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &nproc);
MPI_Type_size(TYPE_MPI, &mpi_type_size);
assert(mpi_type_size == sizeof(TYPE_C));
val_ptr = malloc(sizeof(TYPE_C)*nproc);
res_ptr = malloc(sizeof(TYPE_C)*nproc);
MPI_Win_create(val_ptr, sizeof(TYPE_C)*nproc, sizeof(TYPE_C), MPI_INFO_NULL, MPI_COMM_WORLD, &win);
/* Test self communication */
reset_vars(val_ptr, res_ptr, win);
for (i = 0; i < ITER; i++) {
TYPE_C one = 1, result = -1;
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, win);
MPI_Fetch_and_op(&one, &result, TYPE_MPI, rank, 0, MPI_SUM, win);
MPI_Win_unlock(rank, win);
}
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, win);
if ( CMP(val_ptr[0], ITER) ) {
SQUELCH( printf("%d->%d -- SELF: expected "TYPE_FMT", got "TYPE_FMT"\n", rank, rank, (TYPE_C) ITER, val_ptr[0]); );
errors++;
}
开发者ID:Julio-Anjos,项目名称:simgrid,代码行数:35,代码来源:fetch_and_op.c
示例3: main
int main(int argc, char *argv[])
{
int rank, nprocs, A[SIZE2], B[SIZE2], i;
MPI_Win win;
int errs = 0;
MTest_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&nprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
if (nprocs != 2) {
printf("Run this program with 2 processes\n");
MPI_Abort(MPI_COMM_WORLD,1);
}
if (rank == 0) {
for (i=0; i<SIZE2; i++) A[i] = B[i] = i;
MPI_Win_create(NULL, 0, 1, MPI_INFO_NULL, MPI_COMM_WORLD, &win);
for (i=0; i<SIZE1; i++) {
MPI_Win_lock(MPI_LOCK_SHARED, 1, 0, win);
MPI_Put(A+i, 1, MPI_INT, 1, i, 1, MPI_INT, win);
MPI_Win_unlock(1, win);
}
for (i=0; i<SIZE1; i++) {
MPI_Win_lock(MPI_LOCK_SHARED, 1, 0, win);
MPI_Get(B+i, 1, MPI_INT, 1, SIZE1+i, 1, MPI_INT, win);
MPI_Win_unlock(1, win);
}
MPI_Win_free(&win);
for (i=0; i<SIZE1; i++)
if (B[i] != (-4)*(i+SIZE1)) {
printf("Get Error: B[%d] is %d, should be %d\n", i, B[i], (-4)*(i+SIZE1));
errs++;
}
}
else { /* rank=1 */
for (i=0; i<SIZE2; i++) B[i] = (-4)*i;
MPI_Win_create(B, SIZE2*sizeof(int), sizeof(int), MPI_INFO_NULL,
MPI_COMM_WORLD, &win);
MPI_Win_free(&win);
for (i=0; i<SIZE1; i++) {
if (B[i] != i) {
printf("Put Error: B[%d] is %d, should be %d\n", i, B[i], i);
errs++;
}
}
}
/* if (rank==0) printf("Done\n");*/
MTest_Finalize(errs);
MPI_Finalize();
return 0;
}
开发者ID:huangjun-pg,项目名称:mpich2-yarn,代码行数:60,代码来源:test4.c
示例4: read_last_task_own
int read_last_task_own( task_type_unit * task0, int target_rank) // queue_del
{
// return codes:
// 0 - element read
// 1 - q is empty
int ret = 0;
int iamfree = 0;
int my_offset;
int i;
while(iamfree == 0 ) //try to lock offs window putting -2 value
{
MPI_Win_lock( MPI_LOCK_EXCLUSIVE, target_rank, 0, win_offs );
my_offset = OFFSET[0];
OFFSET[0] = lock;
MPI_Win_unlock( target_rank, win_offs );
if(my_offset >= -1) //if the window was not locked before
{
iamfree = 1;
}
}
// offs window is now locked by me! work!
if(my_offset == -1) //q is empty
{
ret = 1;
}
else
{
// get params
//if(ts_logging==1)
{
sched_log_file = fopen(sched_log,"a");
fprintf(sched_log_file, "[%f] Take task N %d\n", MPI_Wtime(), my_offset);
fclose(sched_log_file);
}
MPI_Win_lock( MPI_LOCK_EXCLUSIVE, target_rank, 0, win_q ); //lock the q
for(i=0; i<task_type_length; i++)
{
task0[i] = QUEUE[task_type_length * my_offset + i]; // or use memcpy
}
MPI_Win_unlock( target_rank, win_q );
my_offset--;
}
MPI_Win_lock( MPI_LOCK_EXCLUSIVE, target_rank, 0, win_offs );
OFFSET[0] = my_offset; //UNBLOCK OFFSET win (put proper offs val - either changed or not)
MPI_Win_unlock( target_rank, win_offs );
return(ret);
}
开发者ID:Tondar,项目名称:PSE-WS15-16-Team17,代码行数:55,代码来源:scheduler.c
示例5: test_put
void test_put(void)
{
int me, nproc;
MPI_Comm_size(MPI_COMM_WORLD, &nproc);
MPI_Comm_rank(MPI_COMM_WORLD, &me);
MPI_Win dst_win;
double *dst_buf;
double src_buf[MAXELEMS];
int i, j;
MPI_Alloc_mem(sizeof(double) * nproc * MAXELEMS, MPI_INFO_NULL, &dst_buf);
MPI_Win_create(dst_buf, sizeof(double) * nproc * MAXELEMS, 1, MPI_INFO_NULL, MPI_COMM_WORLD,
&dst_win);
for (i = 0; i < MAXELEMS; i++)
src_buf[i] = me + 1.0;
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, me, 0, dst_win);
for (i = 0; i < nproc * MAXELEMS; i++)
dst_buf[i] = 0.0;
MPI_Win_unlock(me, dst_win);
MPI_Barrier(MPI_COMM_WORLD);
for (i = 0; i < nproc; i++) {
int target = i;
for (j = 0; j < COUNT; j++) {
if (verbose)
printf("%2d -> %2d [%2d]\n", me, target, j);
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, target, 0, dst_win);
MPI_Put(&src_buf[j], sizeof(double), MPI_BYTE, target,
(me * MAXELEMS + j) * sizeof(double), sizeof(double), MPI_BYTE, dst_win);
MPI_Win_unlock(target, dst_win);
}
for (j = 0; j < COUNT; j++) {
if (verbose)
printf("%2d <- %2d [%2d]\n", me, target, j);
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, target, 0, dst_win);
MPI_Get(&src_buf[j], sizeof(double), MPI_BYTE, target,
(me * MAXELEMS + j) * sizeof(double), sizeof(double), MPI_BYTE, dst_win);
MPI_Win_unlock(target, dst_win);
}
}
MPI_Barrier(MPI_COMM_WORLD);
MPI_Win_free(&dst_win);
MPI_Free_mem(dst_buf);
}
开发者ID:mpoquet,项目名称:simgrid,代码行数:53,代码来源:contention_putget.c
示例6: main
int main(int argc, char **argv)
{
int i, j, rank, nranks, peer, bufsize, errors;
double *buffer, *src_buf;
MPI_Win buf_win;
MTest_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &nranks);
bufsize = XDIM * YDIM * sizeof(double);
MPI_Alloc_mem(bufsize, MPI_INFO_NULL, &buffer);
MPI_Alloc_mem(bufsize, MPI_INFO_NULL, &src_buf);
for (i = 0; i < XDIM * YDIM; i++) {
*(buffer + i) = 1.0 + rank;
*(src_buf + i) = 1.0 + rank;
}
MPI_Win_create(buffer, bufsize, 1, MPI_INFO_NULL, MPI_COMM_WORLD, &buf_win);
peer = (rank + 1) % nranks;
for (i = 0; i < ITERATIONS; i++) {
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, peer, 0, buf_win);
for (j = 0; j < YDIM; j++) {
MPI_Accumulate(src_buf + j * XDIM, XDIM, MPI_DOUBLE, peer,
j * XDIM * sizeof(double), XDIM, MPI_DOUBLE, MPI_SUM, buf_win);
}
MPI_Win_unlock(peer, buf_win);
}
MPI_Barrier(MPI_COMM_WORLD);
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, buf_win);
for (i = errors = 0; i < XDIM; i++) {
for (j = 0; j < YDIM; j++) {
const double actual = *(buffer + i + j * XDIM);
const double expected =
(1.0 + rank) + (1.0 + ((rank + nranks - 1) % nranks)) * (ITERATIONS);
if (fabs(actual - expected) > 1.0e-10) {
SQUELCH(printf("%d: Data validation failed at [%d, %d] expected=%f actual=%f\n",
rank, j, i, expected, actual););
errors++;
fflush(stdout);
}
}
开发者ID:jeffhammond,项目名称:mpich,代码行数:51,代码来源:strided_acc_onelock.c
示例7: ARMCIX_Lock_hdl
/** Lock a mutex.
*
* @param[in] hdl Mutex group that the mutex belongs to.
* @param[in] mutex Desired mutex number [0..count-1]
* @param[in] world_proc Absolute ID of process where the mutex lives
*/
void ARMCIX_Lock_hdl(armcix_mutex_hdl_t hdl, int mutex, int world_proc) {
int rank, nproc, proc;
long lock_val, unlock_val, lock_out;
int timeout = 1;
MPI_Comm_rank(hdl->comm, &rank);
MPI_Comm_size(hdl->comm, &nproc);
/* User gives us the absolute ID. Translate to the rank in the mutex's group. */
proc = ARMCII_Translate_absolute_to_group(hdl->comm, world_proc);
ARMCII_Assert(proc >= 0);
lock_val = rank+1; // Map into range 1..nproc
unlock_val = -1 * (rank+1);
/* mutex <- mutex + rank */
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, proc, 0, hdl->window);
MPI_Accumulate(&lock_val, 1, MPI_LONG, proc, mutex, 1, MPI_LONG, MPI_SUM, hdl->window);
MPI_Win_unlock(proc, hdl->window);
for (;;) {
/* read mutex value */
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, proc, 0, hdl->window);
MPI_Get(&lock_out, 1, MPI_LONG, proc, mutex, 1, MPI_LONG, hdl->window);
MPI_Win_unlock(proc, hdl->window);
ARMCII_Assert(lock_out > 0);
ARMCII_Assert(lock_out <= nproc*(nproc+1)/2); // Must be < sum of all ranks
/* We are holding the mutex */
if (lock_out == rank+1)
break;
/* mutex <- mutex - rank */
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, proc, 0, hdl->window);
MPI_Accumulate(&unlock_val, 1, MPI_LONG, proc, mutex, 1, MPI_LONG, MPI_SUM, hdl->window);
MPI_Win_unlock(proc, hdl->window);
/* Exponential backoff */
usleep(timeout + rand()%timeout);
timeout = MIN(timeout*TIMEOUT_MUL, MAX_TIMEOUT);
if (rand() % nproc == 0) // Chance to reset timeout
timeout = 1;
/* mutex <- mutex + rank */
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, proc, 0, hdl->window);
MPI_Accumulate(&lock_val, 1, MPI_LONG, proc, mutex, 1, MPI_LONG, MPI_SUM, hdl->window);
MPI_Win_unlock(proc, hdl->window);
}
}
开发者ID:jeffhammond,项目名称:armci-mpi,代码行数:56,代码来源:mutex_hdl_spin.c
示例8: main
int main( int argc, char *argv[] )
{
int errs = 0;
int rank, size, i;
MPI_Comm comm;
MPI_Win win;
int *winbuf, count;
MTest_Init( &argc, &argv );
comm = MPI_COMM_WORLD;
MPI_Comm_rank( comm, &rank );
MPI_Comm_size( comm, &size );
/* Allocate and initialize buf */
count = 1000;
MPI_Alloc_mem( count*sizeof(int), MPI_INFO_NULL, &winbuf );
MPI_Win_create( winbuf, count * sizeof(int), sizeof(int), MPI_INFO_NULL,
comm, &win );
/* Clear winbuf */
memset( winbuf, 0, count*sizeof(int) );
/* Note that for i == rank, this is a useful operation - it allows
the programmer to use direct loads and stores, rather than
put/get/accumulate, to access the local memory window. */
for (i=0; i<size; i++) {
MPI_Win_lock( MPI_LOCK_EXCLUSIVE, i, 0, win );
MPI_Win_unlock( i, win );
}
for (i=0; i<size; i++) {
MPI_Win_lock( MPI_LOCK_SHARED, i, 0, win );
MPI_Win_unlock( i, win );
}
MPI_Win_free( &win );
MPI_Free_mem( winbuf );
/* If this test completes, no error has been found */
/* A more complete test may ensure that local locks in fact block
remote, exclusive locks */
MTest_Finalize( errs );
MPI_Finalize();
return 0;
}
开发者ID:Julio-Anjos,项目名称:simgrid,代码行数:50,代码来源:locknull.c
示例9: main
int main(int argc, char *argv[])
{
int rank, nprocs, A[SIZE2], B[SIZE2], i, j;
MPI_Comm CommDeuce;
MPI_Win win;
int errs = 0;
MTest_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (nprocs < 2) {
printf("Run this program with 2 or more processes\n");
MPI_Abort(MPI_COMM_WORLD, 1);
}
MPI_Comm_split(MPI_COMM_WORLD, (rank < 2), rank, &CommDeuce);
if (rank < 2) {
if (rank == 0) {
for (i = 0; i < SIZE2; i++)
A[i] = B[i] = i;
MPI_Win_create(NULL, 0, 1, MPI_INFO_NULL, CommDeuce, &win);
for (j = 0; j < 2; j++) {
for (i = 0; i < SIZE1; i++) {
MPI_Win_lock(MPI_LOCK_SHARED, 1, j == 0 ? 0 : MPI_MODE_NOCHECK, win);
MPI_Put(A + i, 1, MPI_INT, 1, i, 1, MPI_INT, win);
MPI_Win_unlock(1, win);
}
for (i = 0; i < SIZE1; i++) {
MPI_Win_lock(MPI_LOCK_SHARED, 1, j == 0 ? 0 : MPI_MODE_NOCHECK, win);
MPI_Get(B + i, 1, MPI_INT, 1, SIZE1 + i, 1, MPI_INT, win);
MPI_Win_unlock(1, win);
}
}
MPI_Win_free(&win);
for (i = 0; i < SIZE1; i++)
if (B[i] != (-4) * (i + SIZE1)) {
SQUELCH(printf
("Get Error: B[%d] is %d, should be %d\n", i, B[i],
(-4) * (i + SIZE1)););
errs++;
}
}
开发者ID:NexMirror,项目名称:MPICH,代码行数:48,代码来源:test4.c
示例10: MPI_Comm_rank
void MPIMutex::lock(int proc) {
int rank, nproc, already_locked;
MPI_Comm_rank(comm, &rank);
MPI_Comm_size(comm, &nproc);
//std::cout << "trying to get lock" << std::endl;
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, proc, 0, win);
byte *buff = (byte*)malloc(sizeof(byte)*nproc);
buff[rank] = 1;
MPI_Put(&(buff[rank]), 1, MPI_BYTE, proc, rank, 1, MPI_BYTE, win);
/* Get data to the left of rank */
if (rank > 0) {
MPI_Get(buff, rank, MPI_BYTE, proc, 0, rank, MPI_BYTE, win);
}
/* Get data to the right of rank */
if (rank < nproc - 1) {
MPI_Get(&(buff[rank+1]), nproc-1-rank, MPI_BYTE, proc, rank+1, nproc-1-rank,
MPI_BYTE, win);
}
MPI_Win_unlock(proc, win);
/* check if anyone has the lock*/
for (int i = already_locked = 0; i < nproc; i++)
if (buff[i] && i != rank)
already_locked = 1;
/* Wait for notification */
if (already_locked) {
MPI_Status status;
//std::cout << "waiting for notification [proc = "<<proc<<"]" << std::endl;
MPI_Recv(NULL, 0, MPI_BYTE, MPI_ANY_SOURCE, MPI_MUTEX_TAG+id, comm, &status);
}
//std::cout << "lock acquired [proc = "<<proc<<"]" << std::endl;
free(buff);
};
开发者ID:atrantan,项目名称:Distributed-Futures,代码行数:34,代码来源:MPIMutex.cpp
示例11: main
int main(int argc, char **argv)
{
int rank, nproc;
int out_val, i, counter = 0;
MPI_Win win;
MTest_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &nproc);
MPI_Win_create(&counter, sizeof(int), sizeof(int), MPI_INFO_NULL, MPI_COMM_WORLD, &win);
for (i = 0; i < NITER; i++) {
MPI_Win_lock(MPI_LOCK_SHARED, rank, 0, win);
MPI_Get_accumulate(&acc_val, 1, MPI_INT, &out_val, 1, MPI_INT,
rank, 0, 1, MPI_INT, MPI_SUM, win);
MPI_Win_unlock(rank, win);
if (out_val != acc_val * i) {
errs++;
printf("Error: got %d, expected %d at iter %d\n", out_val, acc_val * i, i);
break;
}
}
MPI_Win_free(&win);
MTest_Finalize(errs);
return MTestReturnValue(errs);
}
开发者ID:jeffhammond,项目名称:mpich,代码行数:32,代码来源:get_acc_local.c
示例12: run_fop_with_lock
/*Run FOP with Lock/unlock */
void run_fop_with_lock(int rank, WINDOW type)
{
int i;
MPI_Aint disp = 0;
MPI_Win win;
allocate_atomic_memory(rank, sbuf_original, rbuf_original,
tbuf_original, NULL, (char **)&sbuf, (char **)&rbuf,
(char **)&tbuf, NULL, (char **)&rbuf, MAX_MSG_SIZE, type, &win);
if(rank == 0) {
if (type == WIN_DYNAMIC) {
disp = disp_remote;
}
for (i = 0; i < skip + loop; i++) {
if (i == skip) {
t_start = MPI_Wtime ();
}
MPI_CHECK(MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 1, 0, win));
MPI_CHECK(MPI_Fetch_and_op(sbuf, tbuf, MPI_LONG_LONG, 1, disp, MPI_SUM, win));
MPI_CHECK(MPI_Win_unlock(1, win));
}
t_end = MPI_Wtime ();
}
MPI_CHECK(MPI_Barrier(MPI_COMM_WORLD));
print_latency(rank, 8);
free_atomic_memory (sbuf, rbuf, tbuf, NULL, win, rank);
}
开发者ID:Cai900205,项目名称:test,代码行数:33,代码来源:osu_fop_latency.c
示例13: MPI_Win_lock
inline void SpParHelper::LockWindows(int ownind, vector<MPI_Win> & arrwin)
{
for(vector<MPI_Win>::iterator itr = arrwin.begin(); itr != arrwin.end(); ++itr)
{
MPI_Win_lock(MPI_LOCK_SHARED, ownind, 0, *itr);
}
}
开发者ID:Aguomath,项目名称:CombBLAS_15,代码行数:7,代码来源:SpParHelper.cpp
示例14: Java_mpi_Win_lock
/*
* Class: mpi_Win
* Method: lock
* Signature: (JIII)V
*/
JNIEXPORT void JNICALL Java_mpi_Win_lock(
JNIEnv *env, jobject jthis, jlong win,
jint lockType, jint rank, jint assertion)
{
int rc = MPI_Win_lock(lockType, rank, assertion, (MPI_Win)win);
ompi_java_exceptionCheck(env, rc);
}
开发者ID:jimmycao,项目名称:ompi-mirror-try,代码行数:12,代码来源:mpi_Win.c
示例15: main
int main(int argc, char *argv[])
{
int rank, nproc;
int errors = 0, all_errors = 0;
int buf, my_buf;
MPI_Win win;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &nproc);
MPI_Win_create(&buf, sizeof(int), sizeof(int),
MPI_INFO_NULL, MPI_COMM_WORLD, &win);
MPI_Win_set_errhandler(win, MPI_ERRORS_RETURN);
MPI_Win_fence(0, win);
MPI_Win_lock(MPI_LOCK_SHARED, 0, MPI_MODE_NOCHECK, win);
MPI_Get(&my_buf, 1, MPI_INT, 0, 0, 1, MPI_INT, win);
MPI_Win_unlock(0, win);
/* This should fail because the window is no longer in a fence epoch */
CHECK_ERR(MPI_Get(&my_buf, 1, MPI_INT, 0, 0, 1, MPI_INT, win));
MPI_Win_fence(0, win);
MPI_Win_free(&win);
MPI_Reduce(&errors, &all_errors, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
if (rank == 0 && all_errors == 0) printf(" No Errors\n");
MPI_Finalize();
return 0;
}
开发者ID:abhinavvishnu,项目名称:matex,代码行数:35,代码来源:win_sync_lock_fence.c
示例16: add_element_unsorted
void add_element_unsorted( task_type task0, int rank )
{
int iamfree = 0;
int my_offset;
int i;
while(iamfree == 0) //try to lock offs window putting -2 value
{
MPI_Win_lock( MPI_LOCK_EXCLUSIVE, rank, 0, win_offs );
my_offset = OFFSET[0];
OFFSET[0] = lock;
MPI_Win_unlock( rank, win_offs );
if(my_offset >= -1) //if the window was not locked before
{
iamfree = 1;
}
}
//if(ts_logging==1)
{
sched_log_file = fopen(sched_log,"a");
fprintf(sched_log_file, "[%f] Adding task [%3.1f][%6.4f] to my queue\n", MPI_Wtime(), task0[0], task0[1]);
fclose(sched_log_file);
}
my_offset++;
MPI_Win_lock( MPI_LOCK_EXCLUSIVE, rank, 0, win_q ); //lock the q
for(i=0; i<task_type_length; i++)
{
QUEUE[task_type_length * my_offset + i] = task0[i]; // or use memcpy
}
MPI_Win_unlock( rank, win_q );
//if(ts_logging==1)
{
sched_log_file = fopen(sched_log,"a");
fprintf(sched_log_file, "[%f] New number of tasks is N %d\n", MPI_Wtime(), my_offset);
fclose(sched_log_file);
}
MPI_Win_lock( MPI_LOCK_EXCLUSIVE, rank, 0, win_offs );
OFFSET[0] = my_offset;
MPI_Win_unlock( rank, win_offs );
}
开发者ID:Tondar,项目名称:PSE-WS15-16-Team17,代码行数:46,代码来源:scheduler.c
示例17: main
int main(int argc, char **argv)
{
int rank, size;
MPI_Win win = MPI_WIN_NULL;
int *baseptr = NULL;
int errs = 0, mpi_errno = MPI_SUCCESS;
int val1 = 0, val2 = 0, flag = 0;
MPI_Request reqs[2];
MPI_Status stats[2];
MTest_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN);
MPI_Win_allocate(2 * sizeof(int), sizeof(int), MPI_INFO_NULL, MPI_COMM_WORLD, &baseptr, &win);
/* Initialize window buffer */
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, win);
baseptr[0] = 1;
baseptr[1] = 2;
MPI_Win_unlock(rank, win);
MPI_Barrier(MPI_COMM_WORLD);
/* Issue request-based get with testall. */
MPI_Win_lock_all(0, win);
MPI_Rget(&val1, 1, MPI_INT, 0, 0, 1, MPI_INT, win, &reqs[0]);
MPI_Rget(&val2, 1, MPI_INT, 0, 1, 1, MPI_INT, win, &reqs[1]);
do {
mpi_errno = MPI_Testall(2, reqs, &flag, stats);
} while (flag == 0);
/* Check get value. */
if (val1 != 1 || val2 != 2) {
printf("%d - Got val1 = %d, val2 = %d, expected 1, 2\n", rank, val1, val2);
fflush(stdout);
errs++;
}
/* Check return error code. */
if (mpi_errno != MPI_SUCCESS) {
printf("%d - Got return errno %d, expected MPI_SUCCESS(%d)\n",
rank, mpi_errno, MPI_SUCCESS);
fflush(stdout);
errs++;
}
MPI_Win_unlock_all(win);
MPI_Barrier(MPI_COMM_WORLD);
MPI_Win_free(&win);
MTest_Finalize(errs);
MPI_Finalize();
return errs != 0;
}
开发者ID:mpoquet,项目名称:simgrid,代码行数:58,代码来源:rget-testall.c
示例18: main
int main(int argc, char **argv) {
int i, rank, nproc;
int errors = 0, all_errors = 0;
TYPE_C *win_ptr, *res_ptr, *val_ptr;
MPI_Win win;
#if defined (GACC_TYPE_DERIVED)
MPI_Datatype derived_type;
#endif
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &nproc);
win_ptr = malloc(sizeof(TYPE_C)*nproc*COUNT);
res_ptr = malloc(sizeof(TYPE_C)*nproc*COUNT);
val_ptr = malloc(sizeof(TYPE_C)*COUNT);
#if defined (GACC_TYPE_DERIVED)
MPI_Type_contiguous(1, TYPE_MPI_BASE, &derived_type);
MPI_Type_commit(&derived_type);
#endif
MPI_Win_create(win_ptr, sizeof(TYPE_C)*nproc*COUNT, sizeof(TYPE_C),
MPI_INFO_NULL, MPI_COMM_WORLD, &win);
/* Test self communication */
reset_bufs(win_ptr, res_ptr, val_ptr, 1, win);
for (i = 0; i < ITER; i++) {
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, win);
MPI_Get_accumulate(val_ptr, COUNT, TYPE_MPI, res_ptr, COUNT, TYPE_MPI,
rank, 0, COUNT, TYPE_MPI, MPI_SUM, win);
MPI_Win_unlock(rank, win);
}
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, win);
for (i = 0; i < COUNT; i++) {
if (win_ptr[i] != ITER) {
SQUELCH( printf("%d->%d -- SELF[%d]: expected "TYPE_FMT", got "TYPE_FMT"\n",
rank, rank, i, (TYPE_C) ITER, win_ptr[i]); );
errors++;
}
开发者ID:Julio-Anjos,项目名称:simgrid,代码行数:44,代码来源:get_accumulate.c
示例19: run_test
static int run_test()
{
int i, x, errs = 0, errs_total = 0;
MPI_Status stat;
int dst;
int winbuf_offset = 0;
double t0, avg_total_time = 0.0, t_total = 0.0;
double sum = 0.0;
dst = 1;
if (rank == 0) {
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, dst, MPI_MODE_NOCHECK, win);
DO_OP_LOOP(dst, SKIP);
MPI_Win_unlock(dst, win);
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, dst, MPI_MODE_NOCHECK, win);
t0 = MPI_Wtime();
DO_OP_LOOP(dst, ITER);
t_total = (MPI_Wtime() - t0) * 1000 * 1000; /*us */
t_total /= ITER;
MPI_Win_unlock(dst, win);
}
MPI_Barrier(MPI_COMM_WORLD);
if (rank == 0) {
#ifdef MTCORE
fprintf(stdout, "mtcore: iter %d %s num_op %d opsize %d nprocs %d nh %d total_time %.2lf\n",
ITER, OP_TYPE_NM[OP_TYPE], NOP, OP_SIZE, nprocs, MTCORE_NUM_H, t_total);
#else
fprintf(stdout, "orig: iter %d %s num_op %d opsize %d nprocs %d total_time %.2lf\n",
ITER, OP_TYPE_NM[OP_TYPE], NOP, OP_SIZE, nprocs, t_total);
#endif
}
exit:
return errs_total;
}
开发者ID:monicasee,项目名称:mpich.git.asp,代码行数:42,代码来源:op_overhead.c
示例20: MPIX_Mutex_lock
/** Lock a mutex.
*
* @param[in] hdl Mutex group that the mutex belongs to
* @param[in] mutex Desired mutex number [0..count-1]
* @param[in] proc Rank of process where the mutex lives
* @return MPI status
*/
int MPIX_Mutex_lock(MPIX_Mutex hdl, int mutex, int proc)
{
int rank, nproc, already_locked, i;
uint8_t *buf;
assert(mutex >= 0 && mutex < hdl->max_count);
MPI_Comm_rank(hdl->comm, &rank);
MPI_Comm_size(hdl->comm, &nproc);
assert(proc >= 0 && proc < nproc);
buf = malloc(nproc * sizeof(uint8_t));
assert(buf != NULL);
buf[rank] = 1;
/* Get all data from the lock_buf, except the byte belonging to
* me. Set the byte belonging to me to 1. */
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, proc, 0, hdl->windows[mutex]);
MPI_Put(&buf[rank], 1, MPI_BYTE, proc, rank, 1, MPI_BYTE, hdl->windows[mutex]);
/* Get data to the left of rank */
if (rank > 0) {
MPI_Get(buf, rank, MPI_BYTE, proc, 0, rank, MPI_BYTE, hdl->windows[mutex]);
}
/* Get data to the right of rank */
if (rank < nproc - 1) {
MPI_Get(&buf[rank + 1], nproc - 1 - rank, MPI_BYTE, proc, rank + 1, nproc - 1 - rank,
MPI_BYTE, hdl->windows[mutex]);
}
MPI_Win_unlock(proc, hdl->windows[mutex]);
assert(buf[rank] == 1);
for (i = already_locked = 0; i < nproc; i++)
if (buf[i] && i != rank)
already_locked = 1;
/* Wait for notification */
if (already_locked) {
MPI_Status status;
debug_print("waiting for notification [proc = %d, mutex = %d]\n", proc, mutex);
MPI_Recv(NULL, 0, MPI_BYTE, MPI_ANY_SOURCE, MPIX_MUTEX_TAG + mutex, hdl->comm, &status);
}
debug_print("lock acquired [proc = %d, mutex = %d]\n", proc, mutex);
free(buf);
return MPI_SUCCESS;
}
开发者ID:abhinavvishnu,项目名称:matex,代码行数:61,代码来源:mutex_lock.c
注:本文中的MPI_Win_lock函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论