精华内容
下载资源
问答
  • 现在多数设备、计算机都有多个CPU单元,即使是手机也是多核。但要在开发中使用多核优势,却需要一些技巧,花费时间...并行编程库在System.Threading单元中,其中提供了很多有用特性,可方便应用在已有项目和...

    现在多数设备、计算机都有多个CPU单元,即使是手机也是多核的。但要在开发中使用多核的优势,却需要一些技巧,花费时间编写额外的代码。好了,现在可以使用Delphi做并行编程了。

    在Delphi、C++ Builder和RAD Studio XE7中,有一个简化并行运行任务的库,叫做并行编程库。

    并行编程库在System.Threading单元中,其中提供了很多有用的特性,可方便的应用在已有项目和新项目中。提供了大量便利的重载函数,可同时支持C++和Object Pascal。

    这些特性包括易用的针对循环的并行运算,以及对运行任务、join任务(等待其他线程完成)、等待一组任务等操作提供支持的大量高级特性。支持这些功能的是一个自我管理的线程池(基于CPU数量)。

    为了演示使用并行库的简易程度,有人编写一个计算质数的范例。

    function IsPrime (N: Integer): Boolean;
    var
       Test: Integer;
    begin
       Result := True;
       for Test := 2 to N - 1 do
         if (N mod Test) = 0 then
       begin
         Result := False;
         break; {jump out of the for loop}
       end;
    end;
    //获取从1到X的质数个数的典型算法是顺序的循环检查其中的每个数,将总数记录在一个变量中(这里是一个整数Tot)。
    const
    Max = 50000; // 50K
    for I := 1 to Max do
    begin
       if IsPrime (I) then
         Inc (Tot);
    end;
    使用新的并行库,可把for循环用类函数TParallel.For替代,并传递一个匿名方法。
    //另外为避免多线程冲突,可以调用TInterlocked.Increment。
    TParallel.For(1, Max, procedure (I: Integer)
    begin
       if IsPrime (I) then
         TInterlocked.Increment (Tot);
    end;

    有哪些改进?

    使用System.Diagnostics单元的TStopWatch类可以方便的获取每种循环的运行时间。即使在2核虚拟机中运行,标准循环用时415ms,而并行只需192ms。在Mac上时间从382ms降到90ms。

    最让人喜爱的地方是,作为语言和框架的一部分,可非常容易的加入到现有代码中。

    在开发原生代码的时候可以利用多核设备(包括移动设备)的优势。然而,在移动设备上过多运行多线程会消耗更多电量。

    Samples

    其他并行编程库的范例可见Delphi和C++自带的Conways游戏范例:

    C:\Users\Public\Documents\Embarcadero\Studio\15.0\Samples\Object Pascal\RTL\Parallel Library

    C:\Users\Public\Documents\Embarcadero\Studio\15.0\Samples\CPP\RTL\Parallel Library

    不知道你感觉怎么样,我已经使用并行库将我的旧程序提速了,编程快乐。
     

    展开全文
  • CudaPy是一个运行时库,可让Python程序员访问NVIDIACUDA并行计算API。 它使您可以用Python编写CUDA内核,并提供了一个不错API来调用它们。 它通过将用Python编写CUDA内核转换为C ++,然后使用nvcc JIT编译来...
  • 1. 设计目的、意义(功能描述) 蒙特·卡罗方法(Monte ...学习并行计算的历程不会因为完成本次大作业而停止,我们是为了用知识武装大脑而学习,通过学习充实自己的生活,要努力学习,争取以后能够完成规模更大的程序。
  • 1. 设计目的、意义(功能描述) 蒙特·卡罗方法(Monte ...学习并行计算的历程不会因为完成本次大作业而停止,我们是为了用知识武装大脑而学习,通过学习充实自己的生活,要努力学习,争取以后能够完成规模更大的程序。
  • 然而我们PC中还有一个设备可以提供比CPU更加强大的并行计算设备——显卡,它在进行充分并行任务时可以提供高达数TFLOPS峰值运算能力,这几乎是2000-2001年间国产超级计算机运算能力。在显卡刚出现时,显卡内...

    近年来PC的计算能力发生了天翻地覆的变化。CPU逐渐趋向于多核发展,同时内存带宽和缓存不断增加,如今的PC已经成为小型的统一地址空间的并行计算机。然而我们的PC中还有一个设备可以提供比CPU更加强大的并行计算设备——显卡,它在进行充分并行的任务时可以提供高达数TFLOPS的峰值运算能力,这几乎是2000-2001年间国产超级计算机的运算能力。在显卡刚出现时,显卡内的模块都是为特定的图形任务而设计的。比如会有光照和坐标变换单元以及光栅单元等。随着显卡和图形技术的发展,在DirectX 8出现之后显卡开始允许在这些特殊单元处理的基础上增加编程控制。比如光照和坐标变换阶段可以用顶点着色器(Vertex Shader)进行控制,而光栅后的阶段则可以使用像素着色器(Pixel Shader)进行控制。这些“着色器(Shader)”其实就是运行在显卡上的程序。在DirectX 10阶段之后,整个渲染阶段可编程控制阶段大大增强,整个渲染流水线中各个阶段都可以通过着色器语言进行控制。因此DirectX 10后的显卡,都将执行着色器的运算单元从渲染过程中独立出来,成为一个统一着色单元,这些统一着色单元是可以大规模并行执行的运算单元。人们逐渐发现这些统一着色单元实际上可以进行与图形技术无关的通用技术。显卡的性能几乎按照三倍于摩尔定律的速度发展,GPU用于通用计算的潜力也非常巨大。比如本文编写时最强的GPU芯片——Ati Radeon HD5870可以提供2.72TFLOPS的单精度峰值浮点运算性能和500GFLOPS左右的双精度峰值浮点运算性能。而时下最先进的酷睿i7四核处理器只能提供60-80GFLOPS的峰值浮点运算能力。

    GPU芯片制造商nVidia和Ati是GPU通用计算的先行者,他们分别提供了CUDA和Ati Stream技术用于GPU程序的开发。随后由苹果等厂商领导并获得诸多厂商支持的OpenCL出台,成为GPU通用计算的统一标准。而微软也看到了这个潜力,在DirectX 11中提供了不与具体渲染流程绑定的计算着色器(Compute Shader)。虽然还叫“着色器”,但是Compute Shader已经是完全通用的编程技术。编程语言方面CUDA采用的编程语言有扩展的C、C++和Fortran等,OpenCL采用的是扩展的标准C。而DirectX Compute Shader是和C类似的HLSL语言。从开发难度来讲DirectX要比CUDA和OpenCL难用。HLSL没有指针,而且需要动态编译和执行。但是目前Compute Shader 5.0支持双精度浮点数、完善的原子操作和三维线程组支持。它还支持32KB的线程组共享内存。因此采用Compute Shader进行通用计算仍然是一个值得研究的领域。我也是DirectX的初学者,对它的图形技术一窍不通,完全是本着通用计算的目的来学习HLSL。下面就动手来实现一个非常适合并行计算的程序——曼德勃罗特集。

    曼德勃罗特(Mandelbrot)集是一种复平面上的点集。对任意复数c,我们采用以下公式:

    clip_image002

    进行迭代,所得的所有复数的集合就叫曼德勃罗特集,其中z从0开始。这个公式如此的简单,但效果却非同一般。我们会发现许多点在迭代中处于亚稳定的状态,它们会在迭代数次之后逃逸(发散)。而这个迭代次数对每一点c而言都是不同的。如果我们画出复平面中各个点的迭代次数,就会发现它能组成难以置信的图案。

    首先我们能够发现每一个复数c都能够独立地采用这个这个公式进行运算,它无需与其他的点进行任何交互。因此该算法默认就是完全并行的。我们只需要按照每一个输入进行划分就可以轻易地写出HLSL的代码。

    我们先来看看代码,然后再来分析:

    #define MAX_ITER 32768
    
    //--------------------------------------------------------------------------------------
    // Constant Buffers
    //--------------------------------------------------------------------------------------
    cbuffer CB : register( b0 )
    {
        unsigned int c_Stride;
        unsigned int c_Width;
        unsigned int c_Height;
        float c_RealMin;
        float c_ImagMin;
        float c_ScaleReal;
        float c_ScaleImag;
    };
    
    
    RWStructuredBuffer<unsigned int> Data : register( u0 );
    
    inline uint ComposeColor(uint index)
    {    
        index = index * clamp(0, 1, MAX_ITER - index);
        uint red, green, blue;
    
        float phase = index * 3.0f / MAX_ITER;
        red = (uint)(max(0.0f, phase - 2.0f) * 255.0f);
        green = (uint)(smoothstep(0.0f, 1.0f, phase - 1.3f) * 255.0f);
        blue = (uint)(max(0.0f, 1.0f - abs(phase - 1.0f)) * 255.0f);
        
        return 0xff000000 | (red << 16) | (green << 8) | blue;
    }
    
    [numthreads(16, 16, 1)]
    void Calculate(uint3 DTid : SV_DispatchThreadID)
    {
        float2 c;
        c.x = c_RealMin + (DTid.x * c_ScaleReal);
        c.y = c_ImagMin + ((c_Width - DTid.y) * c_ScaleImag);
        
        float2 z;
        z.x = 0.0f;
        z.y = 0.0f;
        
        float temp, lengthSqr;
        uint count = 0;
        
        do
        {
            temp = z.x * z.x - z.y * z.y + c.x;
            z.y = 2 * z.x * z.y + c.y;
            z.x = temp;
            
            lengthSqr = z.x * z.x + z.y * z.y;
            count++;
        }
        while ((lengthSqr < 4.0f) && (count < MAX_ITER));    
        
        //write to result
        uint currentIndex = DTid.x + DTid.y * c_Width;
        
        Data[currentIndex] = ComposeColor(log(count) / log(MAX_ITER) * MAX_ITER);
    }

    如你所见,HLSL和C语言十分相似,只是有一些特别的扩展。一开始的cbuffer称为Constant Buffer,是显卡里所有线程都能访问的资源。我们调用Compute Shader程序时传的参数就都要放入Constant Buffer当中。下面就是HLSL的函数。HLSL没有栈,因此函数不能递归调用。所有函数的参数和本地变量都储存在寄存器中。共有4096个寄存器可以用于这个目的。

    ComposeColor是我为了画出好看的颜色而编写的,可以自由发挥,下面跳过它看Calculate,这就是我们的主角。DirectX中每一个着色器程序都绑定到一个特定的渲染流程上,因此着色器程序通常都有一个作用目标。例如像素着色器针对每个像素执行,顶点着色器针对每个顶点执行。而计算着色器不与这些图形概念绑定,计算着色器针对的是“线程”。每一个线程执行一次。在这段代码里[numthreads(16, 16, 1)]是对线程进行分组的attribute。Compute Shader 5.0可以将线程分为三维的线程组。这个attribute就用来描述每一组的线程数。我们这个应用实际不需要进行分组,但是分组可以增加处理数据的规模。比如采用1024个线程的线程组,就能处理多达67108864个输入数据。请注意,计算着色器总是大量线程并行执行的状态,编写它的时候一定要变换思想,不要采用顺序编程的思路。

    我们的Calculate函数输入参数DTid是一个三维向量,它有一个显式用途SV_DispatchThreadID,这表示线程的分布ID(DispatchID),也就是线程组的ID与组内线程ID的乘积。我们用它来表示复平面的输入点坐标。首先我们把输入点换算成从-2i – 2i和-2 - 2这个区间的点坐标。这就是我们公式里的c。然后就简单了,按照公式迭代就行了。迭代终止条件有两个:一是迭代变量z的模大于2(表示这个点发散了),二是达到了最大的迭代次数MAX_ITER。每个点迭代次数具体是多少是无法知道的,不过它不会大于MAX_ITER。这里进行复数运算时所用的类型是float2,它是一个有两个float分量的向量。

    最后我们要把迭代次数输出回CPU,这里使用的是一个RWStructuredBuffer,它是DirectX 11新增的可写缓冲区类型,是通过乱序访问缓冲区视图(unordered access view)建立的。其声明中的寄存器u0指向的就是乱序访问视图。使用这个缓冲区我们就可以让各个线程以顺序无关的方式写入自己的结果。比如我们先利用DTid的分量计算出该像素在输出缓冲区中的位置,然后用一条赋值语句写入该缓冲。

    比起编写这个HLSL,让他运行起来可要麻烦多了。这真是个不幸的事实。我们需要在CPU端创建Direct X的设备,逐个创建各个缓冲区、缓冲区视图并且填充缓冲区。还需要创建拷贝结果的辅助缓冲。我完全是按照Direct X SDK中的例子编写的,否则还真没法轻松的写出来。大家也只好先看SDK的例子学习吧……也许使用OpenCL不需要这么多麻烦的辅助工作。

    先让我们看看结果吧!首先是从-2i ~ 2i以及-2 ~ 2区间的图形:

    1

    黑色区域要么是逃逸的点,要么是迭代次数超过了最大限度的点(稳定的点)。剩下的亚稳定点组成了神奇的美丽图形。当我们重新计算局部区域的时候,会惊喜地发现它有极其复杂的微观结构

    2 3 4 5

    (点击看大图)。

    而最大迭代次数也会对图形产生很大的影响。下面是同一局部分别迭代最大256次-32768次的不同图形

    6-256 6-512 6-1024 6-2048 6-4096 6-8192 6-16384 6-32768

    (点击看大图)

    怎么样,非常神奇吧。好像看到了宇宙诞生的奥秘。

    下一次我们将进行CPU运算和GPU运算的性能比较分析,敬请期待。

    转载于:https://www.cnblogs.com/Ninputer/archive/2009/11/24/1609364.html

    展开全文
  • 它快速,易于构建,并提供可扩展的Rust结构以在几乎任何计算机上执行操作,即使它没有支持CUDA或OpenCL的设备也是如此。 Collenchyma对不同计算语言(本机,OpenCL,Cuda)的摘要,借助轻松的并行化,您可以运行高...
  • 除了图形外,Metal 2还集成了许多库,这些库为必需线性代数运算和信号处理功能提供了出色的并行化支持,这些功能可以在各种Apple设备中运行。 这些库使我们有可能基于其他框架提供的经过训练模型,在iOS设备上...
  • selenium并行 到目前为止,Selenium是最常用Web自动化... 您可以在所有功能测试中获得广泛浏览器覆盖,从而确保为广大潜在用户提供完美体验。 但是,这是一个挑战。 您只能在本地计算机上加载这么多不同...

    selenium并行

    到目前为止,Selenium是最常用的Web自动化测试工具。 如此受欢迎的原因之一是Selenium的自动跨浏览器测试功能。 Selenium自动化测试可以帮助您在所有主要浏览器,所有主要操作系统甚至移动设备浏览器上进行测试。 您可以在所有功能测试中获得广泛的浏览器覆盖,从而确保为广大潜在用户提供完美的体验。

    但是,这是一个挑战。 您只能在本地计算机上加载这么多不同的浏览器。 例如,如果您有Windows计算机,则无法在Safari浏览器上进行测试,类似地,如果您具有Mac计算机,则将无法在IE或Edge浏览器上进行测试。 此外,在一台计算机上运行测试是一个耗时的过程。 如果您有多台计算机,为什么要一次测试一台呢?

    理想的方案是在具有不同浏览器环境的互连机器网络上进行测试,该浏览器环境同时并行运行多个测试用例,并将总测试时间减少数倍。 在这里,我还包括了跨浏览器测试所花费的时间。

    而这正是Selenium Grid的基础。 Selenium WebDriver允许您以顺序方式执行自动跨浏览器测试不同 ,Selenium Grid设置将允许您在不同的浏览器/浏览器版本中同时运行测试用例。

    什么是Selenium网格?

    在开始Selenium Grid设置之前,有必要了解Selenium Grid的基础知识。

    因此,Selenium Grid基本上允许我们针对不同的浏览器在不同的操作系统上运行自动化测试。 而且这也是并行的。 Selenium自动化测试工具将帮助您更快地进行跨浏览器自动化测试,并有效利用内部硬件。

    Selenium Grid由两个概念组成:

    • 集线器:它是Selenium Grid设置体系结构的中心,用于管理测试机器的网络。 网络中只有一个集线器被分配给DesiredCapabilities测试(操作系统,浏览器,浏览器版本),然后集线器会找到与给定配置匹配的测试。
    • 节点:节点是执行先前在集线器上加载的测试的测试计算机。 可以有多个配置有不同操作系统和不同浏览器的节点。 节点在运行集线器的同一平台上运行不是强制性的。

    配置Selenium Grid设置以并行执行的基础结构仅涉及两个步骤:

    1. 创建中心。
    2. 定义节点并连接到该集线器。

    使用命令提示符进行Selenium Grid设置

    Selenium Grid设置的第一步是创建一个集线器。 您必须确保系统已安装Java Runtime Environment(JRE)或更好的Java Development Kit(JDK)。 尽管大多数人建议使用最新的JDK,但我更喜欢早先经过测试和测试的版本,例如JDK SE 08或09。如果愿意,可以选择最新的版本。 以下是后续步骤–

    • 下载并解压缩Selenium Standalone服务器JAR文件。 您可以从此处下载它们。
    • 接下来,打开命令提示符或终端,然后导航到保存Selenium Standalone Server jar文件的目录。
    • 运行命令“ java -jar selenium-server-standalone-3.141.59.jar -role hub”。 默认情况下,此命令将在端口4444上启动Selenium Grid集线器。 您也可以通过定向到http:// localhost:4444 / grid / console来进行检查

    由于已经创建了中心,因此进行并行执行的Selenium Grid设置的下一步将涉及启动节点。 首先,转到要在其中设置节点的其他计算机。 同样,这些机器应具有JDK / JRE设置。

    在节点机器上,打开命令提示符或终端,然后导航到保存浏览器驱动程序文件的目录。

    输入以下命令,以便在Selenium Grid设置中配置Chrome驱动程序以并行执行

     “java -Dwebdriver.chrome.driver= "C:\chromedriver.exe" -jar  selenium-server-standalone- 3.141 . 59 .jar -role webdriver -hub  http: //10.0.0.22:4444/grid/register -port 4546” 
    • 在上面的命令中,我已将计算机IP以及集线器实际运行的端口4444一起使用。 我还选择了要我的节点注册的端口4546。 您可以选择任何空闲端口来注册节点。

    同样,您可以为其他浏览器注册其他节点。 例如,这是将Firefox(Gecko)驱动程序和Internet Explorer驱动程序配置到Selenium Grid设置以并行执行的方法。

    在Selenium Grid设置中配置Firefox(Gecko)驱动程序:

     “java -Dwebdriver.gecko.driver= "C:\geckodriver.exe" -jar  selenium-server-standalone- 3.141 . 59 .jar -role webdriver -hub  http: //10.0.0.22:4444/grid/register -port 5566” 

    在Selenium Grid设置中配置IE(Internet Explorer)驱动程序:

     “java -Dwebdriver.ie.driver= "C:\IEDriverServer.exe" -jar  selenium-server-standalone- 3.141 . 59 .jar -role webdriver -hub  http: //10.0.0.22:4444/grid/register -port 4547” 

    注意:请确保为不同的节点选择不同的端口,以与在端口4444上运行的单个集线器连接。此外,在IE上运行测试之前,请确保浏览器缩放正好是100%,否则可能显示错误。

    您可以通过上面的命令注意到,我们在端口4546上运行chrome驱动程序的第一个节点,在端口5566上运行Firefox驱动程序的第二个节点,在端口4547上运行IE浏览器的第三个节点。这是输出屏幕截图供进一步参考:

    现在,我们已经配置了Selenium Grid设置,下一步就是为您的跨浏览器测试套件执行Selenium自动化测试。

    使用Selenium Grid执行自动化测试以并行执行

    现在该进行一些自动化的跨浏览器测试了! 我将运行一个自动化脚本,演示Selenium Grid的并行执行。 该脚本将在Chrome,Firefox和Internet Explorer上并行运行,而Chrome,Firefox和Internet Explorer在不同的端口上注册并附加到单个集线器。

    这是我使用Selenium Grid执行自动化测试以在不同浏览器中并行执行的示例代码。

     package DemoAutomation;   import java.net.MalformedURLException;  import java.net.URL;  import java.util.concurrent.TimeUnit;   import org.openqa.selenium.By;  import org.openqa.selenium.Platform;  import org.openqa.selenium.WebDriver;  import org.openqa.selenium.ie.InternetExplorerDriver;  import org.openqa.selenium.remote.CapabilityType;  import org.openqa.selenium.remote.DesiredCapabilities;  import org.openqa.selenium.remote.RemoteWebDriver;  import org.testng.annotations.AfterMethod;  import org.testng.annotations.BeforeMethod;  import org.testng.annotations.DataProvider;  import org.testng.annotations.Parameters;  import org.testng.annotations.Test;    public class Selenium_MultiBrowser_Test  { 
         WebDriver driver; 
         String nodeURL;     
         @Parameters ({ "Port" }) 
         @BeforeMethod () 
         public void setUp(String Port) throws MalformedURLException 
         { 
             if (Port.equalsIgnoreCase( "4546" )) 
             { 
                 nodeURL = " http://10.0.0.22:4546/wd/hub " ; 
                 System.out.println( "Chrome Browser Initiated" ); 
                 DesiredCapabilities capabilities = DesiredCapabilities.chrome(); 
                 capabilities.setBrowserName( "chrome" ); 
                 capabilities.setPlatform(Platform.WINDOWS);             
                 driver = new RemoteWebDriver( new URL(nodeURL),capabilities);             
                 driver.get( " https://www.apple.com/ " ); 
                 driver.manage().window().maximize(); 
                 driver.manage().timeouts().implicitlyWait( 10 , TimeUnit.SECONDS); 
             }         
             else 
                 if (Port.equalsIgnoreCase( "5566" )) 
                 { 
                     nodeURL = " http://10.0.0.22:5566/wd/hub " ; 
                     System.out.println( "Firefox Browser Initiated" ); 
                     DesiredCapabilities capabilities1 = DesiredCapabilities.firefox(); 
                     capabilities1.setBrowserName( "firefox" ); 
                     capabilities1.setPlatform(Platform.WINDOWS);                 
                     driver = new RemoteWebDriver( new URL(nodeURL),capabilities1);                 
                     driver.get( " https://www.apple.com/ " ); 
                     driver.manage().window().maximize(); 
                     driver.manage().timeouts().implicitlyWait( 10 , TimeUnit.SECONDS); 
                 }         
             else             
             if (Port.equalsIgnoreCase( "4547" )) 
             { 
                 nodeURL = " http://10.0.0.22:4547/wd/hub " ; 
                 System.out.println( "Internet Browser Initiated" ); 
                 DesiredCapabilities capabilities2 = DesiredCapabilities.internetExplorer(); 
                 capabilities2.setBrowserName( "internet explorer" ); 
                 capabilities2.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true ); 
                 capabilities2.setCapability(InternetExplorerDriver.IGNORE_ZOOM_SETTING, true ); 
                 capabilities2.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true ); 
                 "ignoreProtectedModeSettings" capabilities2.setCapability( "ignoreProtectedModeSettings" , true ); 
                 "nativeEvents" capabilities2.setCapability( "nativeEvents" , false ); 
                 capabilities2.setCapability(InternetExplorerDriver.INITIAL_BROWSER_URL, "" ); 
                 capabilities2.setCapability(InternetExplorerDriver.LOG_LEVEL, "DEBUG" );                          
                 capabilities2.setPlatform(Platform.WINDOWS);             
                 driver = new RemoteWebDriver( new URL(nodeURL),capabilities2);             
                 driver.get( " https://www.apple.com/ " ); 
                 driver.manage().window().maximize(); 
                 driver.manage().timeouts().implicitlyWait( 10 , TimeUnit.SECONDS); 
             } 
         }     
         @Test 
         public void appleSite() throws InterruptedException 
         { 
             try 
             {         
             driver.findElement(By.xpath( "//*[@id=\'ac-globalnav\']/div/ul[2]/li[3]" )).click(); 
             Thread.sleep( 2000 );  
             driver.findElement(By.cssSelector( "#chapternav > div > ul > li.chapternav-item.chapternav-item-ipad-air > a > figure" )).click(); 
             Thread.sleep( 2000 );  
             driver.findElement(By.linkText( "Why iPad" )).click(); 
             Thread.sleep( 2000 ); 
             }         
             catch (Exception e) 
             { 
                 System.out.println(e.getMessage()); 
             } 
         }      
         @AfterMethod () 
         public void tearDown() 
         { 
                 driver.quit(); 
                 System.out.println( "Browser Closed" ); 
         }  } 

    上面是用XML文件配置的Java类文件,该XML文件包括在Java文件中传递的参数值,并且还有助于创建一组可以并行运行的不同类。

     <?xml version= "1.0" encoding= "UTF-8" ?>  <!DOCTYPE suite SYSTEM " http://testng.org/testng-1.0.dtd " >  <suite thread-count= "3" name= "BlogSuite" parallel= "tests" >   <test name= "Chrome Test" >  <parameter name= "Port" value= "4546" /> 
         <classes> 
           < class name= "DemoAutomation.Selenium_MultiBrowser_Test" />       
         </classes> 
       </test>   
       <test name= "Firefox Test" >  <parameter name= "Port" value= "5566" /> 
         <classes> 
           < class name= "DemoAutomation.Selenium_MultiBrowser_Test" />       
         </classes> 
       </test>     
       <test name= "Internet Explorer Test" >  <parameter name= "Port" value= "4547" /> 
         <classes> 
           < class name= "DemoAutomation.Selenium_MultiBrowser_Test" />       
         </classes> 
       </test>     
       </suite> 

    输出画面:

    在上面的代码中,我使用了DesiredCapabilities类,该类将帮助您设置Selenium WebDriver的属性。 这些属性可用于配置要在其上运行脚本的浏览器实例,例如Br​​owserName和BrowserVersion。

    注意:但是,该脚本只能在测试计算机上当前安装的浏览器和浏览器版本上运行。 假设,如果您尝试在Chrome 72上运行测试,而测试计算机上仅安装了Chrome 74,则脚本将显示错误。 当您选择与测试计算机的操作系统相比不同的操作系统时,会发生相同的情况。

    此外,每次启动新的OS时,在新的Mac和Windows环境中进行投资都是相当昂贵的。

    因此,如果您希望在不同的浏览器,浏览器版本和操作系统上执行自动跨浏览器测试,那么我建议您寻找一种可在云上提供Selenium Grid设置的工具,例如LambdaTest。

    在LambdaTest Selenium Grid Cloud上运行自动化测试

    让我们尝试在LambdaTest Selenium Grid上运行相同的测试用例。 您可以使用LambdaTest 所需功能生成器来配置所需功能对象。 手动完成后,这将节省您在Selenium Grid设置中花费的大量时间。

    使用LambdaTest,您只需要创建一个远程服务器,在脚本中添加LambdaTest用户名,访问密钥和Grid URL,就可以了。

    下面是TestNG框架中的Java代码,在这种情况下会更有利:

     package lambdatest;  import java.net.MalformedURLException;  import java.net.URL;   import org.openqa.selenium.By;  import org.openqa.selenium.JavascriptExecutor;  import org.openqa.selenium.remote.DesiredCapabilities;  import org.openqa.selenium.remote.RemoteWebDriver;  import org.testng.annotations.AfterTest;  import org.testng.annotations.BeforeTest;  import org.testng.annotations.Test;    public class SampleTest { 
        public String username = "enteryourusernamehere" ; 
       public String accesskey = "enteryourkeyhere" ; 
       public RemoteWebDriver driver = null ; 
       public String gridURL = "@hub.lambdatest.com/wd/hub" ; 
       boolean status = false ;  
       @BeforeTest 
       @org .testng.annotations.Parameters(value={ "browser" , "version" , "platform" }) 
       public void setUp(String browser, String version, String platform) throws Exception { 
          DesiredCapabilities capabilities = new DesiredCapabilities(); 
           "browserName" capabilities.setCapability( "browserName" , browser); 
           capabilities.setCapability( "version" , version); 
           capabilities.setCapability( "platform" , platform); // If this cap isn't specified, it will just get the any available one 
           capabilities.setCapability( "build" , "Selenium Grid" ); 
           capabilities.setCapability( "name" , "Sample Test" ); 
           capabilities.setCapability( "network" , true ); // To enable network logs 
           capabilities.setCapability( "visual" , true ); // To enable step by step screenshot 
           capabilities.setCapability( "video" , true ); // To enable video recording 
           capabilities.setCapability( "console" , true ); // To capture console logs 
           try { 
               driver = new RemoteWebDriver( new URL( " https:// " + username + ":" + accesskey + gridURL), capabilities); 
           } catch (MalformedURLException e) { 
               System.out.println( "Invalid grid URL" ); 
           } catch (Exception e) { 
               System.out.println(e.getMessage()); 
           } 
       }  
       @Test 
       public void testSimple() throws Exception { 
          try {             
                 driver.get( " https://www.apple.com/ " ); 
                 driver.manage().window().maximize();             
                 driver.findElement(By.xpath( "//*[@id=\'ac-globalnav\']/div/ul[2]/li[3]" )).click(); 
                 Thread.sleep( 2000 );  
                 driver.findElement( 
                 By.cssSelector( "#chapternav > div > ul > li.chapternav-item.chapternav-item-ipad-air > a" )).click(); 
                 Thread.sleep( 2000 );  
                 driver.findElement(By.linkText( "Why iPad" )).click(); 
                 Thread.sleep( 2000 );           
           } catch (Exception e) { 
               System.out.println(e.getMessage()); 
           } 
       }    
       @AfterTest 
       public void tearDown() throws Exception { 
          if (driver != null ) { 
               ((JavascriptExecutor) driver).executeScript( "lambda-status=" + status); 
               driver.quit(); 
           } 
       }  } 

    现在,我们将使用包含Java文件中传递的参数值的XML文件运行该Java类文件,并帮助创建一组不同的类,使用这些类,我们可以使用Selenium Grid执行自动化测试以在以下位置并行执行不同的配置。

     <?xml version= "1.0" encoding= "UTF-8" ?>  <!DOCTYPE suite SYSTEM " http://testng.org/testng-1.0.dtd " >  <suite thread-count= "3" name= "BlogSuite" parallel= "tests" >  
       <test name= "FirefoxTest" > 
       <parameter name= "browser" value= "firefox" /> 
       <parameter name= "version" value= "62.0" /> 
       <parameter name= "platform" value= "WIN8" /> 
         <classes> 
           < class name= "lambdatest.SampleTest" /> 
         </classes> 
       </test>  
       <test name= "ChromeTest" > 
       <parameter name= "browser" value= "chrome" /> 
       <parameter name= "version" value= "70.0" /> 
       <parameter name= "platform" value= "WIN10" /> 
         <classes> 
           < class name= "lambdatest.SampleTest" /> 
         </classes> 
       </test>  
       <test name= "SafariTest" > 
       <parameter name= "browser" value= "safari" /> 
       <parameter name= "version" value= "11.0" /> 
       <parameter name= "platform" value= "macos High Sierra" /> 
         <classes> 
           < class name= "lambdatest.SampleTest" /> 
         </classes> 
       </test>   </suite> 

    输出画面:

    现在,我们已经成功地使用Selenium Grid执行了自动化测试,可以在不同的浏览器以及不同的操作系统上并行执行,而无需创建集线器并在不同端口上启动节点。 当测试在Selenium Grid上运行时,您可以看到测试的实时视频流以及各种其他详细信息,例如命令,其中包括脚本传递的每个命令的屏幕截图,以及引发的日志和异常。

    您还可以创建自己的团队,并以团队形式运行自动跨浏览器兼容性测试脚本。 这些测试结果对于团队中添加的每个成员都是可见的。 此外,通过我们的单击集成,您的队友可以将在跨浏览器测试期间发现的任何错误直接记录到Jira,Trello,Asana,Mantis,GitHub等各种项目管理平台上。此外,LambdaTest还与CI / CD集成与您的自动化测试工具(例如CircleCI,Jenkins,TravisCI等)互补的平台。请查看所有LambdaTest集成

    结论

    如果手动完成,Selenium Grid设置可能会很困难。 如果Selenium Grid的主要目的是并行运行测试并在不同的配置上进行测试,则可以在LambdaTest上执行相同的测试,而无需花费时间和资源来创建Selenium Grid Hub和Selenium Grid节点。 因此,请通过在此在线Grid上运行自动化测试来尝试一下,并在注释框中告知我们有关使用LambdaTest的反馈的信息。 测试愉快!

    在LambdaTest担任自动化专家,最近开始了专业之旅。 Java测试自动化中的Excel。

    翻译自: https://www.javacodegeeks.com/2019/07/setup-selenium-grid-parallel-execution-different-browsers.html

    selenium并行

    展开全文
  • 力求提供一个过滤大量蒸汽数据可扩展解决方案,本研究探索了利用现代通用方法可行性在图形处理器(GPGPU)上进行计算。 基于CKDB树方法已扩展为可操作在CPU(主机)和GPU(设备)上都可以。 GPGPU辅助方法在...
  • AWS对于大规模计算方案是很受欢迎,如科学计算,模拟和研究项目。这些方案包括从科研设备... 通过多客户端的并行处理,就可以把数据上传到S3, 每个客户端采用多线程技术实现并行上传或上传多部分以便进一步并行处理。

    AWS对于大规模计算方案是很受欢迎的,如科学计算,模拟和研究项目。这些方案包括从科研设备,测量设备,或其他计算作业的大量数据集的采集。采集后,使用大规模计算作业的分析来生成最终数据集。通常,这些结果将提供给更多的受众。



    1.  为了将大数据集上传到AWS,关键是拥有最多的可用带宽。 通过多客户端的并行处理,就可以把数据上传到S3, 每个客户端采用多线程技术实现并行上传或上传多部分以便进一步并行处理。像窗口调整和确认选择等TCP设置是可以调整的,以便进一步增强吞吐量。 通过适当的优化,一天上传几TB是可能的。另一种上传大数据集的方法是Amazon Import/Export功能, 这一功能支持将存储设备发送给AWS同时直接插入到Amazon S3 或者 Amazon EBS。

     

    2.  大规模作业的并行处理是关键,现存的并行处理应用能够运行在多个EC2 实例上. 如果应用程序需要一个POSIX风格的文件系统,那么无论是直接使用HTTP或使用FUSE层(例如,S3FS或SubCloud),并行应用程序对所有节点都可以从S3高效地读取和写入数据。

     

    3.  一旦计算完成,结果数据也被存储到S3, EC2 实例可以被关闭,并且将结果数据集就可被下载了,或者通过授予读取权限来指定用户,指定所有人或使用有限时间的URL,完成输出数据与他人的共享。

     

    4.  如果不用 S3, 也可以使用 Amazon EBS保存输入数据,作为临时存储区,或者获得输出结果。 在上传期间,要同样采用并行流上传和TCP调整的技术。另外,还可以使用UDP使上传加速。结果数据集可以被写入EBS卷,时间快照可采取共享卷的方式。


    展开全文
  • Delphi xe7并行编程快速入门

    千次阅读 2014-11-20 16:19:34
    现在多数设备、计算机都有多个CPU单元,即使是手机也是多核。但要在开发中使用多核优势,却需要一些技巧,...并行编程库在System.Threading单元中,其中提供了很多有用特性,可方便应用在已有项目和新项目中
  • Hydra提供了HEP数据分析中常用的容器和算法的集合,这些容器和算法可以透明地部署支持OpenMP,CUDA和TBB的设备,从而使用户可以在各种可用的多核CPU和加速器中重复使用相同的代码。 框架设计侧重于性能和精度。 ...
  • 针对分子对接中生成评分网格需要花费很多的计算时间这一问题, 提出...实验结果表明, 借助于GPU浮点计算能力, 提出的并行算法对比传统的计算方法可以显著缩短评分网格生成时间, 为评分网格生成提供一种新方式。
  • 到目前为止,Selenium是最... 您可以在所有功能测试中获得广泛浏览器覆盖,从而确保为广大潜在用户提供完美体验。 但是,这是一个挑战。 您只能在本地计算机上加载这么多不同浏览器。 例如,如果您有一台Win...
  • selenium Selenium是迄今为止最常用Web自动化... 您可以在所有功能测试中获得广泛浏览器覆盖,从而确保为广大潜在用户提供完美体验。 但是,这是一个挑战。 您只能在本地计算机上加载这么多不同浏览器。 例...
  • 该项目目标是提供一个框架,开发人员可以使用该框架来创建跨多个设备同时运行统一应用程序。 这不是像 qt 这样跨平台框架,而是类似于混合消息传递/共享内存并行编程系统东西。 该框架旨在让开发人员能够...
  • 第一个输出设备(除了闪烁LED之外)是一个 ,它通过点位串行通信连接到VIA 6522并行端口之一。 它目前仅运行我在该项目src/目录中编写6502汇编代码。 自2014年4月起,它可以在VIA并行端口上对SPI进行位驱动...
  • 两个极端:以移动电话和平板电脑到个人移动设备PMD 为客户端,以提供云计算仓库级计算机为服务器 另一条主线:数据级并行DLP(许多数据项允许同时操作),任务级并行TLP(可以独立运行并很多程度上并行) ...
  • SB是一种灵活高速接口技术,可以替代计算机中原来串行口和并行口,但灵活性高也意味着更加复杂,使得USB设计调试以及设计完成后验证都比较困难。本文首先对USB规范做一简要介绍,然后详细讨论USB产品在调试与...
  • 原帖地址 现在多数设备、计算机都有多个CPU单元,即使是手机也是多核。但要在开发中使用多核优势,却需要一些技巧,花费时间编写...并行编程库在System.Threading单元中,其中提供了很多有用特性,可方便...
  • parallac.js 基于为Node.js编写的分布式计算库。 TL; DR:Parallac.js创建一组原语,以允许在Node.js服务器群集上进行数据和任务并行处理。...无服务器计算的另一种观点 微服务的另一种看法 计算(使用数据和
  • 对专业人员而言:是分布式处理、并行处理和网格计算的发展,或者说是这些计算机科学概念的商业实现。是指基于互联网的超级计算模式–即把原本存储于个人电脑、移动设备等个人设备上的大量信息集中在一起,在强大的...
  • 摘 要 并口制作A/D转换接口电路,利用VC++提供的现成函数,可以直接控制和读写标准并口,具有无需打开机箱、开发成本低廉,制作方便等特点。 关键词 计算机并口; 模数转换; VC++ 前言 计算机与外围设备的连接,...
  • GPU计算与CUDA编程

    2021-03-14 13:26:13
    提供了GPU编程的简易接口,基于CUDA编程可以构建基于GPU计算的应用程序。 2.CUDA 在技术上是一种异构计算环境,也就是说它利用了同时在 CPU 和 GPU 上的协调计算。CUDA 架构由主机(host)和设备(device)组成;...
  • 可以在一台设备并行运行CCU2和其他软件选项 使用原始CCU2或CCU3固件(而非OCCU) 尽可能与原始CCU2兼容 在所有受支持平台上提供完整Homematic和Homematic IP支持(如果RF硬件支持话) 支持在piVCCU和...
  • 设备管理 博主本科生复习的时候整理的一些操作系统的系列...操作系统的设备管理模块负责控制这些设备使用,同时屏蔽它们的差异,为上层应用提供方便统一的服务接口 。 尽量使得外围设备都并行工作。 设备控制器:...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 232
精华内容 92
关键字:

可以提供并行计算的设备