所以我想在RGB图像上执行2D卷积。我的RGB图像的形状为(20,20)
,我的滤镜的形状为(1296,3888,3)
我想做的是:
(2554,3869,3)
这可能吗?
我有两个GPU。我基本上想要在1 GPU上进行一半的卷积而在另一个GPU上进行另一半,因此这个问题的动机。
当我将图像分成两半并对每一半进行卷积时,返回的组合尺寸为(2573,3869,3)
,但如果我一次卷积整个图像,则返回的(正确)尺寸为#!/bin/sh
#set -x
for i in `cat output`;
do
eval "MASTER_$i = $(/usr/efm-2.0/bin/efm cluster-status $i 2>/dev/null |grep "Master" |head -1 |awk -F " " {'print$2'})";
echo -e "$MASTER_$i";
done
。
我想做什么的公式?
答案 0 :(得分:2)
您可以分两个阶段执行卷积,但两个GPU必须包含图像中心的19条(或可能是20条)线的重叠区域。 更好的是,如果卷积例程允许输出(大小+ 2k-1),那么可以通过对这两个结果进行求和来计算中间部分(正确对齐)。
答案 1 :(得分:1)
您的结果似乎只包含卷积产品已满的点,而不是应用任何零填充或类似扩展。因此,如果您精确分割,则缺少完整结果的中间部分。
您可以通过在滤镜大小分割的中间引入重叠来校正,即左侧图像的列为1至1306,第二列为1287至2592列(或者如果移位为-1,则为计数从0开始。
答案 2 :(得分:1)
是的,你可以将你的卷积分成两半。假设您的卷积滤波器以直接的方式工作,对于传统的GPU API应该相当简单。
您想要仔细考虑的问题是边缘效应:您的GPU会在图像的边界处做什么?您通常有许多选项,可以根据纹理采样对象的边界进行配置,以读取原始图像:镜像,环绕或固定颜色(如零)。
但是,如果双方都使用相同的原始图像进行采样,则两半之间的边界将接近纹理的中心,边缘效果不适用!每个半图像将在其自己的采样位置应用卷积,而不依赖于另一个。
请注意,如果要在GPU之间拆分输入图像(例如,最小化GPU和CPU之间的带宽),则必须按照过滤器的范围扩展源纹理的每一半 - 足以避免上面提到的边缘效应!