namespace saw { namespace impl { template struct hip_copy_to_device { static error_or apply(data& from, data** to){ static_assert(always_false, "Unsupported case."); return make_void(); } }; template struct hip_copy_to_device, Encoding> { using Schema = schema::Primitive; static error_or apply(data& from, data** to){ hipError_t malloc_err = hipMalloc(to, sizeof(data)); // HIP_CHECK(malloc_err); hipError_t copy_err = hipMemcpy(*to, &from, sizeof(data), hipMemcpyHostToDevice); // HIP_CHECK(copy_err); return make_void(); } }; template struct hip_copy_to_device, Encoding> { static_assert(Dim == 1u, "Only 1D arrays are supported for now."); static_assert(is_primitive::value, "Arrays can only handle primitives for now."); using Schema = schema::Array; static error_or apply(data& from, data** to){ typename native_data_type::type* dat{}; if(from.size() > 0u){ hipError_t data_malloc_err = hipMalloc(&dat,sizeof(typename native_data_type::type) * from.size()); hipError_t data_copy_err = hipMemcpy(dat, (from.get_raw_data()),sizeof(typename native_data_type::type) * from.size(), hipMemcpyHostToDevice); } // auto from_dat = &from.at(0); data tmp_fake_dat; { auto eov = tmp_fake_dat.adopt(dat, from.size()); if(eov.is_error()){ return eov; } } hipError_t malloc_err = hipMalloc(to, sizeof(data)); hipError_t copy_err = hipMemcpy(*to, &tmp_fake_dat, sizeof(data), hipMemcpyHostToDevice); tmp_fake_dat.extract(); return make_void(); } }; } }