【发布时间】:2016-02-03 04:46:59
【问题描述】:
我是 OpenCL 新手,在处理内存和本地工作组时遇到了一些麻烦。
我有一个四维数据结构,即 float[30][100][100][2025]。我目前按法线遍历前两个维度,并将生成的 2025x100 矩阵传递给以下 CPU 函数。
// num_columns = 100; num_rows = 2025
for (int column = 0; column < num_cols; column++){
vector = matrix[column];
float min = vector[0];
float max = vector[0];
for (int i = 0; i < num_rows; i++){
if(vector[i] < min){min = vector[i];}
if(vector[i] > max){max = vector[i];}
}
float diff = max-min + epsilon;
for(int i = 0; i < num_rows; i++){
vector[i] = (vector[i]-min)/diff; //MULTI-THREAD HERE
}
float mean = 0;
for (int i = 0; i < num_rows; i++){
mean += vector[i];
}
mean = mean/num_rows;
for (int i = 0; i < num_rows; i++){
vector[i] = vector[i]-mean + epsilon; //MULTI-THREAD HERE
}
float norm = 0;
for (int i = 0; i < num_rows; i++){
norm += vector[i]*vector[i];
}
norm = (float) sqrt(norm);
if (norm > 0){
for (int i = 0; i < num_rows; i++){
vector[i] = vector[i]/norm; //MULTI-THREAD HERE
}
}
}
我已经评论了我认为可以从使用 OpenCL 中受益的地方。遍历每一列,将向量写入设备缓冲区,执行规范化,然后将其读回主机会很昂贵。 GPU(htc one m8 上的 Adreno 330)具有一次缓冲整个 2025x100 矩阵的内存。但是,我必须将其展平为一维浮点数组,并且我不知道如何一次仅在缓冲区的一部分(单个向量)上执行内核。
我已经阅读了很多有关 GPU 架构的内容,但我似乎无法理解设计此架构的正确方法,以及我是否应该利用本地工作组来解决问题。我希望我已经为某人提供了足够的信息来引导我朝着正确的方向前进。
编辑:我知道有一个内置的 CLnormalize 函数,但我需要实现三个不同的标准化函数,我不知道它们中的任何一个是否与内置函数匹配。无论如何我都尝试测试它,但我收到一个错误,它没有找到与 normalize(float *vector) 匹配的内置函数。
【问题讨论】:
标签: opencl global local normalization