OpenCL实现

OpenCL实现,opencl,nvidia,amd,Opencl,Nvidia,Amd,我正在寻找OpenCL的实现。 我知道,OpenCL实现是硬件厂商特有的,所以英伟达OpenCL的实现可能与AMD不同。但我想知道,我是否需要实现我自己的窦的速度原因。 接受这一点,sin和native\u sin之间的区别在哪里?这里是一个amd实现,在自身上测试重复的sin函数,因此任何错误都会随着迭代次数的增加而变得更加混乱(本例中为100): 如果输入介于-1和+1之间,则不需要第一行,这样速度会更快 native_sin()可能正在使用其基于硬件的选项来加速。这些选项可以是神奇数字的查

我正在寻找OpenCL的实现。 我知道,OpenCL实现是硬件厂商特有的,所以英伟达OpenCL的实现可能与AMD不同。但我想知道,我是否需要实现我自己的窦的速度原因。
接受这一点,
sin
native\u sin
之间的区别在哪里?

这里是一个amd实现,在自身上测试重复的sin函数,因此任何错误都会随着迭代次数的增加而变得更加混乱(本例中为100):

如果输入介于-1和+1之间,则不需要第一行,这样速度会更快


native_sin()可能正在使用其基于硬件的选项来加速。这些选项可以是神奇数字的查找表和牛顿-拉斐逊引擎。您不可能通过软件模拟来超过这些部件的性能,以获得相同的错误。上面的例子是在一个gpu上,使用cpu有细微的区别。即使opencl规定所有设备的ULP误差必须小于100,一个设备可能有90 ULP,但其他70ULP和累积误差会增加它们之间的差距。如果您认为错误不会累积太多,并且您有安全数字,那么您可以使用本机,否则,您可以添加类似于级数展开的算法,以便所有设备的计算方式相同,但错误更多。

谢谢!你能为C#的实现增加时间吗?
__kernel void sin_test_0(__global  float *a)
{
    int id = get_global_id(0);
    float r=a[id];
    for(int i=0;i<100;i++)
        r = sin(r);
    a[id]=r;
}
float sin_se(float x)
{ 
        x -= 6.28318530718f*(convert_int(x*0.15915494309f));
        float xs=x*x;
        float xc=x*x*x;
        return ((x - xc*0.166666f) + (xc*xs)*0.0083333f)- (xc*xs*xs)*0.0001984f;
}