[saga-rg] proposal for extended file IO
Andrei Hutanu
ahutanu at cct.lsu.edu
Tue Jun 14 12:12:46 CDT 2005
I support this model in the more generic way I proposed ..
It's a more accurate model because you explicitely
submit a job when you are doing (potentially) complex operations
and it allows for better performance.
I think John is right when saying that eread is tricky and hard to use,
I also agree with Andre that a simpler model is even more limiting than
eread.
Any other opinions?
Andrei
>E (I already wrote that on the gat-devel-list):
>
>You could submit a process to your archive which extracts the data for you and
>registers the result as a new logical file. On the client side you could wrap
>it in a nice library hiding the job submission stuff and on the
>server/archive side you would prepare some executables for your tasks:
>extract_hyperslab_from_hdf5 <logical_file_name> <hyperslab>
><new_logical_file_name>
>compress_file <logical_file_name> <compression_method> <new_logical_file_name>
>...
>
>It shouldn't be that hard to prevent users from executing other executables on
>the server.
>
>This method is async and you can use the job interface to check for the status
>of your conversion job.
>
>
>
>
>
>>I think there is a 4th possibility. If each of the I/O operations can
>>be requested asynchronously, then you can get the same net effect as
>>the ERET/ESTO functionality of the GridFTP. The advantage of simply
>>embedding that functionality into the higher-level concept of
>>asynchronous calls is that if the underlying library does *not* support
>>the async operations (or some subset of the operations cannot be
>>performed asynchronously) , you can always perform the operations
>>synchronously and still be able present
>>
>>I do not like plan A or B for the reasons you state. I do not like
>>Plan C because it is too tightly tied to a specific data transfer
>>system implementation. I would propose a Plan D that simply augments
>>the Task interface of SAGA. For example, if you allowed the user to
>>fire off a number of async read operations
>> Task handle1= channel.read();
>> Task handle2=channel.read();
>> container.addTask(handle1);
>> container.addTask(handle2);
>> container.waitAll();
>>
>>The read operations in this example can be submitted as an eRead
>>operation or they can be in separate threads, or they can simply be
>>executed synchronously when you call waitAll() (this is in fact how
>>some of the async MPI I/O was done on the first SGI origin machines...
>>it was meant to look asynchronous, but in fact the calls did not
>>initiate until you did a "Wait" for them).
>>
>>Anyways, using the task interface provide more degrees of freedom for
>>implementing async I/O than simply supporting the GridFTP way of doing
>>things and it meshes gracefully with I/O implementations that do *not*
>>offer an underlying async execution model.
>>
>>The only modification that would be useful to add to the tasking
>>interface is a notion of "readFrom()" and "writeTo()" which allows you
>>to specify the file offset together with the read. Otherwise, the
>>statefulness of the read() call would make the entire "task" interface
>>useless with respect to file I/O.
>>
>>-john
>>
>>On Jun 12, 2005, at 11:02 AM, Andre Merzky wrote:
>>
>>
>>>Hi again,
>>>
>>>consider following use case for remote IO. Given a large
>>>binary 2D field on a remote host, the client wans to access
>>>a 2D sub portion of that field. Dependend on the remote
>>>file layout, that requires usually more than one read
>>>operation, since the standard read (offset, length) is
>>>agnostic to the 2D layout.
>>>
>>>For more complex operations (subsampling, get a piece of a
>>>jpg file), the number of remote operations grow very fast.
>>>Latency then stringly discourages that type of remote IO.
>>>
>>>For that reason, I think that the remote file IO as
>>>specified by SAGA's Strawman as is will only be usable for a
>>>limited and trivial set of remote I/O use cases.
>>>
>>>There are three (basic) approaches:
>>>
>>> A) get the whole thing, and do ops locally
>>> Pro: - one remote op,
>>> - simple logic
>>> - remote side doesn't need to know about file
>>> structure
>>> - easily implementable on application level
>>> Con: - getting the header info of a 1GB data file comes
>>> with, well, some overhead ;-)
>>>
>>> B) clustering of calls: do many reads, but send them as a
>>> single request.
>>> Pro: - transparent to application
>>> - efficient
>>> Con: - need to know about dependencies of reads
>>> (a header read needed to determine size of
>>> field), or included explicite 'flushes'
>>> - need a protocol to support that
>>> - the remote side needs to support that
>>>
>>> C) data specific remote ops: send a high level command,
>>> and get exactly what you want.
>>> Pro: - most efficient
>>> Con: - need a protocol to support that
>>> - the remote side needs to support that _specific_
>>> command
>>>
>>>The last approach (C) is what I have best experiences with.
>>>Also, that is what GridFTP as a common file access protocol
>>>supports via ERET/ESTO operations.
>>>
>>>I want to propose to include a C-like extension to the File
>>>API of the strawman, which basically maps well to GridFTP,
>>>but should also map to other implementations of C.
>>>
>>>That extension would look like:
>>>
>>> void lsEModes (out array<string,1> emodes );
>>> void eWrite (in string emode,
>>> in string spec,
>>> in string buffer
>>> out long len_out );
>>> void eRead (in string emode,
>>> in string spec,
>>> out string buffer,
>>> out long len_out );
>>>
>>> - hooks for gridftp-like opaque ERET/ESTO features
>>> - spec: string for pattern as in GridFTP's ESTO/ERET
>>> - emode: string for ident. as in GridFTP's ESTO/ERET
>>>
>>>EMode: a specific remote I/O command supported
>>>lsEModes: list the EModes available in this implementation
>>>eRead/eWrite: read/write data according to the emode spec
>>>
>>>Example (in perl for brevity):
>>>
>>> my $file = SAGA::File new
>>>("http://www.google.com/intl/en/images/logo.gif");
>>> my @emodes = $file->lsEModes ();
>>>
>>> if ( grep (/^jpeg_block$/, @emodes) )
>>> {
>>> my ($buff, $len) = file.eRead ("jpeg_block", "22x4+7+8");
>>> }
>>>
>>>I would discourage support for B, since I do not know any
>>>protocoll supporting that approach efficiently, and also it
>>>needs approximately the same infrastructure setup as C.
>>>
>>>As A is easily implementable on application level, or within
>>>any SAGA implementation, there is no need for support on API
>>>level -- however, A is insufficient for all but some trivial
>>>cases.
>>>
>>>Comments welcome :-))
>>>
>>>Cheers, Andre.
>>>
>>>
>>>--
>>>+-----------------------------------------------------------------+
>>>
>>>| Andre Merzky | phon: +31 - 20 - 598 - 7759 |
>>>| Vrije Universiteit Amsterdam (VU) | fax : +31 - 20 - 598 - 7653 |
>>>| Dept. of Computer Science | mail: merzky at cs.vu.nl |
>>>| De Boelelaan 1083a | www: http://www.merzky.net |
>>>| 1081 HV Amsterdam, Netherlands | |
>>>
>>>+-----------------------------------------------------------------+
>>>
>>>
>
>
>
More information about the saga-rg
mailing list