barrier_t *mppa_create_master_barrier (char *path_master, char *path_slave, int clusters) { int status, i; int ranks[clusters]; long long match; barrier_t *ret = (barrier_t*) malloc (sizeof (barrier_t)); ret->sync_fd_master = mppa_open(path_master, O_RDONLY); assert(ret->sync_fd_master != -1); ret->sync_fd_slave = mppa_open(path_slave, O_WRONLY); assert(ret->sync_fd_slave != -1); match = (long long) - (1 << clusters); status = mppa_ioctl(ret->sync_fd_master, MPPA_RX_SET_MATCH, match); assert(status == 0); for (i = 0; i < clusters; i++) ranks[i] = i; status = mppa_ioctl(ret->sync_fd_slave, MPPA_TX_SET_RX_RANKS, clusters, ranks); assert(status == 0); ret->mode = BARRIER_MASTER; return ret; }
channel_t *mppa_create_read_channel (char *path) { channel_t *ret = (channel_t*) malloc (sizeof(channel_t)); ret->file_descriptor = mppa_open(path, O_RDONLY); assert(ret->file_descriptor != -1); return ret; }
/* * Opens NoC connectors. */ void open_noc_connectors(void) { char path[35]; sync_fd = mppa_open("/mppa/sync/128:64", O_WRONLY); assert(sync_fd != -1); /* Open input channel. */ sprintf(path, "/mppa/channel/%d:%d/128:%d", rank, rank + 1, rank + 1); infd = mppa_open(path, O_RDONLY); assert(infd != -1); sprintf(path, "/mppa/channel/128:%d/%d:%d", rank + 17, rank, rank + 17); outfd = mppa_open(path, O_WRONLY); assert(outfd != -1); }
rqueue_t *mppa_create_write_rqueue (int message_size, int rx_id, int rx_tag, char *tx_ids, int tx_tag) { rqueue_t *ret = (rqueue_t *) malloc (sizeof(rqueue_t)); char path_name[256]; sprintf(path_name, "/mppa/queue.%d/%d:%d/%s:%d", message_size, rx_id, rx_tag, tx_ids, tx_tag); ret->file_descriptor = mppa_open(path_name, O_WRONLY); assert(ret->file_descriptor != -1); return ret; }
barrier_t *mppa_create_slave_barrier (char *path_master, char *path_slave) { int status; barrier_t *ret = (barrier_t*) malloc (sizeof (barrier_t)); ret->sync_fd_master = mppa_open(path_master, O_WRONLY); assert(ret->sync_fd_master != -1); ret->sync_fd_slave = mppa_open(path_slave, O_RDONLY); assert(ret->sync_fd_slave != -1); long long match; status = mppa_ioctl(ret->sync_fd_slave, MPPA_RX_SET_MATCH, (long long) 0); //pq long long 0? assert(status == 0); ret->mode = BARRIER_SLAVE; return ret; }
/* * Open NoC connectors. */ void open_noc_connectors(void) { int i; /* Loop index. */ char path[35]; /* Connector path. */ uint64_t match; /* match value. */ match = -(1 << nclusters); assert((sync_fd = mppa_open("/mppa/sync/128:64", O_RDONLY)) != -1) ; assert(mppa_ioctl(sync_fd, MPPA_RX_SET_MATCH, match) != -1); /* Open channels. */ for (i = 0; i < nclusters; i++) { sprintf(path, "/mppa/channel/%d:%d/128:%d", i, i + 1, i + 1); outfd[i] = mppa_open(path, O_WRONLY); assert(outfd[i] != -1); sprintf(path, "/mppa/channel/128:%d/%d:%d", i + 17, i, i + 17); infd[i] = mppa_open(path, O_RDONLY); assert(outfd[i] != -1); } }
portal_t *mppa_create_write_portal (char *path, void* buffer, unsigned long buffer_size, int receiver_rank) { portal_t *ret = (portal_t*) malloc (sizeof(portal_t)); ret->file_descriptor = mppa_open(path, O_WRONLY); assert(ret->file_descriptor != -1); // Tell mppa_io_write to wait for resources when sending a asynchronous message assert(mppa_ioctl(ret->file_descriptor, MPPA_TX_WAIT_RESOURCE_ON) == 0); // Select the DMA interface according to the receiver's rank. // This is only possible on the IO-node! if (__k1_get_cluster_id() == 128) assert(mppa_ioctl(ret->file_descriptor, MPPA_TX_SET_IFACE, receiver_rank % 4) == 0); // We need to initialize an aiocb for asynchronous writes. // It seems that the buffer and buffer size parameters are not important here, // because we're going to specify them with mppa_aiocb_set_pwrite() // before calling mppa_aio_write() assert(mppa_aiocb_ctor(&ret->aiocb, ret->file_descriptor, buffer, buffer_size) == &ret->aiocb); return ret; }
portal_t *mppa_create_read_portal (char *path, void* buffer, unsigned long buffer_size, int trigger, void (*function)(mppa_sigval_t)) { portal_t *ret = (portal_t*) malloc (sizeof(portal_t)); int status; ret->file_descriptor = mppa_open(path, O_RDONLY); assert(ret->file_descriptor != -1); mppa_aiocb_ctor(&ret->aiocb, ret->file_descriptor, buffer, buffer_size); if (trigger > -1) { mppa_aiocb_set_trigger(&ret->aiocb, trigger); } // Attention: we can't use callbacks with trigger/mppa_aio_wait (bug?) if (function) mppa_aiocb_set_callback(&ret->aiocb, function); status = mppa_aio_read(&ret->aiocb); assert(status == 0); return ret; }