Skip to content
Snippets Groups Projects
benchmark.cu 2.12 KiB
Newer Older
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
#include <iostream>
#include <numeric>
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
#include <iomanip>
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed

#include <TNL/Containers/Array.h>
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
#include "../../src/util/timer.h"
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed

Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
//---------------------------
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
#include "../../src/bitonicSort/bitonicSort.h"
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
#define SORTERFUNCTION bitonicSort
//---------------------------
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed

using namespace TNL;
using namespace TNL::Containers;
using namespace std;
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
const int lowPow = 15, highLow = 22;
const int tries = 50;
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
double measure(const vector<int>&vec)
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
{
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
    Array<int, Devices::Cuda> arr(vec.size());
    vector<double> resAcc;

    for(int i = 0; i < tries; i++)
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
    {
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
        arr = vec;
        auto view = arr.getView();
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed

Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
        {
            TIMER t([&](double res){resAcc.push_back(res);});
            SORTERFUNCTION(view);
        }
    }
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
    return accumulate(resAcc.begin(), resAcc.end(), 0.0) / resAcc.size();
}
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed

Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
double sorted(int size)
{
    vector<int> vec(size);
    iota(vec.begin(), vec.end(), 0);
    
    return measure(vec);
}
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
double random(int size)
{
    srand(size);
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed

Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
    vector<int> vec(size);
    iota(vec.begin(), vec.end(), 0);
    random_shuffle(vec.begin(), vec.end());
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
    return measure(vec);
}
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
double almostSorted(int size)
{
    vector<int> vec(size);
    iota(vec.begin(), vec.end(), 0);
    for(int i = 0; i < 3; i++) //swaps 3 times in array
    {
        int s = rand() % (size - 3);
        std::swap(vec[s], vec[s + 1]);
    }
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed

Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
    return measure(vec);
}
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
double decreasing(int size)
{
    vector<int> vec(size);
    for(size_t i = 0; i < size; i++)
        vec[i] = -i;
                
    return measure(vec);
}
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed

Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
int main()
{
    string delim = "\t";
    cout << "size" << delim;
    cout << "random" << delim;
    cout << "sorted" << delim;
    cout << "almost" << delim;
    cout << "decreasing" << delim;
    cout << endl;
    
    for(int pow = lowPow; pow <= highLow; pow++)
    {
        int size =(1<< pow);
        vector<int> vec(size);
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
        cout << "2^" << pow << delim;
        cout << fixed << setprecision(3);
        cout << random(size) << delim;
        cout << sorted(size) << delim;
        cout << almostSorted(size) << delim;
        cout << decreasing(size) << delim;
        cout << endl;
Xuan Thang Nguyen's avatar
Xuan Thang Nguyen committed
    return 0;
}