int main(int argc, char* argv[]) { if (argc > 1) { work_package_t work_package; for (int i = 1; i < argc; ++i) { if (strcmp("-data", argv[i]) == 0) work_package.file_cmp_options.file_data = false; else if (strcmp("-name", argv[i]) == 0) work_package.file_cmp_options.file_name = false; else if (strcmp("+data", argv[i]) == 0) work_package.file_cmp_options.file_data = true; else if (strcmp("+name", argv[i]) == 0) work_package.file_cmp_options.file_name = true; else { fs::path p(argv[i]); if (fs::exists(p)) { find_duplicate(p, work_package); } } } reduce_result(work_package); print_reduced_result(work_package); } return 0; }
int _tmain(int argc, _TCHAR* argv[]) { std::vector<double> test; for (int i = 0; i < 1000; i++) test.push_back(i); std::vector<int> buckets(1000); std::vector<double> result; int TARGET_K = 33; // algorithm starts here int K = TARGET_K; std::vector<int> need_buckets; int step = 0; int split_bucket = 0; int bucket = 0; int num_buckets = 10; double base_value = 0; std::vector<int> reduce_result(num_buckets); // find max to determine pivot value double pivot = 1000 / num_buckets; while (K > 0) { for (int i = 0; i < 1000; ++i) split(&test[i], &buckets[i], pivot, split_bucket, step, num_buckets, base_value); // reduce bucket counts for (int i = 0; i < reduce_result.size(); ++i) reduce_result[i] = 0; for (int i = 0; i < 1000; ++i) reduce_counts(&buckets[i], &reduce_result[0], step , num_buckets); // host code - analyse reduce result and schedule the next round for (int i = 0; i < reduce_result.size(); i++) { if (reduce_result[i] > K) { split_bucket = i + step*num_buckets; break; } else { K = K - reduce_result[i]; } } // copy data to result - use workgroup scans for the reduce_count steps for (int i = 0; i < 1000; ++i) copy_to_result(&test[i], &buckets[i], result, step, num_buckets, split_bucket); base_value += pivot * (split_bucket - step*num_buckets); // update pivot pivot = pivot / num_buckets; // increase step step++; } std::cout << "Steps " << step << std::endl; for (int i = 0; i < TARGET_K; ++i) std::cout << result[i] << " "; std::cout << std::endl; return 0; }