Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/35.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
在CUDA中使用sincos()的最佳方法_Cuda_Trigonometry - Fatal编程技术网

在CUDA中使用sincos()的最佳方法

在CUDA中使用sincos()的最佳方法,cuda,trigonometry,Cuda,Trigonometry,我不清楚实现sincos()的最佳方法是什么。我到处都查过,但似乎大家的共识是,这比单独计算正反两方面要好。下面是我内核中使用sincos的基本内容。然而,当我把它和单独做罪恶和罪恶区分开来的时候,结果就慢了。我认为这与我如何使用我的cPtr和sPtr有关。有更好的办法吗 int idx = blockIdx.x * blockDim.x + threadIdx.x; if (idx < dataSize) { idx += lower; double f = ((dou

我不清楚实现sincos()的最佳方法是什么。我到处都查过,但似乎大家的共识是,这比单独计算正反两方面要好。下面是我内核中使用sincos的基本内容。然而,当我把它和单独做罪恶和罪恶区分开来的时候,结果就慢了。我认为这与我如何使用我的cPtr和sPtr有关。有更好的办法吗

int idx = blockIdx.x * blockDim.x + threadIdx.x;

if (idx < dataSize)
{
    idx += lower;
    double f = ((double) idx) * deltaF;
    double cosValue;
    double sinValue;
    double *sPtr = &sinValue;
    double *cPtr = &cosValue;
    sincos(twopit * f, sPtr, cPtr);

    d_re[idx - lower] = cosValue;
    d_im[idx - lower] = - sinValue;

    //d_re[idx - lower] = cos(twopit * f);
    //d_im[idx - lower] = - sin(twopit * f);
}
intidx=blockIdx.x*blockDim.x+threadIdx.x;
if(idx
指针是多余的-您可以去掉它们,例如

double cosValue;
double sinValue;
sincos(twopit * f, &sinValue, &cosValue);
但我不确定这会对性能有多大影响(不过值得一试)


也考虑使用浮点而不是精度要求允许的两倍,并使用相应的单精度函数(<代码> SnCOSF 在这种情况下)。

< P>指针是多余的-您可以去掉它们,例如

double cosValue;
double sinValue;
sincos(twopit * f, &sinValue, &cosValue);
但我不确定这会对性能有多大影响(不过值得一试)


也考虑使用浮点而不是精度要求允许的两倍,并使用相应的单精度函数(<代码> SnCOSF 在这种情况下)。

最后,我用CUDA 4.2检查C2050,SCONCOSH()可以以大约1.3x的速度产生分离的SN()和Co()调用的速率。这是从内存中得到的,我目前没有在CUDA启用的机器前进行双重检查。您使用的是什么GPU?两种型号的实际测量时间是多少?代码似乎只是用正弦和余弦值填充(长?)数组?如果是这样,您的代码可能会受到内存带宽的限制,并且可能不受您计算这些触发器函数的速率的限制。您是否检查了
sincos()
内核与使用
sin()
cos()
的替代内核的寄存器底纹?这可能是一个占用问题改变了内核的性能。谢谢Talonmes,你说得对。如果变量twopit包含因子π,您可能还想尝试sinpi()、cospi()和sincospi()[最后一个在CUDA 5.0中可用]。由于简化了参数缩减,这些函数的寄存器底纹比常规trig函数低。例如,如果变量twopit=2*π*t,sin(twopit*f)将变成sinpi(twot*f),其中twot=2*t,并检查实际速度提升。请注意,我上一次使用CUDA 4.2在C2050上检查时发现,sincos()可以以大约1.3倍于sin()和cos()单独调用的速率生成函数值。这是从内存中得到的,我目前没有在CUDA启用的机器前进行双重检查。您使用的是什么GPU?两种型号的实际测量时间是多少?代码似乎只是用正弦和余弦值填充(长?)数组?如果是这样,您的代码可能会受到内存带宽的限制,并且可能不受您计算这些触发器函数的速率的限制。您是否检查了
sincos()
内核与使用
sin()
cos()
的替代内核的寄存器底纹?这可能是一个占用问题改变了内核的性能。谢谢Talonmes,你说得对。如果变量twopit包含因子π,您可能还想尝试sinpi()、cospi()和sincospi()[最后一个在CUDA 5.0中可用]。由于简化了参数缩减,这些函数的寄存器底纹比常规trig函数低。例如,如果变量twopit=2*π*t,sin(twopit*f)将变成sinpi(twot*f),其中twot=2*t,并检查实际速度提升。当心