Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
嵌套循环的C++多线程_C++_Multithreading_Loops_Optimization_Nested Loops - Fatal编程技术网

嵌套循环的C++多线程

嵌套循环的C++多线程,c++,multithreading,loops,optimization,nested-loops,C++,Multithreading,Loops,Optimization,Nested Loops,首先,我对多线程知之甚少,我很难找到优化代码的最佳方法,但多线程似乎是我应该走的道路 double applyFilter(struct Filter *filter, cs1300bmp *input, cs1300bmp *output) { long long cycStart, cycStop; cycStart = rdtscll(); output -> width = input -> width; output -> heig

首先,我对多线程知之甚少,我很难找到优化代码的最佳方法,但多线程似乎是我应该走的道路

double
applyFilter(struct Filter *filter, cs1300bmp *input, cs1300bmp *output)
{
    long long cycStart, cycStop;

    cycStart = rdtscll();

    output -> width = input -> width;
    output -> height = input -> height;

    int temp1 = output -> width;
    int temp2 = output -> height;

    int width=temp1-1;
    int height=temp2 -1;
    int getDivisorVar= filter -> getDivisor();  
    int t0, t1, t2, t3, t4, t5, t6, t7, t8, t9;

    int keep0= filter -> get(0,0);
    int keep1= filter -> get(1,0);
    int keep2= filter -> get(2,0);
    int keep3= filter -> get(0,1);
    int keep4= filter -> get(1,1);
    int keep5= filter -> get(2,1);
    int keep6= filter -> get(0,2);
    int keep7= filter -> get(1,2);
    int keep8= filter -> get(2,2);


    //Declare variables before the loop
    int plane, row, col;    

    for (plane=0; plane < 3; plane++) {
        for(row=1; row < height ; row++) {
            for (col=1; col < width; col++) {

                t0 = (input -> color[plane][row - 1][col - 1]) * keep0;
                t1 = (input -> color[plane][row][col - 1]) * keep1;
                t2 = (input -> color[plane][row + 1][col - 1]) * keep2;
                t3 = (input -> color[plane][row - 1][col]) * keep3;
                t4 = (input -> color[plane][row][col]) * keep4;
                t5 = (input -> color[plane][row + 1][col]) * keep5;
                t6 = (input -> color[plane][row - 1][col + 1]) * keep6;
                t7 = (input -> color[plane][row][col + 1]) * keep7;
                t8 = (input -> color[plane][row + 1][col + 1]) * keep8;

                // NEW LINE HERE

                t9 = t0 + t1 + t2 + t3 + t4 + t5 + t6 + t7 + t8;
                t9 = t9 / getDivisorVar;

                if ( t9 < 0 ) {
                    t9 = 0;
                }

                if ( t9  > 255 ) {
                    t9 = 255;
                } 

                output -> color[plane][row][col] = t9;
            } ....

所有这些代码很可能都不是必需的,但它确实提供了一些上下文。因为3个for循环中的第一个只从0-2开始,所以我希望有一种方法可以让底部的两个for循环在不同的平面值下同时运行。这可能吗?如果是这样,它真的会让我的程序更快吗?

是的,这是完全可能的。在这种情况下,您应该不必担心访问同步即争用条件,因为两个线程将在不同的数据集上操作

这肯定会加快多核机器上的代码速度

您可能想看看如果C++没有跨平台线程实现,那么您没有问题,因为您还没有指定目标平台。或者最好是


您还可以考虑检测核心数量并启动适当数量的线程,如在threadcount=minplanes、cores中,并为每个辅助函数提供访问单个平面数据集的权限。

是的,这是完全可能的。在这种情况下,您应该不必担心访问同步即争用条件,因为两个线程将在不同的数据集上操作

这肯定会加快多核机器上的代码速度

您可能想看看如果C++没有跨平台线程实现,那么您没有问题,因为您还没有指定目标平台。或者最好是


您还可以考虑检测核心数量并启动适当数量的线程,如在threadcount=minplanes、cores中,并为每个辅助函数提供访问单个平面的数据集的权限。

看起来您确实可以将其分解为线程,并且您可能会看到良好的速度提高。但是,编译器已经在尝试为您展开循环,并通过矢量化指令获得并行性。您的收益可能没有您想象的那么多,特别是当您正在使用来自不同位置的读取使内存总线饱和时


你可以考虑的是,如果这是一个2D图形操作,试着使用OpenGL或类似的,因为它将利用你的系统上的硬件,并且它内置了一些并行性。

看起来你可以把它分解成线程,你可能会看到一个很好的速度增加。但是,编译器已经在尝试为您展开循环,并通过矢量化指令获得并行性。您的收益可能没有您想象的那么多,特别是当您正在使用来自不同位置的读取使内存总线饱和时


你可以考虑的是,如果这是一个2D图形操作,试着使用OpenGL或类似的,因为它将利用你的系统上的硬件,并且它内置了一些并行性。

< P>我也会研究OpenMP。这是一个很好的库,它允许使用pragmas以非常简单的方式执行线程。OpenMP在许多平台上都是可编译的,您只需确保自己的平台支持它


我有一组代码,它有8个for循环级别,并且线程化非常好。

我还将研究OpenMP。这是一个很好的库,它允许使用pragmas以非常简单的方式执行线程。OpenMP在许多平台上都是可编译的,您只需确保自己的平台支持它


我有一组代码,它有8个for循环级别,并且线程化非常好。

线程化版本的代码将比简单实现慢。因为在线程版本中,将有很多时间花在同步上。此外,在线程版本中,您将有缓存性能缺陷

此外,具有3个过程的外部for循环很有可能由编译器展开并并行执行


您可以尝试创建线程版本并比较性能。无论如何,这将是有益的体验。

线程版本的代码将比简单的实现慢。因为在线程版本中,将有很多时间花在同步上。此外,在线程版本中,您将有缓存性能缺陷

此外,具有3个过程的外部for循环很有可能由编译器展开并并行执行


您可以尝试创建线程版本并比较性能。无论如何,这将是一次有益的体验。

对于这种情况,您可能比使用自动将For循环转换为线程的编译器做得更糟

对于这样的代码,编译器可以确定是否存在任何迭代间数据依赖关系。如果没有,那么它知道它可以在多个线程之间安全地分割for循环,将bog标准线程同步放在最后。通常,这样的编译器能够插入在运行时确定的代码 e拥有线程的开销是否会被好处所抵消

唯一的问题是,你有一个编译器来做这件事吗?如果是这样的话,那么这是迄今为止获得线程好处的最简单的方法,可以实现像这样简单、几乎公开的并行性


我知道Sun的C编译器可以做到这一点,我认为他们是最早做到这一点的公司之一。它可能只在Solaris版本的编译器上。我认为英特尔的编译器也可以。我对GCC有疑问,尽管我很高兴在这一点上得到纠正,我对微软的编译器也不太确定。

对于这种情况,你可能比使用自动将For循环转换为线程的编译器做得更糟

对于这样的代码,编译器可以确定是否存在任何迭代间数据依赖关系。如果没有,那么它知道它可以在多个线程之间安全地分割for循环,将bog标准线程同步放在最后。通常,这样的编译器能够插入代码,在运行时确定拥有线程的开销是否会被好处所抵消

唯一的问题是,你有一个编译器来做这件事吗?如果是这样的话,那么这是迄今为止获得线程好处的最简单的方法,可以实现像这样简单、几乎公开的并行性


我知道Sun的C编译器可以做到这一点,我认为他们是最早做到这一点的公司之一。它可能只在Solaris版本的编译器上。我认为英特尔的编译器也可以。我对GCC有疑问,尽管我很高兴在这一点上得到纠正,我对微软的编译器也不太确定。

在简要介绍了多线程之后,我就是这么想的,但我认为只要t0-t9都是线程的本地版本,这是可能的?因为所有其他变量都独立于循环。请确保线程中使用的所有变量都是线程本地变量,这样您就不必担心线程之间相互重叠,除了输入和输出数组。对于这些,只需以编程方式确保永远不会从两个不同的线程读/写相同的单元格,这样就不需要同步。对于一个线程,它需要109毫秒,4个线程需要47毫秒。但是由于这个过程非常简单,创建和等待线程的开销实际上已经足够大了,但是它仍然将计算所需的时间减少了一半以上。更复杂的循环肯定会从线程中受益更多。正如我所说,在这个例子中,除了等待线程完成之外,不需要任何同步。这就是我在简要介绍了多线程之后所想的,但我认为只要t0-t9都是线程的本地线程,这是可能的?因为所有其他变量都独立于循环。请确保线程中使用的所有变量都是线程本地变量,这样您就不必担心线程之间相互重叠,除了输入和输出数组。对于这些,只需以编程方式确保永远不会从两个不同的线程读/写相同的单元格,这样就不需要同步。对于一个线程,它需要109毫秒,4个线程需要47毫秒。但是由于这个过程非常简单,创建和等待线程的开销实际上已经足够大了,但是它仍然将计算所需的时间减少了一半以上。更复杂的循环肯定会从线程中受益更多。正如我所说,在这个示例中,除了等待线程完成之外,不需要任何同步。很抱歉没有指定。这将只在Ubuntu机器上运行,而且我提前知道我必须使用多少内核,因为这是一项家庭作业,所以我们能够专门围绕我们将评分的机器设计代码。很抱歉没有指定。这将只在Ubuntu机器上运行,而且我提前知道需要使用多少内核,因为这是一个家庭作业,所以我们能够专门围绕我们将被评分的机器设计代码。这段代码唯一要做的就是对2d图像应用3x3矩阵过滤器,并将修改后的图像扔掉,那么OpenGL值得研究吗?如果你能用矩阵乘法来表达你正在做的事情,我当然会推荐它。我相信你想看看着色库。这可能比你现在投入的精力还要多,但它确实是一个强大的资源。这段代码唯一要做的就是对2d图像应用3x3矩阵过滤器,并将修改后的图像扔掉,那么OpenGL值得研究吗?如果你能用矩阵乘法来表达你正在做的事情,我当然会推荐它。我相信你想看看着色库。这可能比你现在所能投入的更多努力,但这是一种浪费
这确实是一个强大的资源。我认为在这个特定的例子中,他可以很容易地摆脱同步。我不一定同意它将并行执行3遍for循环。我最近有一组类似的代码,循环数也非常少,少于系统中的可执行线程数,而且它并不是简单地编译成多线程版本,我必须自己明确地这样做。@W.B.他需要同步原语来保证所有线程都结束数据处理,结果是可以使用的。@inkooboo这是肯定的,但我认为这不应该构成巨大的开销。@trumpetlicks是的,可能这个循环不会展开,但无论如何,简单版本会更快。我认为在这个特殊的例子中,他不需要同步就可以很容易地脱身。我不一定同意它会在3次循环中并行执行。我最近有一组类似的代码,循环数也非常少,少于系统中的可执行线程数,而且它并不是简单地编译成多线程版本,我必须自己明确地这样做。@W.B.他需要同步原语来保证所有线程都结束数据处理,结果是可以使用的。@inkooboo这是肯定的,但我认为这不应该是一个巨大的开销。@trumpetlicks是的,可能这个循环不会展开,但无论如何简单的版本会更快。当我最终让OpenMP以我希望的方式在代码中工作时,它运行得更快!谢谢你的建议。一旦我最终让OpenMP以我想要的方式在我的代码中工作,它就会运行得更快!谢谢你的建议。