Lazy initialization of device vector. (#5173)
* Lazy initialization of device vector. * Fix #5162. * Disable copy constructor of HostDeviceVector. Prevents implicit copying. * Fix CPU build. * Bring back move assignment operator.
This commit is contained in:
@@ -60,6 +60,7 @@ void PlusOne(HostDeviceVector<int> *v) {
|
||||
SetDevice(device);
|
||||
thrust::transform(dh::tcbegin(*v), dh::tcend(*v), dh::tbegin(*v),
|
||||
[=]__device__(unsigned int a){ return a + 1; });
|
||||
ASSERT_TRUE(v->DeviceCanWrite());
|
||||
}
|
||||
|
||||
void CheckDevice(HostDeviceVector<int>* v,
|
||||
@@ -125,7 +126,8 @@ TEST(HostDeviceVector, Copy) {
|
||||
// a separate scope to ensure that v1 is gone before further checks
|
||||
HostDeviceVector<int> v1;
|
||||
InitHostDeviceVector(n, device, &v1);
|
||||
v = v1;
|
||||
v.Resize(v1.Size());
|
||||
v.Copy(v1);
|
||||
}
|
||||
CheckDevice(&v, n, 0, GPUAccess::kRead);
|
||||
PlusOne(&v);
|
||||
|
||||
@@ -11,26 +11,26 @@ TEST(ColumnSampler, Test) {
|
||||
|
||||
// No node sampling
|
||||
cs.Init(n, 1.0f, 0.5f, 0.5f);
|
||||
auto set0 = *cs.GetFeatureSet(0);
|
||||
ASSERT_EQ(set0.Size(), 32);
|
||||
auto set0 = cs.GetFeatureSet(0);
|
||||
ASSERT_EQ(set0->Size(), 32);
|
||||
|
||||
auto set1 = *cs.GetFeatureSet(0);
|
||||
auto set1 = cs.GetFeatureSet(0);
|
||||
|
||||
ASSERT_EQ(set0.HostVector(), set1.HostVector());
|
||||
ASSERT_EQ(set0->HostVector(), set1->HostVector());
|
||||
|
||||
auto set2 = *cs.GetFeatureSet(1);
|
||||
ASSERT_NE(set1.HostVector(), set2.HostVector());
|
||||
ASSERT_EQ(set2.Size(), 32);
|
||||
auto set2 = cs.GetFeatureSet(1);
|
||||
ASSERT_NE(set1->HostVector(), set2->HostVector());
|
||||
ASSERT_EQ(set2->Size(), 32);
|
||||
|
||||
// Node sampling
|
||||
cs.Init(n, 0.5f, 1.0f, 0.5f);
|
||||
auto set3 = *cs.GetFeatureSet(0);
|
||||
ASSERT_EQ(set3.Size(), 32);
|
||||
auto set3 = cs.GetFeatureSet(0);
|
||||
ASSERT_EQ(set3->Size(), 32);
|
||||
|
||||
auto set4 = *cs.GetFeatureSet(0);
|
||||
auto set4 = cs.GetFeatureSet(0);
|
||||
|
||||
ASSERT_NE(set3.HostVector(), set4.HostVector());
|
||||
ASSERT_EQ(set4.Size(), 32);
|
||||
ASSERT_NE(set3->HostVector(), set4->HostVector());
|
||||
ASSERT_EQ(set4->Size(), 32);
|
||||
|
||||
// No level or node sampling, should be the same at different depth
|
||||
cs.Init(n, 1.0f, 1.0f, 0.5f);
|
||||
@@ -38,11 +38,11 @@ TEST(ColumnSampler, Test) {
|
||||
cs.GetFeatureSet(1)->HostVector());
|
||||
|
||||
cs.Init(n, 1.0f, 1.0f, 1.0f);
|
||||
auto set5 = *cs.GetFeatureSet(0);
|
||||
ASSERT_EQ(set5.Size(), n);
|
||||
auto set5 = cs.GetFeatureSet(0);
|
||||
ASSERT_EQ(set5->Size(), n);
|
||||
cs.Init(n, 1.0f, 1.0f, 1.0f);
|
||||
auto set6 = *cs.GetFeatureSet(0);
|
||||
ASSERT_EQ(set5.HostVector(), set6.HostVector());
|
||||
auto set6 = cs.GetFeatureSet(0);
|
||||
ASSERT_EQ(set5->HostVector(), set6->HostVector());
|
||||
|
||||
// Should always be a minimum of one feature
|
||||
cs.Init(n, 1e-16f, 1e-16f, 1e-16f);
|
||||
|
||||
Reference in New Issue
Block a user