void argMinReduce(int lid, size_t lsize, __local float *values, __local int *indices){ for(int offset = lsize/2; offset > 0; offset >>= 1){ if(lid < offset){ argMin(values[lid], indices[lid], values[lid + offset], indices[lid + offset], values + lid, indices + lid); } barrier(CLK_LOCAL_MEM_FENCE); } }
index2 m::argMinRand(matrixn const& a, m_real thr) { index2 argMinV=argMin(a); std::vector<index2> indexes; m_real minV=a(argMinV(0), argMinV(1))*thr; for(int i=0; i<a.rows(); i++) { for(int j=0; j<a.cols(); j++) { if(a(i,j)<minV) { indexes.push_back(index2(i,j)); } } } return indexes[rand()%indexes.size()]; }