视觉特效 - 页 2

 
Rorschach:

https://www.mql5.com/ru/forum/227736

转移到着色器。前15秒,源代码在cpu上运行,然后gpu版本运行。

"你需要在编译前将Canvas.mqh文件中的数组m_pixels[]从protected:移到public:"

嗯,有意思。结果是同样的速度。可能是因为没有3D转换。

需要用这个代码 试试。


ZSY使用这种设计,所以你不必修复原始库

#define protected public
#include <Canvas\Canvas.mqh>
#undef protected

SZY

哦,不!对不起--在代码中犯了一个错误,因此没有注意到CPU部分根本就没有运行。纠正了它。
结果--通过GPU,速度提高了2.5倍。

非常高兴看到。非常感谢你的这种实施。只是稍微调整了一下。

附加的文件:
 
Rorschach:

https://www.mql5.com/ru/forum/227736

转移到着色器。前15秒在cpu上运行源代码,然后在gpu上运行版本。

用这段代码做同样的事情很有意思,看看性能增益是如何根据计算的复杂性(增加重力中心)而变化的。

这段代码没有使用正弦阵列来加速,它只是计算正弦。而且你还可以改变旋转的重力中心的数量。

附加的文件:
Swirl2.mq5  5 kb
 
Nikolai Semko:

需要用这个代码 试试。

我想完全在gpu上进行指标计算,我需要弄清楚如何传输这种数据量。

尼古拉-森科

其结果是通过GPU的速度提高了2.5倍。

尼古拉-森科

这段代码没有使用正弦阵列来加速,它只是简单地计算正弦

XRGB(uchar(128+127*sin(d*45)),uchar(128+127*sin(d*70)),uchar(128+127*sin(d*25)));

顺便说一下,我在我的着色器中使用了这个公式,所以速度提高了~10倍。

尼古拉-森科

用这段代码做同样的事情,看看性能增益是如何根据计算的复杂性(增加重力中心)而改变的,这很有意思。

我会努力做到这一点。

 
Rorschach:

我想完全在gpu上做指标计算,我需要弄清楚如何传输如此大量的数据。

顺便说一下,我在着色器中使用了这个公式,所以加速度是~10倍。

我会试着做一个。

我认为结果应该是鼓舞人心的。

是的,它确实是MQL5的一个非常酷的补充感谢MQ团队的努力。

通过简单地在程序中加入该资源,利用显卡资源,数学计算的 性能可以提高许多倍。这就卸载了CPU本身的负担。也就是说,市场的一个超级选择。

而如果OpenCL需要用户采取一些行动来安装软件,那么DirectX已经默认安装在Windows中了。而最令人惊奇的是--我看了一下使用DirectX时ex5文件增加了多少,完全没有看到文件的增加。非常酷!!!。让我们学习和使用它。

 
Nikolai Semko:

我认为结果应该是鼓舞人心的。

是的,它确实是MQL5的一个非常酷的补充感谢MQ团队的努力。

通过简单地在程序中加入该资源,利用显卡资源,数学计算的 性能可以提高许多倍。这就卸载了CPU本身的负担。也就是说,市场的一个超级选择。

而如果OpenCL需要用户采取一些行动来安装软件,那么DirectX已经默认安装在Windows中了。而最令人惊奇的是--我看了看使用DirectX时ex5文件增加了多少,完全没有看到文件的增加。非常酷!!!。让我们学习和使用它。

顺便说一句,是的,DX比OCL的功能更全面。同样的能力+3D。有一个CPU模式,你不需要为它在CPU上装一个驱动。

 
Rorschach:

顺便说一下,我在着色器中使用了这个公式,所以加速度是~10倍。

还是要数2.5次。CPU受到了优化的影响,但GPU却没有。

尼古拉-森科

用这段代码做同样的事情很有意思,看看性能增益如何根据计算的复杂性(重力中心的增加)而变化。

这段代码没有使用正弦阵列来加速,它只是计算正弦。而且你还可以改变旋转的重力中心的数量。

我启用了优化。该代码被重新安排为3个周期,以使其更容易转移。限制是512个中心。默认情况下,它直接在GPU上运行。

附加的文件:
pixel.zip  1 kb
 
Rorschach:

你还是要数2.5次。CPU受到了优化的影响,但GPU没有受到影响。

我启用了优化。我把代码重写为3个周期,以使其更容易移植。我已将其限制在512个中心。默认情况下,它直接在GPU上运行。

非常感谢您!
仅仅在简单的计算上,2.5倍也是一个非常好的结果。在3D方面,我认为结果会更加陡峭。

 
Rorschach:

你还是要数2.5次。CPU受到了优化的影响,但GPU没有受到影响。

我启用了优化。我把代码重新排列成3个循环,使之更容易移植。我们已将其限制在512个中心。默认情况下,它直接在GPU上运行。

你问的是OpenCl的实现。有东西出来了。请原谅我的代码,我没有时间去清理它。最主要的是,它是有效的。

__kernel void Func(int N, __global double *XP, __global double *YP, __global uchar *h, __global uint *buf)
{
   size_t X = get_global_id(0);
   size_t Width = get_global_size(0);
   size_t Y = get_global_id(1);
   
   float2 p;
   double D=0,S1=0,S2=0;
   
   for(int w=0;w<N;w++){ 
      p.x = XP[w]-X;
      p.y = YP[w]-Y;
      D = fast_length(p);
      S2+=D;
      if(w<N/2)
         S1+=D;
   }   
   //
   double d=S1/S2;
   buf[Y*Width+X] = upsample(upsample((uchar)0xFF,(uchar)h[(int)(d*11520)]),upsample((uchar)h[(int)(d*17920)],(uchar)h[(int)(d*6400)]));
}
附加的文件:
Swirl2_OCL.mq5  14 kb
test_002.zip  1 kb
 
Serhii Shevchuk:

你要求一个OpenCl的实现。我有办法了。原谅我的代码,我没有时间去刷它。最主要的是,它是有效的。

哇哦!哇!说实话,对我来说是意想不到的。在我这块普通的显卡上,增益超过10倍。
非常感谢您!

 
Serhii Shevchuk:

你要求一个OpenCl的实现。我有办法了。原谅我的代码,我没有时间去刷它。最主要的是,它是有效的。

非常感谢您!

你的计算结果是在双倍的吗?那么结果就会特别令人印象深刻。