-
Couldn't load subscription status.
- Fork 3
A GPU accelerated find() method
Hüseyin Tuğrul BÜYÜKIŞIK edited this page Feb 14, 2021
·
18 revisions
It's not very accelerated currently(14/02/2021) but it can do this:
preparing virtual array...
initializing data...
benchmarking find()...
found object at index: 834
data search: 300MB 678ms
found object at index: 10096
data search: 300MB 44ms
found object at index: 40001
data search: 300MB 44ms
found object at index: 40416
data search: 300MB 44ms
found object at index: 40225
data search: 300MB 44ms
found object at index: 40130
data search: 300MB 45ms
found object at index: 40128
data search: 300MB 44ms
found object at index: 40096
data search: 300MB 44ms
found object at index: 40226
data search: 300MB 44ms
#include "GraphicsCardSupplyDepot.h"
#include "VirtualMultiArray.h"
#include "PcieBandwidthBenchmarker.h"
// testing
#include <iostream>
#include "omp.h"
struct ArrayPassByValue
{
char buf[3];
};
class Obj
{
public:
Obj(){b=-1;}
Obj(int i){b=i;}
char a;
int b;
ArrayPassByValue arr;
char tmp;
};
int main(int argC, char ** argV)
{
std::cout<<"preparing virtual array..."<<std::endl;
size_t n = 100000000;
size_t p = 10000;
GraphicsCardSupplyDepot gpu;
VirtualMultiArray<Obj> arr(n,gpu.requestGpus(),p,3,{4,2,2});
std::cout<<"initializing data..."<<std::endl;
#pragma omp parallel for
for(int i=0;i<10;i++)
{
arr.mappedReadWriteAccess(i*(n/10),n/10,[&](Obj * ptr){
for(size_t j=i*(n/10);j<i*(n/10)+(n/10);j++)
{
Obj obj(j);
for(int k=0;k<3;k++)
obj.arr.buf[k]=' ';
obj.arr.buf[j%3]='X';
ptr[j]=obj;
}
},false,false,true);
}
std::cout<<"benchmarking find()..."<<std::endl;
Obj find;
for(int i=0;i<100;i++)
{
std::chrono::milliseconds t1 = std::chrono::duration_cast< std::chrono::milliseconds >(std::chrono::system_clock::now().time_since_epoch());
find.b=i;
for(int k=0;k<3;k++)
find.arr.buf[k]=' ';
find.arr.buf[i%3]='X';
int found = arr.find(find,find.arr);
std::chrono::milliseconds t2 = std::chrono::duration_cast< std::chrono::milliseconds >(std::chrono::system_clock::now().time_since_epoch());
std::cout<<"found object at index: "<<found<<std::endl;
std::cout<<"data search: "<<n*sizeof(ArrayPassByValue)/1000000.0<<"MB "<<(t2.count()-t1.count())<<"ms"<<std::endl;
}
return 0;
}