cudaError_t cudaMemcpy3Dfix(const struct cudaMemcpy3DParms *param) { const cudaMemcpy3DParms& p = *param; // Use cudaMemcpy3D for 3D only // But it does not handle 2D or 1D copies well if (1<p.extent.depth) { return cudaMemcpy3D( &p ); } else if (1<p.extent.height) { // 2D copy // Arraycopy if (0 != p.srcArray && 0 == p.dstArray) { return cudaMemcpy2DFromArray(p.dstPtr.ptr, p.dstPtr.pitch, p.srcArray, p.srcPos.x, p.srcPos.y, p.extent.width, p.extent.height, p.kind); } else if(0 == p.srcArray && 0 != p.dstArray) { return cudaMemcpy2DToArray(p.dstArray, p.dstPos.x, p.dstPos.y, p.srcPtr.ptr, p.srcPtr.pitch, p.extent.width, p.extent.height, p.kind); } else if(0 != p.srcArray && 0 != p.dstArray) { return cudaMemcpy2DArrayToArray( p.dstArray, p.dstPos.x, p.dstPos.y, p.srcArray, p.srcPos.x, p.srcPos.y, p.extent.width, p.extent.height, p.kind); } else { return cudaMemcpy2D( p.dstPtr.ptr, p.dstPtr.pitch, p.srcPtr.ptr, p.srcPtr.pitch, p.extent.width, p.extent.height, p.kind ); } } else { // 1D copy // p.extent.width should not include pitch EXCEPTION_ASSERT( p.extent.width == p.dstPtr.xsize ); EXCEPTION_ASSERT( p.extent.width == p.srcPtr.xsize ); // Arraycopy if (0 != p.srcArray && 0 == p.dstArray) { return cudaMemcpyFromArray(p.dstPtr.ptr, p.srcArray, p.srcPos.x, p.srcPos.y, p.extent.width, p.kind); } else if(0 == p.srcArray && 0 != p.dstArray) { return cudaMemcpyToArray(p.dstArray, p.dstPos.x, p.dstPos.y, p.srcPtr.ptr, p.extent.width, p.kind); } else if(0 != p.srcArray && 0 != p.dstArray) { return cudaMemcpyArrayToArray(p.dstArray, p.dstPos.x, p.dstPos.y, p.srcArray, p.srcPos.x, p.srcPos.y, p.extent.width, p.kind); } else { return cudaMemcpy( p.dstPtr.ptr, p.srcPtr.ptr, p.extent.width, p.kind ); } } }
SEXP R_auto_cudaMemcpy2DArrayToArray(SEXP r_dst, SEXP r_wOffsetDst, SEXP r_hOffsetDst, SEXP r_src, SEXP r_wOffsetSrc, SEXP r_hOffsetSrc, SEXP r_width, SEXP r_height, SEXP r_kind) { SEXP r_ans = R_NilValue; cudaArray_t dst = (cudaArray_t) getRReference(r_dst); size_t wOffsetDst = REAL(r_wOffsetDst)[0]; size_t hOffsetDst = REAL(r_hOffsetDst)[0]; cudaArray_const_t src = (cudaArray_const_t) getRReference(r_src); size_t wOffsetSrc = REAL(r_wOffsetSrc)[0]; size_t hOffsetSrc = REAL(r_hOffsetSrc)[0]; size_t width = REAL(r_width)[0]; size_t height = REAL(r_height)[0]; enum cudaMemcpyKind kind = (enum cudaMemcpyKind) INTEGER(r_kind)[0]; cudaError_t ans; ans = cudaMemcpy2DArrayToArray(dst, wOffsetDst, hOffsetDst, src, wOffsetSrc, hOffsetSrc, width, height, kind); r_ans = Renum_convert_cudaError_t(ans) ; return(r_ans); }
cudaError_t WINAPI wine_cudaMemcpy2DArrayToArray( struct cudaArray *dst, size_t wOffsetDst, size_t hOffsetDst, const struct cudaArray *src, size_t wOffsetSrc, size_t hOffsetSrc, size_t width, size_t height, enum cudaMemcpyKind kind ) { WINE_TRACE("\n"); return cudaMemcpy2DArrayToArray( dst, wOffsetDst, hOffsetDst, src, wOffsetSrc, hOffsetSrc, width, height, kind ); }