piiswrong closed pull request #10830: fix creating cpu sparse array from gpu data URL: https://github.com/apache/incubator-mxnet/pull/10830
This is a PR merged from a forked repository. As GitHub hides the original diff on merge, it is displayed below for the sake of provenance: As this is a foreign pull request (from a fork), the diff is supplied below (as it won't show otherwise due to GitHub magic): diff --git a/src/ndarray/ndarray.cc b/src/ndarray/ndarray.cc index a643da1a8cb..67b4c061eee 100644 --- a/src/ndarray/ndarray.cc +++ b/src/ndarray/ndarray.cc @@ -1911,7 +1911,7 @@ void NDArray::SyncCopyFromNDArray(const NDArray& src, int i, int j) { if (src_dev_mask == cpu::kDevMask && dst_dev_mask == gpu::kDevMask) { Engine::Get()->PushAsync( [&](RunContext rctx, Engine::CallbackOnComplete on_complete) { - const TBlob src_data = (i >= 0? src.aux_data(i) : src.data()); + const TBlob src_data = (i >= 0 ? src.aux_data(i) : src.data()); TBlob dst_data = get_dst_data(src_data.shape_); ndarray::Copy<cpu, gpu>(src_data, &dst_data, src.ctx(), this->ctx(), rctx); rctx.get_stream<gpu>()->Wait(); @@ -1921,17 +1921,17 @@ void NDArray::SyncCopyFromNDArray(const NDArray& src, int i, int j) { } else if (src_dev_mask == gpu::kDevMask && dst_dev_mask == cpu::kDevMask) { Engine::Get()->PushAsync( [&](RunContext rctx, Engine::CallbackOnComplete on_complete) { - const TBlob src_data = (i >= 0? src.aux_data(i) : src.data()); + const TBlob src_data = (i >= 0 ? src.aux_data(i) : src.data()); TBlob dst_data = get_dst_data(src_data.shape_); ndarray::Copy<gpu, cpu>(src_data, &dst_data, src.ctx(), this->ctx(), rctx); rctx.get_stream<gpu>()->Wait(); on_complete(); - }, this->ctx(), const_vars, {this->var()}, + }, src.ctx(), const_vars, {this->var()}, FnProperty::kCopyFromGPU, 0, "SyncCopyFromNDArrayGPU2CPU"); } else if (src_dev_mask == gpu::kDevMask && dst_dev_mask == gpu::kDevMask) { Engine::Get()->PushAsync( [&](RunContext rctx, Engine::CallbackOnComplete on_complete) { - const TBlob src_data = (i >= 0? src.aux_data(i) : src.data()); + const TBlob src_data = (i >= 0 ? src.aux_data(i) : src.data()); TBlob dst_data = get_dst_data(src_data.shape_); ndarray::Copy<gpu, gpu>(src_data, &dst_data, src.ctx(), this->ctx(), rctx); rctx.get_stream<gpu>()->Wait(); diff --git a/tests/python/gpu/test_operator_gpu.py b/tests/python/gpu/test_operator_gpu.py index 08c749e597e..313730ca813 100644 --- a/tests/python/gpu/test_operator_gpu.py +++ b/tests/python/gpu/test_operator_gpu.py @@ -1834,6 +1834,24 @@ def test_batchnorm_backwards_notrain(): loss=y.square().sum() loss.backward(train_mode=False) +@with_seed() +def test_create_sparse_ndarray_gpu_to_cpu(): + dim0 = 10 + dim1 = 5 + densities = [0, 0.5, 1] + for density in densities: + shape = rand_shape_2d(dim0, dim1) + matrix = rand_ndarray(shape, 'row_sparse', density) + data = matrix.data + indices = matrix.indices + rsp_created = mx.nd.sparse.row_sparse_array((data, indices), shape=shape, ctx=mx.cpu()) + assert rsp_created.stype == 'row_sparse' + assert same(rsp_created.data.asnumpy(), data.asnumpy()) + assert same(rsp_created.indices.asnumpy(), indices.asnumpy()) + rsp_copy = mx.nd.array(rsp_created) + assert(same(rsp_copy.asnumpy(), rsp_created.asnumpy())) + + if __name__ == '__main__': import nose nose.runmodule() ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services