在CUDA,OpenCL,OpenGL计算机着色器和webgl中,是否可以创建一次性算法,如果数组中存在特定的值/字节,给定大数组/缓冲区将返回true? / p>
答案 0 :(得分:2)
是的,对于您的4个域中的至少3个。
对于CUDA,OpenCL和OpenGL计算机着色器,您可以编写一个内核,将缓冲区中的单个元素与所需的值进行比较,如果它们相同,则将输出缓冲区中的值设置为1(将缓冲区初始化为0 )。运行内核后,您可以检查缓冲区中的值。如果它是1,那么找到你想要的值,如果仍然是0,那么它不是。你甚至不需要对结果缓冲区进行原子访问,因为如果有种族设置它并不重要;任何人都可以赢。
我不了解WebGL所以我无法回答该域名。
答案 1 :(得分:2)
CUDA和OpenCL配备了原子计数器和设计精良的内核,可以轻松解决您的问题。您创建并运行内核,该内核将分配线程以处理几个值,这些值将与您正在搜索的值进行比较,并且可能使用原子计数器来设置它(或者如Dithermaster所说,您甚至不必使用原子计数器)。
即使是OpenGL也可以利用计算着色器功能并解决与上述两种技术相同的问题。
WebGL没有写入着色器的东西。唯一的方法是实际绘制一些东西。
例如,假设片段线程针对您需要的值测试某些(纹理采样)值。如果是该值,则写入白色片段,否则为 - 黑色片段。那么,您可以将单点基元渲染到1x1画布。问题是它不会太平行,只会创建几个线程。 (见this)
因此,您需要更大的帧缓冲区/画布来编写,以利用更多的并行性。你这样做,创建更大的画布,然后你可以生成渲染的帧缓冲区的最小mip级别,并检查该图像是否是黑色以外的任何其他。
(对于舍入数字存在问题,如果帧缓冲区太大,实际上可能会失去正面结果)
您可以尝试绘制许多点基元,而不是仅使用片段着色器,每个基元都具有将要测试的特定值集(数组属性或类似值),并将测试结果传递给片段着色器(通过变量)然后使用片段着色器将结果与其他片段混合。因此,使用顶点着色器测试值集,而片段着色器只在一些简单的1x1画布上写入混合结果。
希望这有帮助。
答案 2 :(得分:0)
如果数组已排序,则二进制搜索将是O(log(n))解决方案。如果数组未排序,则线性搜索将是O(n)解决方案。