Image processing 需要帮助并行化CUDA C程序中的if和else条件吗

Image processing 需要帮助并行化CUDA C程序中的if和else条件吗,image-processing,parallel-processing,cuda,Image Processing,Parallel Processing,Cuda,我已经用C写了一个用于图像模糊的过滤器,它工作得很好,我正在尝试使用CUDAC在GPU上运行,以加快处理速度。该程序有一些if和else条件,如下C代码版本所示, 函数的输入是输入图像、输出图像和列的大小 void convolve_young1D(double * in, double * out, int datasize) { int i, j; /* Compute first 3 output elements */ out[0] = B*in[0

我已经用C写了一个用于图像模糊的过滤器,它工作得很好,我正在尝试使用CUDAC在GPU上运行,以加快处理速度。该程序有一些if和else条件,如下C代码版本所示, 函数的输入是输入图像、输出图像和列的大小

  void convolve_young1D(double * in, double * out, int datasize) {
        int i, j;

    /* Compute first 3 output elements */
    out[0] = B*in[0];
    out[1] = B*in[1] + bf[2]*out[0];
    out[2] = B*in[2] + (bf[1]*out[0]+bf[2]*out[1]);

    /* Recursive computation of output in forward direction using filter parameters bf and B */
    for (i=3; i<datasize; i++) {
        out[i] = B*in[i];
        for (j=0; j<3; j++) {
            out[i] += bf[j]*out[i-(3-j)];
        }
    }

}
    //Calling function below
void convolve_young2D(int rows, int columns, int sigma, double ** ip_padded) {

        /** \brief Filter radius */
        w = 3*sigma;
        /** \brief Filter parameter q */
        double q;
        if (sigma < 2.5)
            q = 3.97156 - 4.14554*sqrt(1-0.26891*sigma);
        else
            q = 0.98711*sigma - 0.9633;

        /** \brief Filter parameters b0, b1, b2, b3 */
        double b0 = 1.57825 + 2.44413*q + 1.4281*q*q + 0.422205*q*q*q;
        double b1 = 2.44413*q + 2.85619*q*q + 1.26661*q*q*q;
        double b2 = -(1.4281*q*q + 1.26661*q*q*q);
        double b3 = 0.422205*q*q*q;

        /** \brief Filter parameters bf, bb, B */
        bf[0] = b3/b0; bf[1] = b2/b0; bf[2] = b1/b0;
        bb[0] = b1/b0; bb[1] = b2/b0; bb[2] = b3/b0;
        B = 1 - (b1+b2+b3)/b0;

        int i,j;

        /* Convolve each row with 1D Gaussian filter */
        double  *out_t = calloc(columns+(2*w),sizeof(double ));
        for (i=0; i<rows+2*w; i++) {
            convolve_young1D(ip_padded[i], out_t, columns+2*w);
         }
    free(out_t);
void-convolve\u-young1D(双进双出,整数数据大小){
int i,j;
/*计算前3个输出元素*/
out[0]=B*in[0];
out[1]=B*in[1]+bf[2]*out[0];
out[2]=B*in[2]+(bf[1]*out[0]+bf[2]*out[1]);
/*使用滤波器参数bf和B递归计算正向输出*/

对于(i=3;i来说,第一个问题是调用
convalve_-young(d_-input,d_-output,rows,columns,p,B,bf,w);
但是您定义了一个名为convalve_-young2D的内核

另一个可能的问题是要进行卷积:

for (p = 0; p<columns+2*w; p++){
    convolve_young<<<4,500>>>(d_input,d_output,rows,columns,p,B,bf,w);
}

用于(p=0;pMy提示是在CPU和GPU上使用相同的代码。然后,在将其移植到cuda之前,您可以使用#pragma openmp parallel for测试您的实现。如果您需要帮助,您需要提供一个。我无法告诉您问题是什么,除非看到一个简短完整的示例,我可以编译、运行并重现您的问题。感谢quick回复dari,从我现在读到的内容来看,我对#pragma openmp parallel知之甚少。它说它是一个简单的C/C++/Fortran编译器扩展,允许在现有源代码中添加并行性,但我怀疑它说openmp的线程创建非常耗时,我移植到GPU的目的是加速程序。确实如此Openmp利用GPU中的线程?@Talonmes我将在一段时间内粘贴程序完整可执行文件的链接,很抱歉没有上述完整信息。@SuhasS:这不是我要求的。不要在链接处粘贴内容。编辑可编译的最短代码,并将您的问题复制到您的问题中。对不起,我没有't未发送代码的编辑版本,我现在将在此处更新。感谢您的回复。
for (p = 0; p<columns+2*w; p++){
    convolve_young<<<4,500>>>(d_input,d_output,rows,columns,p,B,bf,w);
}
for (i=0; i<rows+2*w; i++) {
    convolve_young1D(ip_padded[i], out_t, columns+2*w);
}