@@ -126,22 +126,43 @@ py_argsort(const dpctl::tensor::usm_ndarray &src,
126126 bool is_dst_c_contig = dst.is_c_contiguous ();
127127
128128 if (is_src_c_contig && is_dst_c_contig) {
129- static constexpr py::ssize_t zero_offset = py::ssize_t (0 );
129+ if (sort_nelems > 1 ) {
130+ static constexpr py::ssize_t zero_offset = py::ssize_t (0 );
130131
131- auto fn = sort_contig_fns[src_typeid][dst_typeid];
132+ auto fn = sort_contig_fns[src_typeid][dst_typeid];
132133
133- if (fn == nullptr ) {
134- throw py::value_error (" Not implemented for dtypes of input arrays" );
134+ if (fn == nullptr ) {
135+ throw py::value_error (
136+ " Not implemented for dtypes of input arrays" );
137+ }
138+
139+ sycl::event comp_ev =
140+ fn (exec_q, iter_nelems, sort_nelems, src.get_data (),
141+ dst.get_data (), zero_offset, zero_offset, zero_offset,
142+ zero_offset, depends);
143+
144+ sycl::event keep_args_alive_ev =
145+ dpctl::utils::keep_args_alive (exec_q, {src, dst}, {comp_ev});
146+
147+ return std::make_pair (keep_args_alive_ev, comp_ev);
135148 }
149+ else {
150+ assert (dst.get_size () == iter_nelems);
151+ int dst_elemsize = dst.get_elemsize ();
152+ static constexpr int memset_val (0 );
136153
137- sycl::event comp_ev =
138- fn (exec_q, iter_nelems, sort_nelems, src.get_data (), dst.get_data (),
139- zero_offset, zero_offset, zero_offset, zero_offset, depends);
154+ sycl::event fill_ev = exec_q.submit ([&](sycl::handler &cgh) {
155+ cgh.depends_on (depends);
140156
141- sycl::event keep_args_alive_ev =
142- dpctl::utils::keep_args_alive (exec_q, {src, dst}, {comp_ev});
157+ cgh.memset (reinterpret_cast <void *>(dst.get_data ()), memset_val,
158+ iter_nelems * dst_elemsize);
159+ });
143160
144- return std::make_pair (keep_args_alive_ev, comp_ev);
161+ sycl::event keep_args_alive_ev =
162+ dpctl::utils::keep_args_alive (exec_q, {src, dst}, {fill_ev});
163+
164+ return std::make_pair (keep_args_alive_ev, fill_ev);
165+ }
145166 }
146167
147168 throw py::value_error (
0 commit comments