diff --git a/gpu-opt/Makefile b/gpu-opt/Makefile index dbf5263..2a9668e 100644 --- a/gpu-opt/Makefile +++ b/gpu-opt/Makefile @@ -1,5 +1,5 @@ main : main.cu util.h - nvcc -o main -std=c++11 main.cu + nvcc -o main -std=c++11 -O3 main.cu clean : rm main diff --git a/gpu-opt/main.cu b/gpu-opt/main.cu index 791752d..78d26fb 100644 --- a/gpu-opt/main.cu +++ b/gpu-opt/main.cu @@ -9,6 +9,8 @@ #include "util.h" #include "groups.h" +__constant__ Rel rels[128]; + struct Row { int rel; @@ -38,15 +40,12 @@ std::ostream &operator<<(std::ostream &o, const Row &r) { struct Solver { int ngens; int *cosets; - Rel *rels; Solver(int ngens, - thrust::device_vector &cosets, - thrust::device_vector &rels) + thrust::device_vector &cosets) : ngens(ngens), - cosets(thrust::raw_pointer_cast(cosets.data())), - rels(thrust::raw_pointer_cast(rels.data())) { - } + cosets(thrust::raw_pointer_cast(cosets.data())) { + } __device__ void operator()(Row &r) { @@ -95,13 +94,11 @@ struct CosetInitializer { // this creates rows for cosets by index of each relation table struct RowGen { - Rel *rels; - int coset; - RowGen(int coset, thrust::device_vector &rels) - : coset(coset), - rels(thrust::raw_pointer_cast(rels.data())) {} + RowGen(int coset) + : coset(coset) { + } __device__ Row operator()(int rel) { @@ -130,7 +127,8 @@ bool add_coset( int ngens, int *coset, int *hint, - thrust::device_vector &cosets) { + thrust::device_vector &dcosets) { + thrust::host_vector cosets = dcosets; *coset = cosets.size() / ngens; // todo: this part especially. @@ -142,10 +140,10 @@ bool add_coset( int from = *hint / ngens; int gen = *hint % ngens; - add_row(ngens, cosets); + add_row(ngens, dcosets); - cosets[*hint] = *coset; - cosets[*coset * ngens + gen] = from; + dcosets[*hint] = *coset; + dcosets[*coset * ngens + gen] = from; return false; } @@ -153,23 +151,23 @@ bool add_coset( // add a row for each relation table for some coset void gen_rows( int coset, - thrust::device_vector &rels, + int nrels, thrust::device_vector &rows) { - rows.resize(rows.size() + rels.size()); + rows.resize(rows.size() + nrels); thrust::counting_iterator counter(0); thrust::transform( thrust::device, - counter, counter + rels.size(), - rows.end() - rels.size(), - RowGen(coset, rels)); + counter, counter + nrels, + rows.end() - nrels, + RowGen(coset)); } // do everything. data is implicitly passed to the device via device_vector. thrust::device_vector solve( int ngens, - thrust::device_vector subs, - thrust::device_vector rels) { + int nrels, + thrust::device_vector subs) { thrust::device_vector cosets; thrust::device_vector rows; @@ -182,7 +180,7 @@ thrust::device_vector solve( CosetInitializer(cosets)); // generate initial relation table rows for coset 0 - gen_rows(0, rels, rows); + gen_rows(0, nrels, rows); // these keep track of what progress has been made int coset = 0; @@ -191,7 +189,7 @@ thrust::device_vector solve( // will break out later while (true) { // create a solver and apply it until nothing is being learned - Solver solve(ngens, cosets, rels); + Solver solve(ngens, cosets); thrust::for_each( thrust::device, rows.begin(), rows.end(), @@ -205,7 +203,7 @@ thrust::device_vector solve( if (done) break; // generate relation table rows for new coset - gen_rows(coset, rels, rows); + gen_rows(coset, nrels, rows); // move completed rows to the end of the list and remove. auto cut = thrust::partition( @@ -224,8 +222,10 @@ int main(int argc, const char* argv[]) { cox = proc_args(argc, argv); std::vector subs = {}; + cudaMemcpyToSymbol(rels, cox.rels.data(), cox.rels.size() * sizeof(Rel)); + auto s = std::chrono::system_clock::now(); - thrust::host_vector cosets = solve(cox.ngens, subs, cox.rels); + thrust::host_vector cosets = solve(cox.ngens, cox.rels.size(), subs); auto e = std::chrono::system_clock::now(); std::chrono::duration diff = e - s; diff --git a/gpu-slo/Makefile b/gpu-slo/Makefile index 0d927b1..950fd34 100644 --- a/gpu-slo/Makefile +++ b/gpu-slo/Makefile @@ -1,5 +1,5 @@ main : main.cu util.h - nvcc -o main -std=c++11 main.cu + nvcc -o main -std=c++11 -O3 main.cu clean : rm main