o
    ei                     @   s^  U d dl Z d dlZd dlmZ d dlZd dlmZ g dZee	 e
d< de	defdd	Zeejd
seejdr<edeejdrFedeejdrPedeejdrZedeejdrdeded
ejjd
< edejjd< edejjd< edejjd< edejjd< edejjd< deddfddZdeddfddZG dd dZdS )    N)Callable)Storage)gds_register_buffergds_deregister_bufferGdsFile__all__namereturnc                    s    fdd}|S )Nc                     s   t d  d)Nz	torch._C.z" is not supported on this platform)RuntimeError)argskwargsr    X/var/www/addictedbytheproject.nl/epg/venv/lib/python3.10/site-packages/torch/cuda/gds.pyfn   s   z_dummy_fn.<locals>.fnr   )r   r   r   r   r   	_dummy_fn   s   r   _gds_register_buffer_gds_deregister_bufferz?_gds_deregister_buffer exists but _gds_register_buffer does not_gds_register_handlez=_gds_register_handle exists but _gds_register_buffer does not_gds_deregister_handlez?_gds_deregister_handle exists but _gds_register_buffer does not_gds_load_storagez:_gds_load_storage exists but _gds_register_buffer does not_gds_save_storagez:_gds_save_storage exists but _gds_register_buffer does notsc                 C      t j|  dS )a:  Registers a storage on a CUDA device as a cufile buffer.

    Example::

        >>> # xdoctest: +SKIP("gds filesystem requirements")
        >>> src = torch.randn(1024, device="cuda")
        >>> s = src.untyped_storage()
        >>> gds_register_buffer(s)

    Args:
        s (Storage): Buffer to register.
    N)torch_Cr   r   r   r   r   r   5   s   r   c                 C   r   )aw  Deregisters a previously registered storage on a CUDA device as a cufile buffer.

    Example::

        >>> # xdoctest: +SKIP("gds filesystem requirements")
        >>> src = torch.randn(1024, device="cuda")
        >>> s = src.untyped_storage()
        >>> gds_register_buffer(s)
        >>> gds_deregister_buffer(s)

    Args:
        s (Storage): Buffer to register.
    N)r   r   r   r   r   r   r   r   E   s   r   c                   @   sp   e Zd ZdZdedefddZddd	Zdd
dZdddZ	dde
deddfddZdde
deddfddZdS )r   a  Wrapper around cuFile.

    cuFile is a file-like interface to the GPUDirect Storage (GDS) API.

    See the `cufile docs <https://docs.nvidia.com/gpudirect-storage/api-reference-guide/index.html#cufile-io-api>`_
    for more details.

    Args:
        filename (str): Name of the file to open.
        flags (int): Flags to pass to ``os.open`` when opening the file. ``os.O_DIRECT`` will
            be added automatically.

    Example::

        >>> # xdoctest: +SKIP("gds filesystem requirements")
        >>> src1 = torch.randn(1024, device="cuda")
        >>> src2 = torch.randn(2, 1024, device="cuda")
        >>> file = torch.cuda.gds.GdsFile(f, os.O_CREAT | os.O_RDWR)
        >>> file.save_storage(src1.untyped_storage(), offset=0)
        >>> file.save_storage(src2.untyped_storage(), offset=src1.nbytes)
        >>> dest1 = torch.empty(1024, device="cuda")
        >>> dest2 = torch.empty(2, 1024, device="cuda")
        >>> file.load_storage(dest1.untyped_storage(), offset=0)
        >>> file.load_storage(dest2.untyped_storage(), offset=src1.nbytes)
        >>> torch.equal(src1, dest1)
        True
        >>> torch.equal(src2, dest2)
        True

    filenameflagsc                 C   sD   t jdkr	td|| _|| _t||tjB | _d | _	| 
  d S )Nwin32z*GdsFile is not supported on this platform.)sysplatformr
   r   r   osopenO_DIRECTfdhandleregister_handle)selfr   r   r   r   r   __init__v   s   
zGdsFile.__init__r	   Nc                 C   s"   | j d ur	|   t| j d S )N)r&   deregister_handler"   closer%   r(   r   r   r   __del__   s   
zGdsFile.__del__c                 C   s&   | j dur	tdtj| j| _ dS )zpRegisters file descriptor to cuFile Driver.

        This is a wrapper around ``cuFileHandleRegister``.
        Nz4Cannot register a handle that is already registered.)r&   AssertionErrorr   r   r   r%   r,   r   r   r   r'      s   
zGdsFile.register_handlec                 C   s*   | j du r	tdtj| j  d| _ dS )zvDeregisters file descriptor from cuFile Driver.

        This is a wrapper around ``cuFileHandleDeregister``.
        Nz2Cannot deregister a handle that is not registered.)r&   r.   r   r   r   r,   r   r   r   r*      s   

zGdsFile.deregister_handler   storageoffsetc                 C   (   | j du r	tdtj| j || dS )am  Loads data from the file into the storage.

        This is a wrapper around ``cuFileRead``. ``storage.nbytes()`` of data
        will be loaded from the file at ``offset`` into the storage.

        Args:
            storage (Storage): Storage to load data into.
            offset (int, optional): Offset into the file to start loading from. (Default: 0)
        Nz4Cannot load data from a file that is not registered.)r&   r.   r   r   r   r(   r/   r0   r   r   r   load_storage      

zGdsFile.load_storagec                 C   r1   )aU  Saves data from the storage into the file.

        This is a wrapper around ``cuFileWrite``. All bytes of the storage
        will be written to the file at ``offset``.

        Args:
            storage (Storage): Storage to save data from.
            offset (int, optional): Offset into the file to start saving to. (Default: 0)
        Nz2Cannot save data to a file that is not registered.)r&   r.   r   r   r   r2   r   r   r   save_storage   r4   zGdsFile.save_storage)r	   N)r   )__name__
__module____qualname____doc__strintr)   r-   r'   r*   r   r3   r5   r   r   r   r   r   V   s    
	

	
r   )r"   r    collections.abcr   r   torch.typesr   r   listr:   __annotations__r   hasattrr   r.   __dict__r   r   r   r   r   r   r   <module>   sJ   
 