Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 07628df

Browse files
committed
Fixed bug in dense bitset which causes it to use much much more memory than needed.
Added a test
1 parent f25cbee commit 07628df

3 files changed

Lines changed: 45 additions & 40 deletions

File tree

src/graphlab/util/dense_bitset.hpp

Lines changed: 11 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ namespace graphlab {
7676
inline void resize(size_t n) {
7777
len = n;
7878
//need len bits
79-
arrlen = next_powerof2(n) / sizeof(size_t) + 1;
79+
arrlen = (n / (sizeof(size_t) * 8)) + (n % (sizeof(size_t) * 8) > 0);
8080
array = (size_t*)realloc(array, sizeof(size_t) * arrlen);
8181
}
8282

@@ -296,20 +296,6 @@ namespace graphlab {
296296

297297
private:
298298

299-
inline size_t next_powerof2(size_t val) {
300-
--val;
301-
val = val | (val >> 1);
302-
val = val | (val >> 2);
303-
val = val | (val >> 4);
304-
val = val | (val >> 8);
305-
val = val | (val >> 16);
306-
#ifdef _LP64
307-
val = val | (val >> 32);
308-
#endif
309-
return val + 1;
310-
}
311-
312-
313299
inline static void bit_to_pos(uint32_t b, uint32_t& arrpos, uint32_t& bitpos) {
314300
// the compiler better optimize this...
315301
arrpos = b / (8 * sizeof(size_t));
@@ -551,20 +537,21 @@ namespace graphlab {
551537

552538
/// Serializes this bitset to an archive
553539
inline void save(oarchive& oarc) const {
554-
oarc <<len << arrlen;
555-
if (arrlen > 0) serialize(oarc, array, arrlen*sizeof(size_t));
540+
//oarc <<len << arrlen;
541+
//if (arrlen > 0)
542+
serialize(oarc, array, arrlen*sizeof(size_t));
556543
}
557544

558545
/// Deserializes this bitset from an archive
559546
inline void load(iarchive& iarc) {
560-
size_t l;
547+
/*size_t l;
561548
size_t arl;
562549
iarc >> l >> arl;
563550
ASSERT_EQ(l, len);
564-
ASSERT_EQ(arl, arrlen);
565-
if (arrlen > 0) {
566-
deserialize(iarc, array, arrlen*sizeof(size_t));
567-
}
551+
ASSERT_EQ(arl, arrlen);*/
552+
//if (arrlen > 0) {
553+
deserialize(iarc, array, arrlen*sizeof(size_t));
554+
//}
568555
}
569556

570557
size_t popcount() const {
@@ -577,21 +564,6 @@ namespace graphlab {
577564
}
578565

579566
private:
580-
581-
inline static size_t next_powerof2(size_t val) {
582-
--val;
583-
val = val | (val >> 1);
584-
val = val | (val >> 2);
585-
val = val | (val >> 4);
586-
val = val | (val >> 8);
587-
val = val | (val >> 16);
588-
#ifdef _LP64
589-
val = val | (val >> 32);
590-
#endif
591-
return val + 1;
592-
}
593-
594-
595567
inline static void bit_to_pos(uint32_t b, uint32_t &arrpos, uint32_t &bitpos) {
596568
// the compiler better optimize this...
597569
arrpos = b / (8 * sizeof(size_t));
@@ -616,11 +588,11 @@ namespace graphlab {
616588
}
617589

618590
static const size_t arrlen;
619-
size_t array[len / sizeof(size_t) + 1];
591+
size_t array[len / (sizeof(size_t) * 8) + (len % (sizeof(size_t) * 8) > 0)];
620592
};
621593

622594
template<int len>
623-
const size_t fixed_dense_bitset<len>::arrlen = len / sizeof(size_t) + 1;
595+
const size_t fixed_dense_bitset<len>::arrlen = len / (sizeof(size_t) * 8) + (len % (sizeof(size_t) * 8) > 0);
624596
}
625597
#endif
626598

tests/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ ADD_CXXTEST(factor_test.cxx)
1212
ADD_CXXTEST(small_map_test.cxx)
1313
ADD_CXXTEST(small_set_test.cxx)
1414
ADD_CXXTEST(fast_multinomial_test.cxx)
15-
15+
ADD_CXXTEST(dense_bitset_test.cxx)
1616

1717
# ADD_CXXTEST(graphlab_test.cxx)
1818
ADD_CXXTEST(serializetests.cxx)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ class DenseBitsetTestSuite : public CxxTest::TestSuite {
88
void test_densebitset(void) {
99
dense_bitset d;
1010
d.resize(100);
11+
d.clear();
1112
uint32_t probelocations[7] = {0, 10, 12, 50, 66, 81, 99};
1213
// test setting
1314
for (size_t i= 0;i < 7; ++i) {
@@ -34,7 +35,21 @@ class DenseBitsetTestSuite : public CxxTest::TestSuite {
3435
TS_ASSERT_EQUALS(iter, probelocations[ctr]);
3536
++ctr;
3637
}
38+
39+
std::stringstream strm;
40+
graphlab::oarchive oarc(strm);
41+
oarc << d;
42+
strm.flush();
43+
graphlab::iarchive iarc(strm);
44+
dense_bitset d2;
45+
iarc >> d2;
46+
3747

48+
for (size_t i = 0;i< 100; ++i) {
49+
bool inprobe=false;
50+
for (size_t j = 0;j <7; ++j) inprobe |= (probelocations[j] == i);
51+
TS_ASSERT_EQUALS(d2.get(i), inprobe);
52+
}
3853
// testclearing
3954
for (size_t i= 0;i < 7; ++i) {
4055
d.clear_bit(probelocations[i]);
@@ -75,13 +90,31 @@ class DenseBitsetTestSuite : public CxxTest::TestSuite {
7590
++ctr;
7691
}
7792

93+
std::stringstream strm;
94+
graphlab::oarchive oarc(strm);
95+
oarc << d;
96+
strm.flush();
97+
graphlab::iarchive iarc(strm);
98+
fixed_dense_bitset<100> d2;
99+
iarc >> d2;
100+
101+
102+
for (size_t i = 0;i< 100; ++i) {
103+
bool inprobe=false;
104+
for (size_t j = 0;j <7; ++j) inprobe |= (probelocations[j] == i);
105+
TS_ASSERT_EQUALS(d2.get(i), inprobe);
106+
}
107+
108+
78109
// testclearing
79110
for (size_t i= 0;i < 7; ++i) {
80111
d.clear_bit(probelocations[i]);
81112
}
82113
for (size_t i = 0;i< 100; ++i) {
83114
TS_ASSERT_EQUALS(d.get(i), false);
84115
}
116+
117+
85118
}
86119

87120

0 commit comments

Comments
 (0)