我正在开发opencl中的层次聚类算法.对于每个步骤,我在一个非常大的数组中找到最小值(大约10 ^ 8个条目),这样我就知道哪些元素必须组合成一个新的簇.最小值的识别必须进行9999次.使用我当前的内核,找到最小值(在所有迭代中累积)大约需要200秒.我是如何解决这个问题的方法是将数组分成2560个大小相同的片段(我的Radeon 7970上有2560个流处理器),并找到每个片段的最小值.我运行第二个内核,将这些最小值组合成全局最小值.
有没有更有效的方法来解决这个问题?最初的想法是通过使用OpenCL来加速HCA,但是识别最小值所花费的时间比CPU上的matlab HCA长得多.我究竟做错了什么?
__kernel void findMinValue(__global float * myArray, __global double * mins, __global int * elementsToWorkOn, __global int * arraysize){
int gid = get_global_id(0);
int minloc = 0;
float mymin = INFINITY;
int eltoWorkOn = *elementsToWorkOn;
int offset = gid*eltoWorkOn;
int target = offset + eltoWorkOn;
if (offset<*arraysize){
//make sure the array size is not exceeded
if (target > *arraysize){
target = *arraysize;
}
//find minimum for the kernel
for (int i = offset; i < …Run Code Online (Sandbox Code Playgroud)