// XXX TODO: consider returning std::vector<scidb::SharedMemoryPtr> // XXX TODO: which would require supporting different types of memory (double, char etc.) std::vector<MPIPhysical::SMIptr_t> MPIPhysical::allocateMPISharedMemory(size_t numBufs, size_t elemSizes[], size_t numElems[], string dbgNames[]) { if(DBG) { std::cerr << "SHM ALLOCATIONS:@@@@@@@@@@@@@@@@@@@" << std::endl ; for(size_t ii=0; ii< numBufs; ii++) { std::cerr << "numElems["<<ii<<"] "<< dbgNames[ii] << " len = " << numElems[0] << std::endl; } } std::vector<SMIptr_t> shmIpc(numBufs); for(size_t ii=0; ii<numBufs; ii++) { std::stringstream suffix; suffix << "." << ii ; std::string ipcNameFull= _ipcName + suffix.str(); LOG4CXX_TRACE(logger, "IPC name = " << ipcNameFull); shmIpc[ii] = SMIptr_t(mpi::newSharedMemoryIpc(ipcNameFull)); // can I get 'em off ctx instead? _ctx->addSharedMemoryIpc(_launchId, shmIpc[ii]); try { shmIpc[ii]->create(SharedMemoryIpc::RDWR); shmIpc[ii]->truncate(elemSizes[ii] * numElems[ii]); } catch(SharedMemoryIpc::SystemErrorException& e) { std::stringstream ss; ss << "shared_memory_mmap " << e.what(); throw (SYSTEM_EXCEPTION(SCIDB_SE_INTERNAL, SCIDB_LE_OPERATION_FAILED) << ss.str()) ; } catch(SharedMemoryIpc::InvalidStateException& e) { throw (SYSTEM_EXCEPTION(SCIDB_SE_INTERNAL, SCIDB_LE_UNKNOWN_ERROR) << e.what()); } } return shmIpc; }
// XXX TODO: consider returning std::vector<scidb::SharedMemoryPtr> // XXX TODO: which would require supporting different types of memory (double, char etc.) std::vector<MPIPhysical::SMIptr_t> MPIPhysical::allocateMPISharedMemory(size_t numBufs, size_t elemSizes[], size_t numElems[], string dbgNames[]) { LOG4CXX_DEBUG(logger, "MPIPhysical::allocateMPISharedMemory(numBufs "<<numBufs<<",,,)"); if(logger->isTraceEnabled()) { LOG4CXX_TRACE(logger, "MPIPhysical::allocateMPISharedMemory(): allocations are: "); for(size_t ii=0; ii< numBufs; ii++) { LOG4CXX_TRACE(logger, "MPIPhysical::allocateMPISharedMemory():" << " elemSizes["<<ii<<"] "<< dbgNames[ii] << " len " << numElems[ii]); } } std::vector<SMIptr_t> shmIpc(numBufs); bool preallocate = Config::getInstance()->getOption<bool>(CONFIG_PREALLOCATE_SHM); for(size_t ii=0; ii<numBufs; ii++) { std::stringstream suffix; suffix << "." << ii ; std::string ipcNameFull= _ipcName + suffix.str(); LOG4CXX_TRACE(logger, "IPC name = " << ipcNameFull); shmIpc[ii] = SMIptr_t(mpi::newSharedMemoryIpc(ipcNameFull, preallocate)); // can I get 'em off ctx instead? _ctx->addSharedMemoryIpc(_launchId, shmIpc[ii]); char* ptr = MpiLauncher::initIpcForWrite(shmIpc[ii].get(), (elemSizes[ii] * numElems[ii])); assert(ptr); ptr=ptr; } return shmIpc; }