Skip to content

Commit dd60b3a

Browse files
committed
windows support complete
1 parent a078b0f commit dd60b3a

8 files changed

Lines changed: 250 additions & 85 deletions

File tree

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ nanobind_add_module(graphzero
1414
# 3. Compiler Settings
1515
target_include_directories(graphzero PRIVATE src)
1616
target_compile_features(graphzero PUBLIC cxx_std_20)
17+
target_compile_definitions(graphzero PRIVATE NOMINMAX)
1718

1819
# Link OpenMP if found (Essential for your Day 20 speedup)
1920
if(OpenMP_CXX_FOUND)

dummy.csv

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
src,dst
2+
0,1
3+
1,2
4+
2,0
5+
0,3

generateGraph.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
#include "src/csrFilegen.hpp"
22

3-
// int main(int argc, char const *argv[])
4-
// {
5-
// // generateLargeGraph(100000,0.05f,"graph-100T.gl");
6-
// return 0;
7-
// }
3+
int main(int argc, char const *argv[])
4+
{
5+
generateLargeGraph(100000,0.05f,"graph-100T.gl");
6+
return 0;
7+
}
88

99
// csv_to_gl
10-
int main(int argc, char** argv) {
11-
if (argc < 3) {
12-
std::cerr << "Usage: ./converter <input.csv> <output.gl> [directed=0]" << std::endl;
13-
return 1;
14-
}
15-
bool directed = (argc > 3 && std::string(argv[3]) == "1");
16-
convert_csv(argv[1], argv[2], directed);
17-
return 0;
18-
}
10+
// int main(int argc, char** argv) {
11+
// if (argc < 3) {
12+
// std::cerr << "Usage: ./converter <input.csv> <output.gl> [directed=0]" << std::endl;
13+
// return 1;
14+
// }
15+
// bool directed = (argc > 3 && std::string(argv[3]) == "1");
16+
// convert_csv(argv[1], argv[2], directed);
17+
// return 0;
18+
// }

src/CSR.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,15 @@ inline std::span<size_t> CSR::get_edges(size_t nodeId){
7272
}
7373

7474
inline void CSR::set_access_pattern(bool isRandom){
75+
#ifndef _WIN32
7576
if(isRandom){
7677
madvise(this->nnzRow,this->sizeofnnzRow,MADV_RANDOM);
7778
madvise(this->colPtr,this->sizeofcolPtr,MADV_RANDOM);
7879
}else{
7980
madvise(this->nnzRow,this->sizeofcolPtr,MADV_SEQUENTIAL);
8081
madvise(this->colPtr,this->sizeofcolPtr,MADV_SEQUENTIAL);
8182
}
83+
#endif // linux
8284
}
8385
// accessors
8486

src/Graphzero.hpp

Lines changed: 52 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ inline bool Graphzero::isNeighbor(size_t u, size_t v){
108108
// return next step in node2vec algo
109109
inline size_t Graphzero::node2vec_step(size_t curr, size_t prev, float p, float q, const AliasTable& table){
110110
// Rejection sampling
111-
float maxBias = std::max({1.0f,1.0f/p,1.0f/q});
111+
float maxBias = (std::max)({1.0f,1.0f/p,1.0f/q}); // for windows max
112112

113113
while (true)
114114
{
@@ -162,16 +162,20 @@ inline std::vector<size_t> Graphzero::randomWalk(size_t start_node, size_t lengt
162162

163163
//keep p = 1.0f and q = 1.0f for default values.
164164
inline std::vector<size_t> Graphzero::batchRandomWalk(const std::vector<size_t>& startNodes, size_t walkLength, float p, float q){
165-
std::vector<size_t> results;
166-
results.reserve(walkLength*startNodes.size());
165+
std::vector<size_t> results(walkLength*startNodes.size());
167166

168167
// set only for random walks
169168
storage->set_access_pattern(true);
170169

171170
#pragma omp parallel for
172-
for(size_t startNode: startNodes){
173-
std::vector<size_t> walk = randomWalk(startNode,walkLength,p,q);
174-
results.insert(results.end(),walk.begin(),walk.end()); // extend the results
171+
for(signed long long i = 0; i < startNodes.size(); i++){
172+
std::vector<size_t> walk = randomWalk(startNodes[i],walkLength,p,q);
173+
174+
// thread safe
175+
size_t offset = i*walkLength;
176+
for(int j = 0; j < walk.size(); j++){
177+
results[j+offset] = walk[j];
178+
}
175179
}
176180

177181
// reset
@@ -180,20 +184,57 @@ inline std::vector<size_t> Graphzero::batchRandomWalk(const std::vector<size_t>&
180184
}
181185

182186
inline std::vector<size_t> Graphzero::batchRandomUniformWalk(const std::vector<size_t>& startNodes, size_t walkLength){
183-
std::vector<size_t> results;
184-
results.reserve(walkLength*startNodes.size());
187+
std::vector<size_t> results(walkLength*startNodes.size());
185188

186189
// set only for random walks
187190
storage->set_access_pattern(true);
188191

189192
#pragma omp parallel for
190-
for(size_t startNode: startNodes){
191-
std::vector<size_t> walk = ReservoirSampling(startNode,walkLength);
192-
results.insert(results.end(),walk.begin(),walk.end()); // extend the results
193+
for(signed long long i = 0; i < startNodes.size(); i++){
194+
// walking here
195+
size_t offset = i*walkLength;
196+
size_t curr = startNodes[i], next;
197+
results[offset] = curr;
198+
for(size_t j = 1; j < walkLength; ++j){
199+
auto edges = storage->get_edges(curr);
200+
201+
if(edges.size() == 0){
202+
results[offset+j] = curr;
203+
continue;
204+
}
205+
206+
next = edges[RNG.rand_int(0,edges.size()-1)];
207+
results[offset + j] = next;
208+
curr = next;
209+
}
193210
}
194211

195212
// reset
196213
storage->set_access_pattern(false);
197214
return results;
198215
}
216+
217+
// not walk but sampling
218+
// inline std::vector<size_t> Graphzero::batchRandomUniformWalk(const std::vector<size_t>& startNodes, size_t walkLength){
219+
// std::vector<size_t> results;
220+
// results.reserve(walkLength*startNodes.size());
221+
222+
// // set only for random walks
223+
// storage->set_access_pattern(true);
224+
225+
// #pragma omp parallel for
226+
// for(size_t i = 0; i < num_nodes; i++){
227+
// std::vector<size_t> walk = ReservoirSampling(startNode,walkLength);
228+
229+
// // thread safe
230+
// size_t offset = i*walkLength;
231+
// for(int j = 0; j < walk.size(); j++){
232+
// results[j+offset] = walk[j];
233+
// }
234+
// }
235+
236+
// // reset
237+
// storage->set_access_pattern(false);
238+
// return results;
239+
// }
199240
#endif

src/MemoryMap.hpp

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,17 @@
22
#define MEMORYMAP_H
33
#include <string>
44
#include <cstddef>
5+
#include <stdexcept>
6+
#include <cstdint>
7+
8+
#ifdef _WIN32
9+
#include <windows.h>
10+
#else
511
#include <fcntl.h>
6-
#include <unistd.h>
712
#include <sys/stat.h>
13+
#include <unistd.h>
814
#include <sys/mman.h>
9-
#include <stdexcept>
15+
#endif
1016

1117
// only here
1218
const uint64_t MAGIC_NUM = 8388354976772092519; // 'graphlit' converted in size_t
@@ -26,9 +32,12 @@ struct GraphHeader {
2632
class MemoryMap
2733
{
2834
private:
35+
#ifndef _WIN32
2936
int fd; // file descriptor
30-
size_t length;
3137
struct stat st;
38+
#endif
39+
40+
size_t length;
3241
void* mappedptr;
3342
public:
3443
// constructor accquires, no flags currently
@@ -43,7 +52,36 @@ class MemoryMap
4352

4453
inline MemoryMap::MemoryMap(const char* path){
4554
// acquires resource/bin file on the Path given
55+
#ifdef _WIN32
56+
HANDLE hFile = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
57+
if(hFile == INVALID_HANDLE_VALUE) {
58+
CloseHandle(hFile);
59+
throw std::runtime_error("File open failed");
60+
}
61+
62+
LARGE_INTEGER fsize;
63+
if((GetFileSizeEx(hFile,&fsize)) == 0){
64+
CloseHandle(hFile);
65+
throw std::runtime_error("can not get file size ");
66+
}
67+
length = fsize.QuadPart;
4668

69+
HANDLE hMap = CreateFileMappingA(hFile,NULL,PAGE_READONLY, 0,0,NULL);
70+
if(hMap == NULL) {
71+
CloseHandle(hMap);
72+
CloseHandle(hFile);
73+
throw std:: runtime_error("File mapping failed");
74+
}
75+
76+
mappedptr = MapViewOfFile(hMap,FILE_MAP_READ, 0,0,0);
77+
if(mappedptr == NULL) {
78+
throw std::runtime_error("mappedptr is NULL, could not map");
79+
}
80+
81+
CloseHandle(hMap);
82+
CloseHandle(hFile);
83+
84+
#else // linux
4785
if((fd = open(path,O_RDONLY)) == -1){
4886
throw std::runtime_error("File open failed");
4987
}
@@ -61,21 +99,30 @@ inline MemoryMap::MemoryMap(const char* path){
6199

62100
// memory advise to use huge pages
63101
madvise(mappedptr,length, MADV_HUGEPAGE);
102+
103+
#endif
104+
64105
}
65106

66107
inline MemoryMap::~MemoryMap(){
67108
// release resource, destory itself
68-
109+
#ifdef _WIN32
110+
if (mappedptr != nullptr) {
111+
UnmapViewOfFile(mappedptr);
112+
mappedptr = nullptr;
113+
}
114+
#else// linux
69115
if(mappedptr != MAP_FAILED && mappedptr != nullptr){
70116
munmap(mappedptr,length);
71117
}
72118

73119
if(fd != -1){
74120
close(fd);
75121
}
76-
77122
fd = -1;
123+
78124
length = 0;
125+
#endif
79126
}
80127
inline void* MemoryMap::get_data(){
81128
// get data pointer

0 commit comments

Comments
 (0)