1313#ifdef __has_include
1414 #if __has_include(<unistd.h>)
1515 #include < unistd.h>
16- #include < fcntl.h>
17- #include < sys/stat.h>
1816 #if defined(_POSIX_MAPPED_FILES)
1917 #include < sys/mman.h>
18+ #include < fcntl.h>
2019 #endif
2120 #if defined(_POSIX_MEMLOCK_RANGE)
2221 #include < sys/resource.h>
@@ -75,7 +74,7 @@ struct llama_file::impl {
7574 return ret;
7675 }
7776
78- impl (const char * fname, const char * mode, [[maybe_unused]] const bool use_direct_io = false ) {
77+ impl (const char * fname, const char * mode) {
7978 fp = ggml_fopen (fname, mode);
8079 if (fp == NULL ) {
8180 throw std::runtime_error (format (" failed to open %s: %s" , fname, strerror (errno)));
@@ -154,40 +153,13 @@ struct llama_file::impl {
154153 write_raw (&val, sizeof (val));
155154 }
156155
157- void read_aligned_chunk (size_t offset, void * dest, size_t size) const {
158- throw std::runtime_error (" DirectIO is not implemented on Windows." );
159- }
160-
161156 ~impl () {
162157 if (fp) {
163158 std::fclose (fp);
164159 }
165160 }
166161#else
167- impl (const char * fname, const char * mode, [[maybe_unused]] const bool use_direct_io = false ) {
168- #ifdef __linux__
169- // Try unbuffered I/O for read only
170- if (use_direct_io && std::strcmp (mode, " rb" ) == 0 ) {
171- fd = open (fname, O_RDONLY | O_DIRECT);
172-
173- if (fd != -1 ) {
174- struct stat file_stats{};
175- fstat (fd, &file_stats);
176-
177- size = file_stats.st_size ;
178- alignment = file_stats.st_blksize ;
179-
180- off_t ret = lseek (fd, 0 , SEEK_SET);
181- if (ret == -1 ) {
182- throw std::runtime_error (format (" seek error: %s" , strerror (errno)));
183- }
184- return ;
185- }
186-
187- LLAMA_LOG_WARN (" Failed to open model %s with error: %s. Falling back to buffered I/O" ,
188- fname, strerror (errno));
189- }
190- #endif
162+ impl (const char * fname, const char * mode) {
191163 fp = ggml_fopen (fname, mode);
192164 if (fp == NULL ) {
193165 throw std::runtime_error (format (" failed to open %s: %s" , fname, strerror (errno)));
@@ -198,30 +170,27 @@ struct llama_file::impl {
198170 }
199171
200172 size_t tell () const {
201- if (fd == -1 ) {
202- long ret = std::ftell (fp);
203- if (ret == -1 ) {
204- throw std::runtime_error (format (" ftell error: %s" , strerror (errno)));
205- }
206-
207- return (size_t ) ret;
173+ // TODO: this ifdef is never true?
174+ #ifdef _WIN32
175+ __int64 ret = _ftelli64 (fp);
176+ #else
177+ long ret = std::ftell (fp);
178+ #endif
179+ if (ret == -1 ) {
180+ throw std::runtime_error (format (" ftell error: %s" , strerror (errno)));
208181 }
209182
210- off_t pos = lseek (fd, 0 , SEEK_CUR);
211- if (pos == -1 ) {
212- throw std::runtime_error (format (" lseek error: %s" , strerror (errno)));
213- }
214- return (size_t ) pos;
183+ return (size_t ) ret;
215184 }
216185
217186 void seek (size_t offset, int whence) const {
218- off_t ret = 0 ;
219- if (fd == - 1 ) {
220- ret = std::fseek (fp, (long ) offset, whence);
221- } else {
222- ret = lseek (fd, offset, whence);
223- }
224- if (ret == - 1 ) {
187+ // TODO: this ifdef is never true?
188+ # ifdef _WIN32
189+ int ret = _fseeki64 (fp, (__int64 ) offset, whence);
190+ # else
191+ int ret = std::fseek (fp, ( long ) offset, whence);
192+ # endif
193+ if (ret != 0 ) {
225194 throw std::runtime_error (format (" seek error: %s" , strerror (errno)));
226195 }
227196 }
@@ -231,55 +200,13 @@ struct llama_file::impl {
231200 return ;
232201 }
233202 errno = 0 ;
234- if (fd == -1 ) {
235- std::size_t ret = std::fread (ptr, len, 1 , fp);
236- if (ferror (fp)) {
237- throw std::runtime_error (format (" read error: %s" , strerror (errno)));
238- }
239- if (ret != 1 ) {
240- throw std::runtime_error (" unexpectedly reached end of file" );
241- }
242- } else {
243- bool successful = false ;
244- while (!successful) {
245- off_t ret = read (fd, ptr, len);
246-
247- if (ret == -1 ) {
248- if (errno == EINTR) {
249- continue ; // Interrupted by signal, retry
250- }
251- throw std::runtime_error (format (" read error: %s" , strerror (errno)));
252- }
253- if (ret == 0 ) {
254- throw std::runtime_error (" unexpectedly reached end of file" );
255- }
256-
257- successful = true ;
258- }
203+ std::size_t ret = std::fread (ptr, len, 1 , fp);
204+ if (ferror (fp)) {
205+ throw std::runtime_error (format (" read error: %s" , strerror (errno)));
259206 }
260- }
261-
262- void read_aligned_chunk (size_t offset, void * dest, size_t size) const {
263- off_t aligned_offset = offset & ~(alignment - 1 );
264- off_t offset_from_alignment = offset - aligned_offset;
265- size_t bytes_to_read = (offset_from_alignment + size + alignment - 1 ) & ~(alignment - 1 );
266-
267- void * raw_buffer = nullptr ;
268- int ret = posix_memalign (&raw_buffer, alignment, bytes_to_read);
269- if (ret != 0 ) {
270- throw std::runtime_error (format (" posix_memalign failed with error %d" , ret));
207+ if (ret != 1 ) {
208+ throw std::runtime_error (" unexpectedly reached end of file" );
271209 }
272-
273- struct aligned_buffer_deleter {
274- void operator ()(void * p) const { free (p); }
275- };
276- std::unique_ptr<void , aligned_buffer_deleter> buffer (raw_buffer);
277-
278- seek (aligned_offset, SEEK_SET);
279- read_raw (buffer.get (), bytes_to_read);
280-
281- uintptr_t actual_data = reinterpret_cast <uintptr_t >(buffer.get ()) + offset_from_alignment;
282- memcpy (dest, reinterpret_cast <void *>(actual_data), size);
283210 }
284211
285212 uint32_t read_u32 () const {
@@ -304,43 +231,22 @@ struct llama_file::impl {
304231 }
305232
306233 ~impl () {
307- if (fd != -1 ) {
308- close (fd);
309- } else {
234+ if (fp) {
310235 std::fclose (fp);
311236 }
312237 }
313- int fd = -1 ;
314238#endif
315239
316- void read_raw_at (void * ptr, size_t len, size_t offset) const {
317- if (alignment != 1 ) {
318- read_aligned_chunk (offset, ptr, len);
319- } else {
320- seek (offset, SEEK_SET);
321- read_raw (ptr, len);
322- }
323- }
324-
325- size_t read_alignment () const {
326- return alignment;
327- }
328-
329- size_t alignment = 1 ;
330-
331- FILE * fp{};
332- size_t size{};
240+ FILE * fp;
241+ size_t size;
333242};
334243
335- llama_file::llama_file (const char * fname, const char * mode, const bool use_direct_io) :
336- pimpl(std::make_unique<impl>(fname, mode, use_direct_io)) {}
244+ llama_file::llama_file (const char * fname, const char * mode) : pimpl(std::make_unique<impl>(fname, mode)) {}
337245llama_file::~llama_file () = default ;
338246
339247size_t llama_file::tell () const { return pimpl->tell (); }
340248size_t llama_file::size () const { return pimpl->size ; }
341249
342- size_t llama_file::read_alignment () const { return pimpl->read_alignment (); }
343-
344250int llama_file::file_id () const {
345251#ifdef _WIN32
346252 return _fileno (pimpl->fp );
@@ -355,7 +261,6 @@ int llama_file::file_id() const {
355261
356262void llama_file::seek (size_t offset, int whence) const { pimpl->seek (offset, whence); }
357263void llama_file::read_raw (void * ptr, size_t len) const { pimpl->read_raw (ptr, len); }
358- void llama_file::read_raw_at (void * ptr, size_t len, size_t offset) const { pimpl->read_raw_at (ptr, len, offset); }
359264
360265uint32_t llama_file::read_u32 () const { return pimpl->read_u32 (); }
361266
0 commit comments