| 3069 | // ------------------------------------------------------------------------------------ |
| 3070 | |
| 3071 | void copy_tensor( |
| 3072 | bool add_to, |
| 3073 | tensor& dest, |
| 3074 | size_t dest_k_offset, |
| 3075 | const tensor& src, |
| 3076 | size_t src_k_offset, |
| 3077 | size_t count_k |
| 3078 | ) |
| 3079 | { |
| 3080 | const size_t dest_sample_size = static_cast<size_t>(dest.nc() * dest.nr() * dest.k()); |
| 3081 | const size_t src_sample_size = static_cast<size_t>(src.nc() * src.nr() * src.k()); |
| 3082 | |
| 3083 | const size_t block_size = count_k * dest.nc() * dest.nr(); |
| 3084 | |
| 3085 | DLIB_CASSERT(dest.num_samples() == src.num_samples() && |
| 3086 | dest.nc() == src.nc() && dest.nr() == src.nr(), "All sources should fit into dest tensor size"); |
| 3087 | DLIB_CASSERT(dest.k() - dest_k_offset >= count_k, "Not enough space in dest tensor"); |
| 3088 | DLIB_CASSERT(src.k() - src_k_offset >= count_k, "Not enough space in src tensor"); |
| 3089 | |
| 3090 | float* dest_p = dest.host() + dest_k_offset * dest.nc() * dest.nr(); |
| 3091 | const float* src_p = src.host() + src_k_offset * src.nc() * src.nr(); |
| 3092 | |
| 3093 | for (long i = 0; i < src.num_samples(); ++i) |
| 3094 | { |
| 3095 | if (add_to) |
| 3096 | { |
| 3097 | for (size_t j = 0; j < block_size; ++j) |
| 3098 | dest_p[j] += src_p[j]; |
| 3099 | } |
| 3100 | else |
| 3101 | { |
| 3102 | ::memcpy(dest_p, src_p, block_size * sizeof(float)); |
| 3103 | } |
| 3104 | |
| 3105 | dest_p += dest_sample_size; |
| 3106 | src_p += src_sample_size; |
| 3107 | } |
| 3108 | } |
| 3109 | |
| 3110 | // ------------------------------------------------------------------------------------ |
| 3111 | |