feat: add CUDA benchmark CLI and shared search algorithms
This commit is contained in:
parent
b4d677e83b
commit
12e4266950
12 changed files with 846 additions and 2 deletions
25
bench/test_math.cu
Normal file
25
bench/test_math.cu
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
#define main cli_entry_for_tests
|
||||
#include "slime_bench.cu"
|
||||
#undef main
|
||||
#include <random>
|
||||
void check(bool ok,const char*msg){if(!ok)throw std::runtime_error(msg);}
|
||||
int main(){
|
||||
uint64_t points=0,groups=0;std::mt19937_64 rng(123456);
|
||||
for(int r=0;r<=64;++r){Config c;c.x=-123;c.z=98;c.radius=r;std::set<std::pair<int32_t,int32_t>> actual;
|
||||
for(uint64_t i=0;i<anchors(r);++i){auto p=coordinate(c,i);actual.emplace(p.x,p.z);}
|
||||
check(actual.size()==anchors(r),"duplicate anchor");
|
||||
for(int dz=-r;dz<=r;++dz)for(int dx=-r;dx<=r;++dx)check(bool(actual.count({c.x+dx,c.z+dz}))==(std::abs(dx)+std::abs(dz)<=r),"diamond coverage mismatch");points+=actual.size();
|
||||
}
|
||||
Config large;large.radius=1000000;
|
||||
for(int t=0;t<100000;++t){auto p=coordinate(large,rng()%anchors(large.radius));check(std::abs(int64_t(p.x))+std::abs(int64_t(p.z))<=int64_t(large.radius),"large diamond mismatch");}
|
||||
for(int n:{1,2,3,4,5,6})for(int t=0;t<512;++t){
|
||||
Coord coord{int32_t(rng()%3750000)-1875000,int32_t(rng()%3750000)-1875000};int count=n*n;
|
||||
std::vector<sr::CellTerm> cells(count);terms(coord,n,cells.data());uint32_t root=rng()&262143,base=(rng()&131071)&~240U;
|
||||
std::vector<uint32_t> prepared(count*2);
|
||||
for(int i=0;i<count;++i){uint64_t a=root+cells[i].term;prepared[2*i]=a>>18;prepared[2*i+1]=((((a^sr::kCombinedXor)&262143)*sr::kJavaMultiplier+11)>>17);
|
||||
for(int j=0;j<16;++j)check(q(prepared.data(),i,base+16*j)==(sr::nextStateFromTerm(root+(uint64_t(base+16*j)<<18),cells[i].term)>>17),"prepared q mismatch");}
|
||||
uint32_t expected=0;for(int j=0;j<16;++j)if(fs::differenceFilter(root+(uint64_t(base+16*j)<<18),cells.data(),count))expected|=1U<<j;
|
||||
check(groupMask(prepared.data(),base,count)==expected,"variable-size group mask mismatch");++groups;
|
||||
}
|
||||
std::cout<<"{\"diamond_points\":"<<points<<",\"variable_size_groups\":"<<groups<<",\"passed\":true}\n";
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue