diff --git a/cmake/AISInstall.cmake b/cmake/AISInstall.cmake index 875c8d01..50b825f8 100644 --- a/cmake/AISInstall.cmake +++ b/cmake/AISInstall.cmake @@ -36,6 +36,12 @@ if(BUILD_ROCFILE OR BUILD_HIPFILE) ) endif() + # Always install the hipfile-types.h file + rocm_install( + FILES ${CMAKE_SOURCE_DIR}/shared/hipfile-types.h + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + ) + # rocm_package_add_dependencies() line should go here # when we have dependencies diff --git a/hipfile/include/hipfile.h b/hipfile/include/hipfile.h index 3571101c..eecc5cbb 100644 --- a/hipfile/include/hipfile.h +++ b/hipfile/include/hipfile.h @@ -14,6 +14,8 @@ #include #include +#include + #if defined(__GNUC__) #define HIPFILE_API __attribute__((visibility("default"))) #else @@ -85,20 +87,6 @@ extern "C" { */ #define HIPFILE_VERSION_PATCH 0 -// *********************************************************************** -// PLATFORM-INDEPENDENT TYPES -// *********************************************************************** - -/*! - * @brief Platform-independent offset type - * @ingroup core - */ -#ifndef _WIN32 -typedef off_t hoff_t; -#else -typedef __int64 hoff_t; -#endif - // *********************************************************************** // ERROR HANDLING // *********************************************************************** diff --git a/rocfile/include/rocfile.h b/rocfile/include/rocfile.h index 147aa52b..afd0e02c 100644 --- a/rocfile/include/rocfile.h +++ b/rocfile/include/rocfile.h @@ -14,6 +14,8 @@ #include #include +#include + #if defined(__GNUC__) #define ROCFILE_API __attribute__((visibility("default"))) #else @@ -405,15 +407,15 @@ typedef struct rocFileFSOps { /*! * Get the assigned priority of a RDMA device. If -1, there is no preference. */ - int (*getRDMADevicePriority)(void *handle, char *, size_t, off_t, struct sockaddr *hostaddr); + int (*getRDMADevicePriority)(void *handle, char *, size_t, hoff_t, struct sockaddr *hostaddr); /*! * Read from the remote filesystem. If NULL, use the Linux VFS. */ - ssize_t (*read)(void *handle, char *, size_t, off_t, rocFileRDMAInfo_t *); + ssize_t (*read)(void *handle, char *, size_t, hoff_t, rocFileRDMAInfo_t *); /*! * Write to the remote filesystem. If NULL, use the Linux VFS. */ - ssize_t (*write)(void *handle, const char *, size_t, off_t, rocFileRDMAInfo_t *); + ssize_t (*write)(void *handle, const char *, size_t, hoff_t, rocFileRDMAInfo_t *); } rocFileFSOps_t; /*! @@ -521,8 +523,8 @@ rocFileError_t rocFileBufDeregister(const void *buffer_base); * @return else: Negative value of the related rocFileOpError_t */ ROCFILE_API -ssize_t rocFileRead(rocFileHandle_t fh, void *buffer_base, size_t size, off_t file_offset, - off_t buffer_offset); +ssize_t rocFileRead(rocFileHandle_t fh, void *buffer_base, size_t size, hoff_t file_offset, + hoff_t buffer_offset); /*! * @brief Synchronously write data from a GPU buffer to a file @@ -539,8 +541,8 @@ ssize_t rocFileRead(rocFileHandle_t fh, void *buffer_base, size_t size, off_t fi * @return else: Negative value of the related rocFileOpError_t */ ROCFILE_API -ssize_t rocFileWrite(rocFileHandle_t fh, const void *buffer_base, size_t size, off_t file_offset, - off_t buffer_offset); +ssize_t rocFileWrite(rocFileHandle_t fh, const void *buffer_base, size_t size, hoff_t file_offset, + hoff_t buffer_offset); // *********************************************************************** // GPU IO DRIVER API @@ -832,8 +834,8 @@ rocFileError_t rocFileBatchIODestroy(rocFileBatchHandle_t batch_idp); * @return A rocFile error */ ROCFILE_API -rocFileError_t rocFileReadAsync(rocFileHandle_t fh, void *buffer_base, size_t *size_p, off_t *file_offset_p, - off_t *buffer_offset_p, ssize_t *bytes_read_p, hipStream_t stream); +rocFileError_t rocFileReadAsync(rocFileHandle_t fh, void *buffer_base, size_t *size_p, hoff_t *file_offset_p, + hoff_t *buffer_offset_p, ssize_t *bytes_read_p, hipStream_t stream); /*! * @brief Perform an asynchronous write to a stream @@ -851,8 +853,8 @@ rocFileError_t rocFileReadAsync(rocFileHandle_t fh, void *buffer_base, size_t *s * @return A rocFile error */ ROCFILE_API -rocFileError_t rocFileWriteAsync(rocFileHandle_t fh, void *buffer_base, size_t *size_p, off_t *file_offset_p, - off_t *buffer_offset_p, ssize_t *bytes_written_p, hipStream_t stream); +rocFileError_t rocFileWriteAsync(rocFileHandle_t fh, void *buffer_base, size_t *size_p, hoff_t *file_offset_p, + hoff_t *buffer_offset_p, ssize_t *bytes_written_p, hipStream_t stream); /*! * @brief Register a stream to be used by for asynchronous GPU IO diff --git a/rocfile/src/async.cpp b/rocfile/src/async.cpp index fddd8455..6ab3dfde 100644 --- a/rocfile/src/async.cpp +++ b/rocfile/src/async.cpp @@ -78,16 +78,16 @@ AsyncMonitor::completion_thread() } AsyncOp::AsyncOp(IoType _io_type, std::shared_ptr _file, std::shared_ptr _buffer, - std::shared_ptr _stream, size_t *_size, off_t *_file_offset, off_t *_buffer_offset, - ssize_t *_bytes_transferred) + std::shared_ptr _stream, size_t *_size, hoff_t *_file_offset, + hoff_t *_buffer_offset, ssize_t *_bytes_transferred) : io_type{_io_type}, file{_file}, buffer{_buffer}, stream{_stream}, size{stream->fixedIOSize() ? std::variant{*_size} : std::variant{_size}}, - file_offset{stream->fixedFileOffset() ? std::variant{*_file_offset} - : std::variant{_file_offset}}, - buffer_offset{stream->fixedBufferOffset() ? std::variant{*_buffer_offset} - : std::variant{_buffer_offset}}, + file_offset{stream->fixedFileOffset() ? std::variant{*_file_offset} + : std::variant{_file_offset}}, + buffer_offset{stream->fixedBufferOffset() ? std::variant{*_buffer_offset} + : std::variant{_buffer_offset}}, bytes_transferred{_bytes_transferred} { } diff --git a/rocfile/src/async.h b/rocfile/src/async.h index 548aec98..614c3813 100644 --- a/rocfile/src/async.h +++ b/rocfile/src/async.h @@ -22,14 +22,14 @@ namespace rocFile { class AsyncOp { public: - const IoType io_type; - std::shared_ptr file; - std::shared_ptr buffer; - std::shared_ptr stream; - std::variant size; - std::variant file_offset; - std::variant buffer_offset; - ssize_t *const bytes_transferred; + const IoType io_type; + std::shared_ptr file; + std::shared_ptr buffer; + std::shared_ptr stream; + std::variant size; + std::variant file_offset; + std::variant buffer_offset; + ssize_t *const bytes_transferred; AsyncOp(const AsyncOp &) = delete; AsyncOp &operator=(const AsyncOp &) = delete; @@ -38,7 +38,7 @@ class AsyncOp { virtual ~AsyncOp(); AsyncOp(IoType ioType, std::shared_ptr file, std::shared_ptr buffer, - std::shared_ptr stream, size_t *size, off_t *file_offset, off_t *buffer_offset, + std::shared_ptr stream, size_t *size, hoff_t *file_offset, hoff_t *buffer_offset, ssize_t *bytes_transferred); }; diff --git a/rocfile/src/backend.h b/rocfile/src/backend.h index 2ec93c39..35884333 100644 --- a/rocfile/src/backend.h +++ b/rocfile/src/backend.h @@ -40,7 +40,7 @@ struct Backend { /// @param buffer_offset Offset from the start of the buffer /// @return virtual int score(std::shared_ptr file, std::shared_ptr buffer, size_t size, - off_t file_offset, off_t buffer_offset) const = 0; + hoff_t file_offset, hoff_t buffer_offset) const = 0; /// @brief Perform a read or write operation /// @@ -55,7 +55,7 @@ struct Backend { /// /// @throws Hip::RuntimeError Sys::RuntimeError virtual ssize_t io(IoType type, std::shared_ptr file, std::shared_ptr buffer, size_t size, - off_t file_offset, off_t buffer_offset) = 0; + hoff_t file_offset, hoff_t buffer_offset) = 0; }; } diff --git a/rocfile/src/backend/asyncop-fallback.cpp b/rocfile/src/backend/asyncop-fallback.cpp index 508db3ed..486ea6b2 100644 --- a/rocfile/src/backend/asyncop-fallback.cpp +++ b/rocfile/src/backend/asyncop-fallback.cpp @@ -25,7 +25,7 @@ hipHostDeleter(void *buffer) AsyncOpFallback::AsyncOpFallback(IoType _io_type, std::shared_ptr _file, std::shared_ptr _buffer, std::shared_ptr _stream, - size_t *_size, off_t *_file_offset, off_t *_buffer_offset, + size_t *_size, hoff_t *_file_offset, hoff_t *_buffer_offset, ssize_t *_bytes_transferred) : AsyncOp{_io_type, _file, _buffer, _stream, _size, _file_offset, _buffer_offset, _bytes_transferred}, bytes_transferred_internal{0}, gpu_buffer{buffer->getBuffer()}, bounce_buffer_dev_ptr{nullptr}, diff --git a/rocfile/src/backend/asyncop-fallback.h b/rocfile/src/backend/asyncop-fallback.h index ddab828e..190063a0 100644 --- a/rocfile/src/backend/asyncop-fallback.h +++ b/rocfile/src/backend/asyncop-fallback.h @@ -18,7 +18,7 @@ struct AsyncOpFallback : AsyncOp { public: AsyncOpFallback(IoType ioType, std::shared_ptr file, std::shared_ptr buffer, - std::shared_ptr stream, size_t *size, off_t *fileOffset, off_t *bufferOffset, + std::shared_ptr stream, size_t *size, hoff_t *fileOffset, hoff_t *bufferOffset, ssize_t *bytesTransferred); void *bounceBufferHostPtr(); diff --git a/rocfile/src/backend/fallback.cpp b/rocfile/src/backend/fallback.cpp index f9f1860e..20665e48 100644 --- a/rocfile/src/backend/fallback.cpp +++ b/rocfile/src/backend/fallback.cpp @@ -19,8 +19,8 @@ using std::unique_ptr; static const size_t DefaultChunkSize = 16 * 1024 * 1024; int -Fallback::score(std::shared_ptr file, std::shared_ptr buffer, size_t size, off_t file_offset, - off_t buffer_offset) const +Fallback::score(std::shared_ptr file, std::shared_ptr buffer, size_t size, hoff_t file_offset, + hoff_t buffer_offset) const { (void)buffer_offset; (void)file; @@ -31,14 +31,14 @@ Fallback::score(std::shared_ptr file, std::shared_ptr buffer, si ssize_t Fallback::io(IoType type, std::shared_ptr file, std::shared_ptr buffer, size_t size, - off_t file_offset, off_t buffer_offset) + hoff_t file_offset, hoff_t buffer_offset) { return io(type, file, buffer, size, file_offset, buffer_offset, DefaultChunkSize); } ssize_t Fallback::io(IoType io_type, shared_ptr file, shared_ptr buffer, size_t size, - off_t file_offset, off_t buffer_offset, size_t chunk_size) + hoff_t file_offset, hoff_t buffer_offset, size_t chunk_size) { size = min(size, rocFile::MAX_RW_COUNT); diff --git a/rocfile/src/backend/fallback.h b/rocfile/src/backend/fallback.h index fe81a01b..5156cb61 100644 --- a/rocfile/src/backend/fallback.h +++ b/rocfile/src/backend/fallback.h @@ -14,17 +14,18 @@ namespace rocFile { struct Fallback : public Backend { virtual ~Fallback() override = default; - int score(std::shared_ptr file, std::shared_ptr buffer, size_t size, off_t file_offset, - off_t buffer_offset) const override; + int score(std::shared_ptr file, std::shared_ptr buffer, size_t size, hoff_t file_offset, + hoff_t buffer_offset) const override; ssize_t io(IoType type, std::shared_ptr file, std::shared_ptr buffer, size_t size, - off_t file_offset, off_t buffer_offset) override; + hoff_t file_offset, hoff_t buffer_offset) override; // Once we can import gtest.h and make test suites or test friends everything // below here should be made protected. // protected: ssize_t io(IoType type, std::shared_ptr file, std::shared_ptr buffer, size_t size, - off_t file_offset, off_t buffer_offset, size_t chunk_size); + hoff_t file_offset, hoff_t buffer_offset, size_t chunk_size); }; + } diff --git a/rocfile/src/rocfile-private.h b/rocfile/src/rocfile-private.h index e2d3b2f7..eec48f1c 100644 --- a/rocfile/src/rocfile-private.h +++ b/rocfile/src/rocfile-private.h @@ -18,4 +18,4 @@ ROCFILE_API void rocFileEnsureDriverInitPrivate(); ssize_t rocFileIo(rocFile::IoType type, rocFileHandle_t fh, const void *buffer_base, size_t size, - off_t file_offset, off_t buffer_offset); + hoff_t file_offset, hoff_t buffer_offset); diff --git a/rocfile/src/rocfile.cpp b/rocfile/src/rocfile.cpp index 2c10c2ac..b52d900e 100644 --- a/rocfile/src/rocfile.cpp +++ b/rocfile/src/rocfile.cpp @@ -225,8 +225,8 @@ catch (...) { } ssize_t -rocFileIo(IoType type, rocFileHandle_t fh, const void *buffer_base, size_t size, off_t file_offset, - off_t buffer_offset) +rocFileIo(IoType type, rocFileHandle_t fh, const void *buffer_base, size_t size, hoff_t file_offset, + hoff_t buffer_offset) try { HIPFILE_WARN_NO_EXIT_DTOR_OFF static const auto backends{Context::get()->getBackends()}; @@ -282,13 +282,14 @@ catch (...) { } ssize_t -rocFileRead(rocFileHandle_t fh, void *buffer_base, size_t size, off_t file_offset, off_t buffer_offset) +rocFileRead(rocFileHandle_t fh, void *buffer_base, size_t size, hoff_t file_offset, hoff_t buffer_offset) { return rocFileIo(IoType::Read, fh, buffer_base, size, file_offset, buffer_offset); } ssize_t -rocFileWrite(rocFileHandle_t fh, const void *buffer_base, size_t size, off_t file_offset, off_t buffer_offset) +rocFileWrite(rocFileHandle_t fh, const void *buffer_base, size_t size, hoff_t file_offset, + hoff_t buffer_offset) { return rocFileIo(IoType::Write, fh, buffer_base, size, file_offset, buffer_offset); } @@ -458,8 +459,8 @@ catch (...) { } rocFileError_t -rocFileReadAsync(rocFileHandle_t fh, void *buffer_base, size_t *size_p, off_t *file_offset_p, - off_t *buffer_offset_p, ssize_t *bytes_read_p, hipStream_t stream) +rocFileReadAsync(rocFileHandle_t fh, void *buffer_base, size_t *size_p, hoff_t *file_offset_p, + hoff_t *buffer_offset_p, ssize_t *bytes_read_p, hipStream_t stream) try { if (Context::get()->getRefCount() == 0) { return {rocFileDriverNotInitialized, hipSuccess}; @@ -480,8 +481,8 @@ catch (...) { } rocFileError_t -rocFileWriteAsync(rocFileHandle_t fh, void *buffer_base, size_t *size_p, off_t *file_offset_p, - off_t *buffer_offset_p, ssize_t *bytes_written_p, hipStream_t stream) +rocFileWriteAsync(rocFileHandle_t fh, void *buffer_base, size_t *size_p, hoff_t *file_offset_p, + hoff_t *buffer_offset_p, ssize_t *bytes_written_p, hipStream_t stream) try { if (Context::get()->getRefCount() == 0) { return {rocFileDriverNotInitialized, hipSuccess}; diff --git a/rocfile/test/async.cpp b/rocfile/test/async.cpp index 5cb0373f..e5e85a57 100644 --- a/rocfile/test/async.cpp +++ b/rocfile/test/async.cpp @@ -98,24 +98,24 @@ struct RocFileAsyncOpStreamParams TEST_P(RocFileAsyncOpStreamParams, asyncOp_construction_has_correct_variants) { size_t size = 100; - off_t file_offset = 0; - off_t buffer_offset = 0; - off_t bytes_transferred = 0; + hoff_t file_offset = 0; + hoff_t buffer_offset = 0; + hoff_t bytes_transferred = 0; auto op = std::make_shared(IoType::Read, file, buffer, stream, &size, &file_offset, &buffer_offset, &bytes_transferred); // Unfixed flags will be pointers if (flags & ROCFILE_STREAM_FIXED_BUF_OFFSET) { - EXPECT_NO_THROW(std::get(op->buffer_offset)); + EXPECT_NO_THROW(std::get(op->buffer_offset)); } else { - EXPECT_NO_THROW(std::get(op->buffer_offset)); + EXPECT_NO_THROW(std::get(op->buffer_offset)); } if (flags & ROCFILE_STREAM_FIXED_FILE_OFFSET) { - EXPECT_NO_THROW(std::get(op->file_offset)); + EXPECT_NO_THROW(std::get(op->file_offset)); } else { - EXPECT_NO_THROW(std::get(op->file_offset)); + EXPECT_NO_THROW(std::get(op->file_offset)); } if (flags & ROCFILE_STREAM_FIXED_FILE_SIZE) { EXPECT_NO_THROW(std::get(op->size)); @@ -129,9 +129,9 @@ INSTANTIATE_TEST_SUITE_P(StreamSuite, RocFileAsyncOpStreamParams, rocfileFlagsPo TEST_F(RocFileAsyncOp, AsyncOpFallback_new_uses_pinned_host_memory) { size_t size = 100; - off_t file_offset = 0; - off_t buffer_offset = 0; - off_t bytes_transferred = 0; + hoff_t file_offset = 0; + hoff_t buffer_offset = 0; + hoff_t bytes_transferred = 0; auto op_data = std::shared_ptr(new uint8_t[sizeof(AsyncOpFallback)]); auto bounce_buffer = std::shared_ptr(new uint8_t[size]); EXPECT_CALL(mhip, hipHostMalloc).WillOnce(Return(op_data.get())).WillOnce(Return(bounce_buffer.get())); @@ -145,9 +145,9 @@ TEST_F(RocFileAsyncOp, AsyncOpFallback_new_uses_pinned_host_memory) TEST_F(RocFileAsyncOp, AsyncOpFallback_new_failure_throws_bad_alloc) { size_t size = 100; - off_t file_offset = 0; - off_t buffer_offset = 0; - off_t bytes_transferred = 0; + hoff_t file_offset = 0; + hoff_t buffer_offset = 0; + hoff_t bytes_transferred = 0; auto op_data = std::shared_ptr(new uint8_t[sizeof(AsyncOpFallback)]); EXPECT_CALL(mhip, hipHostMalloc).WillOnce(Throw(Hip::RuntimeError(hipErrorOutOfMemory))); EXPECT_THROW(std::shared_ptr(new AsyncOpFallback{IoType::Read, file, buffer, stream, @@ -159,9 +159,9 @@ TEST_F(RocFileAsyncOp, AsyncOpFallback_new_failure_throws_bad_alloc) TEST_F(RocFileAsyncOp, AsyncOpFallback_bounce_alloc_failure_throws) { size_t size = 100; - off_t file_offset = 0; - off_t buffer_offset = 0; - off_t bytes_transferred = 0; + hoff_t file_offset = 0; + hoff_t buffer_offset = 0; + hoff_t bytes_transferred = 0; auto op_data = std::shared_ptr(new uint8_t[sizeof(AsyncOpFallback)]); EXPECT_CALL(mhip, hipHostMalloc) .WillOnce(Return(op_data.get())) @@ -176,9 +176,9 @@ TEST_F(RocFileAsyncOp, AsyncOpFallback_bounce_alloc_failure_throws) TEST_F(RocFileAsyncOp, AsyncOpFallback_bounce_buffer_deleter_failure_calls_syslog) { size_t size = 100; - off_t file_offset = 0; - off_t buffer_offset = 0; - off_t bytes_transferred = 0; + hoff_t file_offset = 0; + hoff_t buffer_offset = 0; + hoff_t bytes_transferred = 0; auto op_data = std::shared_ptr(new uint8_t[sizeof(AsyncOpFallback)]); auto bounce_buffer = std::shared_ptr(new uint8_t[size]); EXPECT_CALL(mhip, hipHostMalloc).WillOnce(Return(op_data.get())).WillOnce(Return(bounce_buffer.get())); @@ -194,9 +194,9 @@ TEST_F(RocFileAsyncOp, AsyncOpFallback_bounce_buffer_deleter_failure_calls_syslo TEST_F(RocFileAsyncOp, AsyncOpFallback_delete_failure_calls_syslog) { size_t size = 100; - off_t file_offset = 0; - off_t buffer_offset = 0; - off_t bytes_transferred = 0; + hoff_t file_offset = 0; + hoff_t buffer_offset = 0; + hoff_t bytes_transferred = 0; auto op_data = std::shared_ptr(new uint8_t[sizeof(AsyncOpFallback)]); auto bounce_buffer = std::shared_ptr(new uint8_t[size]); EXPECT_CALL(mhip, hipHostMalloc).WillOnce(Return(op_data.get())).WillOnce(Return(bounce_buffer.get())); @@ -225,9 +225,9 @@ struct RocFileAsyncOpFallbackFunctions : public RocFileAsyncOp { } void *bounce_buffer_dev_ptr = reinterpret_cast(0xDECDECDE); size_t size = 100; - off_t file_offset = 0; - off_t buffer_offset = 0; - off_t bytes_transferred = 0; + hoff_t file_offset = 0; + hoff_t buffer_offset = 0; + hoff_t bytes_transferred = 0; std::shared_ptr bounce_buffer; std::shared_ptr op; }; @@ -247,9 +247,9 @@ TEST_F(RocFileAsyncOpFallbackFunctions, devPtr_calls_hipHostGetDevicePointer) TEST_F(RocFileAsyncMonitor, addOp_and_completeOp_with_valid_params_works) { size_t size = 100; - off_t file_offset = 0; - off_t buffer_offset = 0; - off_t bytes_transferred = 0; + hoff_t file_offset = 0; + hoff_t buffer_offset = 0; + hoff_t bytes_transferred = 0; auto op = std::make_shared(IoType::Read, file, buffer, stream, &size, &file_offset, &buffer_offset, &bytes_transferred); @@ -265,9 +265,9 @@ TEST_F(RocFileAsyncMonitor, completeOp_with_invalid_op_throws) TEST_F(RocFileAsyncMonitor, addOp_without_completeOp_prints_error_on_AsyncMonitor_destruction) { size_t size = 100; - off_t file_offset = 0; - off_t buffer_offset = 0; - off_t bytes_transferred = 0; + hoff_t file_offset = 0; + hoff_t buffer_offset = 0; + hoff_t bytes_transferred = 0; auto op = std::make_unique(IoType::Read, file, buffer, stream, &size, &file_offset, &buffer_offset, &bytes_transferred); monitor.addOp(std::move(op)); diff --git a/rocfile/test/io.cpp b/rocfile/test/io.cpp index 38f3671d..328b34bc 100644 --- a/rocfile/test/io.cpp +++ b/rocfile/test/io.cpp @@ -76,8 +76,8 @@ rand_fill(std::vector &v) // bytes in expected starting at expected offset. Also ensure that all other // bytes in buffer are zero. static bool -contains_expected_data(std::vector &buffer, off_t buffer_offset, std::vector &expected, - off_t expected_offset, size_t count) +contains_expected_data(std::vector &buffer, hoff_t buffer_offset, std::vector &expected, + hoff_t expected_offset, size_t count) { if (buffer_offset < 0 || buffer.size() < static_cast(buffer_offset) + count) { throw std::invalid_argument("out of bounds: buffer"); @@ -87,7 +87,7 @@ contains_expected_data(std::vector &buffer, off_t buffer_offset, std::v throw std::invalid_argument("out of bounds: expected"); } - for (off_t i = 0; i < buffer_offset; i++) { + for (hoff_t i = 0; i < buffer_offset; i++) { if (buffer.data()[i] != 0) { return false; } @@ -146,8 +146,8 @@ TEST(RocFileFallbackBackend, FallbackBackendIsBarelyWillingToHandleDeviceMemory) auto mfile{std::make_shared>()}; auto mbuffer{std::make_shared>()}; size_t io_size{2048}; - off_t file_offset{4096}; - off_t buffer_offset{1024}; + hoff_t file_offset{4096}; + hoff_t buffer_offset{1024}; EXPECT_CALL(*mbuffer, getType).WillOnce(Return(hipMemoryTypeDevice)); @@ -158,8 +158,8 @@ TEST(RocFileFallbackBackend, FallbackBackendRejectsNonDeviceMemory) { auto mfile{std::make_shared>()}; size_t io_size{2048}; - off_t file_offset{4096}; - off_t buffer_offset{1024}; + hoff_t file_offset{4096}; + hoff_t buffer_offset{1024}; for (const auto memoryType : HipMemoryTypes) { if (memoryType != hipMemoryTypeDevice) { @@ -224,7 +224,7 @@ TEST_P(RocFileFallbackValidation, fallback_io_throws_if_buffer_offset_is_out_of_ { StrictMock mhip; StrictMock msys; - off_t buffer_offset = static_cast(buffer->getLength()); + hoff_t buffer_offset = static_cast(buffer->getLength()); ASSERT_THROW(Fallback().io(io_type, file, buffer, 0, 0, buffer_offset, 4096), std::invalid_argument); } @@ -233,7 +233,7 @@ TEST_P(RocFileFallbackValidation, fallback_io_throws_if_op_could_overrun_buffer) StrictMock mhip; StrictMock msys; size_t size = 10; - off_t buffer_offset = static_cast(buffer->getLength()) - 9; + hoff_t buffer_offset = static_cast(buffer->getLength()) - 9; ASSERT_THROW(Fallback().io(io_type, file, buffer, size, 0, buffer_offset, 4096), std::invalid_argument); } @@ -258,16 +258,18 @@ TEST_P(RocFileFallbackValidation, fallback_io_truncates_size_to_MAX_RW_COUNT) switch (io_type) { case IoType::Read: EXPECT_CALL(msys, pread) - .WillRepeatedly(testing::Invoke( - [](int, void *, size_t count, off_t) -> ssize_t { return static_cast(count); })); + .WillRepeatedly(testing::Invoke([](int, void *, size_t count, hoff_t) -> ssize_t { + return static_cast(count); + })); EXPECT_CALL(mhip, hipMemcpy).WillRepeatedly(testing::Return()); break; case IoType::Write: EXPECT_CALL(mhip, hipMemcpy).WillRepeatedly(testing::Return()); EXPECT_CALL(mhip, hipStreamSynchronize).WillRepeatedly(testing::Return()); EXPECT_CALL(msys, pwrite) - .WillRepeatedly(testing::Invoke( - [](int, void *, size_t count, off_t) -> ssize_t { return static_cast(count); })); + .WillRepeatedly(testing::Invoke([](int, void *, size_t count, hoff_t) -> ssize_t { + return static_cast(count); + })); break; default: FAIL(); @@ -314,7 +316,7 @@ INSTANTIATE_TEST_SUITE_P(FallbackValidationTests, RocFileFallbackValidation, struct RocFileWrite : public RocFileIO { - ssize_t fake_pwrite(int fd, void *buf, size_t count, off_t offset) + ssize_t fake_pwrite(int fd, void *buf, size_t count, hoff_t offset) { (void)fd; @@ -346,7 +348,7 @@ struct RocFileWrite : public RocFileIO { } // Test if the file contains the correct data - bool file_contains_expected_data(off_t file_offset, off_t buffer_offset, size_t count) + bool file_contains_expected_data(hoff_t file_offset, hoff_t buffer_offset, size_t count) { return contains_expected_data(file_data, file_offset, buffer_data, buffer_offset, count); } @@ -542,7 +544,7 @@ TEST_F(RocFileWrite, fallback_write_to_empty_file_at_file_offset) size_t size = 64 * 1024; size_t chunk_size = 4096; - off_t file_offset = 1024; + hoff_t file_offset = 1024; randomize_device_buffer(); expect_fallback_write(mhip, msys); @@ -558,7 +560,7 @@ TEST_F(RocFileWrite, fallback_write_to_empty_file_at_buffer_offset) size_t size = 64 * 1024; size_t chunk_size = 4096; - off_t buffer_offset = 1024; + hoff_t buffer_offset = 1024; randomize_device_buffer(); expect_fallback_write(mhip, msys); @@ -574,8 +576,8 @@ TEST_F(RocFileWrite, fallback_write_to_empty_file_at_buffer_offset_file_offset) size_t size = 64 * 1024; size_t chunk_size = 4096; - off_t buffer_offset = 1024; - off_t file_offset = 512; + hoff_t buffer_offset = 1024; + hoff_t file_offset = 512; randomize_device_buffer(); expect_fallback_write(mhip, msys); @@ -603,7 +605,7 @@ TEST_F(RocFileWrite, fallback_write_to_file_subregion) StrictMock msys; size_t file_length = buffer->getLength() * 2; - off_t file_offset = buffer->getLength() / 2; + hoff_t file_offset = buffer->getLength() / 2; file_data.resize(file_length); randomize_device_buffer(); expect_fallback_write(mhip, msys); @@ -620,7 +622,7 @@ TEST_F(RocFileWrite, fallback_write_append_non_empty_small_file) file_data.resize(64); size_t size = 64 * 1024; - off_t file_offset = 64; + hoff_t file_offset = 64; randomize_device_buffer(); expect_fallback_write(mhip, msys); @@ -643,7 +645,7 @@ struct RocFileRead : public RocFileIO { rand_fill(file_data); } - ssize_t fake_pread(int fd, void *buf, size_t count, off_t offset) + ssize_t fake_pread(int fd, void *buf, size_t count, hoff_t offset) { (void)fd; @@ -670,7 +672,7 @@ struct RocFileRead : public RocFileIO { return static_cast(count); } - bool device_buffer_contains_expected_data(off_t file_offset, off_t buffer_offset, size_t count) + bool device_buffer_contains_expected_data(hoff_t file_offset, hoff_t buffer_offset, size_t count) { return contains_expected_data(buffer_data, buffer_offset, file_data, file_offset, count); } @@ -806,8 +808,8 @@ TEST_F(RocFileRead, read_with_fallback_backend) init_file(file_length); size_t size = buffer->getLength() / 2; - off_t buffer_offset = buffer->getLength() / 4; - off_t file_offset = static_cast(buffer->getLength()); + hoff_t buffer_offset = buffer->getLength() / 4; + hoff_t file_offset = static_cast(buffer->getLength()); expect_fallback_read(mhip, msys); ASSERT_EQ(rocFileRead(file->getHandle(), buffer->getBuffer(), size, file_offset, buffer_offset), size); @@ -864,10 +866,10 @@ TEST_F(RocFileRead, fallback_read_handles_short_preads) EXPECT_CALL(msys, mmap).WillOnce(testing::Invoke(::mmap)); EXPECT_CALL(msys, pread) - .WillOnce(testing::Invoke([this](int fd, void *buf, size_t count, off_t offset) -> ssize_t { + .WillOnce(testing::Invoke([this](int fd, void *buf, size_t count, hoff_t offset) -> ssize_t { return this->fake_pread(fd, buf, count / 2, offset); })) - .WillRepeatedly(testing::Invoke([this](int fd, void *buf, size_t count, off_t offset) -> ssize_t { + .WillRepeatedly(testing::Invoke([this](int fd, void *buf, size_t count, hoff_t offset) -> ssize_t { return this->fake_pread(fd, buf, count, offset); })); EXPECT_CALL(mhip, hipMemcpy).WillRepeatedly(testing::Invoke(this, &RocFileRead::fake_hipMemcpy)); @@ -887,7 +889,7 @@ TEST_F(RocFileRead, fallback_read_handles_interrupted_pread) EXPECT_CALL(msys, mmap).WillOnce(testing::Invoke(::mmap)); EXPECT_CALL(msys, pread) .WillOnce(testing::Throw(Sys::RuntimeError(EINTR))) - .WillRepeatedly(testing::Invoke([this](int fd, void *buf, size_t count, off_t offset) -> ssize_t { + .WillRepeatedly(testing::Invoke([this](int fd, void *buf, size_t count, hoff_t offset) -> ssize_t { return this->fake_pread(fd, buf, count, offset); })); EXPECT_CALL(mhip, hipMemcpy).WillRepeatedly(testing::Invoke(this, &RocFileRead::fake_hipMemcpy)); @@ -970,7 +972,7 @@ TEST_F(RocFileRead, fallback_read_with_non_zero_file_offset) size_t file_length = buffer->getLength() * 3; init_file(file_length); - off_t file_offset = static_cast(buffer->getLength()); + hoff_t file_offset = static_cast(buffer->getLength()); expect_fallback_read(mhip, msys); ASSERT_EQ(buffer->getLength(), @@ -985,7 +987,7 @@ TEST_F(RocFileRead, fallback_read_to_eof_with_non_zero_file_offset) size_t file_length = buffer->getLength() * 2; init_file(file_length); - off_t file_offset = static_cast(buffer->getLength()); + hoff_t file_offset = static_cast(buffer->getLength()); expect_fallback_read(mhip, msys); ASSERT_EQ(buffer->getLength(), @@ -1000,7 +1002,7 @@ TEST_F(RocFileRead, fallback_read_past_eof_with_non_zero_file_offset) size_t file_length = buffer->getLength() * 2; init_file(file_length); - off_t file_offset = static_cast(buffer->getLength()) + 1; + hoff_t file_offset = static_cast(buffer->getLength()) + 1; expect_fallback_read(mhip, msys); ASSERT_EQ(buffer->getLength() - 1, @@ -1015,7 +1017,7 @@ TEST_F(RocFileRead, fallback_read_can_read_single_byte_at_end_of_file) size_t file_length = buffer->getLength(); init_file(file_length); - off_t file_offset = static_cast(file_length) - 1; + hoff_t file_offset = static_cast(file_length) - 1; expect_fallback_read(mhip, msys); ASSERT_EQ(1, Fallback().io(IoType::Read, file, buffer, buffer->getLength(), file_offset, 0)); @@ -1029,7 +1031,7 @@ TEST_F(RocFileRead, fallback_read_emtpy_file_with_non_zero_file_offset) size_t file_length = 0; init_file(file_length); - off_t file_offset = static_cast(buffer->getLength()); + hoff_t file_offset = static_cast(buffer->getLength()); expect_fallback_read(mhip, msys); ASSERT_EQ(0, Fallback().io(IoType::Read, file, buffer, buffer->getLength(), file_offset, 0)); @@ -1043,7 +1045,7 @@ TEST_F(RocFileRead, fallback_read_with_non_zero_buffer_offset) size_t file_length = buffer->getLength() * 2; init_file(file_length); - off_t buffer_offset = static_cast(1); + hoff_t buffer_offset = static_cast(1); expect_fallback_read(mhip, msys); ASSERT_EQ(buffer->getLength() - 1, @@ -1058,7 +1060,7 @@ TEST_F(RocFileRead, fallback_read_can_read_into_last_byte_of_buffer) size_t file_length = buffer->getLength(); init_file(file_length); - off_t buffer_offset = static_cast(buffer->getLength() - 1); + hoff_t buffer_offset = static_cast(buffer->getLength() - 1); expect_fallback_read(mhip, msys); ASSERT_EQ(1, Fallback().io(IoType::Read, file, buffer, 1, 0, buffer_offset)); @@ -1072,8 +1074,8 @@ TEST_F(RocFileRead, fallback_read_with_non_zero_buffer_offset_and_file_offset) size_t file_length = buffer->getLength(); init_file(file_length); - off_t file_offset = 74; - off_t buffer_offset = 97; + hoff_t file_offset = 74; + hoff_t buffer_offset = 97; size_t read_size = buffer->getLength() / 2; expect_fallback_read(mhip, msys); @@ -1087,8 +1089,8 @@ struct RocFileIoBackendSelectionParam : public ::testing::TestWithParam rocFileHandle_t handle; void *buffer; size_t io_size; - off_t file_offset; - off_t buffer_offset; + hoff_t file_offset; + hoff_t buffer_offset; int flags; std::shared_ptr> mfile; std::shared_ptr> mbuffer; diff --git a/rocfile/test/mbackend.h b/rocfile/test/mbackend.h index d175444e..d0594de8 100644 --- a/rocfile/test/mbackend.h +++ b/rocfile/test/mbackend.h @@ -12,11 +12,11 @@ namespace rocFile { struct MBackend : Backend { - MOCK_METHOD(int, score, (std::shared_ptr, std::shared_ptr, size_t, off_t, off_t), + MOCK_METHOD(int, score, (std::shared_ptr, std::shared_ptr, size_t, hoff_t, hoff_t), (const override)); MOCK_METHOD(ssize_t, io, - (rocFile::IoType type, std::shared_ptr, std::shared_ptr, size_t, off_t, - off_t), + (rocFile::IoType type, std::shared_ptr, std::shared_ptr, size_t, hoff_t, + hoff_t), (override)); }; diff --git a/shared/hipfile-types.h b/shared/hipfile-types.h new file mode 100644 index 00000000..ea1fffec --- /dev/null +++ b/shared/hipfile-types.h @@ -0,0 +1,19 @@ +/* Copyright (c) Advanced Micro Devices, Inc. All rights reserved. + * + * SPDX-License-Identifier: MIT + */ +#pragma once + +// *********************************************************************** +// PLATFORM-INDEPENDENT TYPES +// *********************************************************************** + +/*! + * @brief Platform-independent offset type + * @ingroup core + */ +#ifndef _WIN32 +typedef off_t hoff_t; +#else +typedef __int64 hoff_t; +#endif