@@ -57,26 +57,34 @@ int RTDEF(CUFAllocatableAllocate)(Descriptor &desc, int64_t *stream,
5757
5858int RTDEF (CUFAllocatableAllocateSource)(Descriptor &alloc,
5959 const Descriptor &source, int64_t *stream, bool *pinned, bool hasStat,
60- const Descriptor *errMsg, const char *sourceFile, int sourceLine) {
60+ const Descriptor *errMsg, const char *sourceFile, int sourceLine,
61+ bool sourceIsDevice) {
6162 int stat{RTNAME (CUFAllocatableAllocate)(
6263 alloc, stream, pinned, hasStat, errMsg, sourceFile, sourceLine)};
6364 if (stat == StatOk) {
6465 Terminator terminator{sourceFile, sourceLine};
65- Fortran::runtime::DoFromSourceAssign (
66- alloc, source, terminator, &MemmoveHostToDevice);
66+ Fortran::runtime::DoFromSourceAssign (alloc, source, terminator,
67+ sourceIsDevice ? &MemmoveDeviceToHost : &MemmoveHostToDevice);
6768 }
6869 return stat;
6970}
7071
7172int RTDEF (CUFAllocatableAllocateSourceSync)(Descriptor &alloc,
7273 const Descriptor &source, int64_t *stream, bool *pinned, bool hasStat,
73- const Descriptor *errMsg, const char *sourceFile, int sourceLine) {
74- int stat{RTNAME (CUFAllocatableAllocateSync)(
75- alloc, stream, pinned, hasStat, errMsg, sourceFile, sourceLine)};
74+ const Descriptor *errMsg, const char *sourceFile, int sourceLine,
75+ bool sourceIsDevice) {
76+ int stat;
77+ if (sourceIsDevice) {
78+ stat = RTNAME (CUFAllocatableAllocate)(
79+ alloc, stream, pinned, hasStat, errMsg, sourceFile, sourceLine);
80+ } else {
81+ stat = RTNAME (CUFAllocatableAllocateSync)(
82+ alloc, stream, pinned, hasStat, errMsg, sourceFile, sourceLine);
83+ }
7684 if (stat == StatOk) {
7785 Terminator terminator{sourceFile, sourceLine};
78- Fortran::runtime::DoFromSourceAssign (
79- alloc, source, terminator, &MemmoveHostToDevice);
86+ Fortran::runtime::DoFromSourceAssign (alloc, source, terminator,
87+ sourceIsDevice ? &MemmoveDeviceToHost : &MemmoveHostToDevice);
8088 }
8189 return stat;
8290}
0 commit comments