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