Skip to content

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;
}
Clone this wiki locally