2012-07-20 3 views
0

sincos()를 구현하는 가장 좋은 방법은 무엇인지 명확하지 않습니다. 나는 모든 곳을 들여다 보았으나, 죄와 cos의 분리 된 계산을하는 것보다 더 나은 것으로 합의 된 것으로 보인다. 아래는 본질적으로 sincos를 사용하기 위해 커널에있는 것입니다. 그러나, 나는 단지 죄를 짓는 것에 반대하여 시계를 떼어 낼 때마다 천천히 나온다. 내 cPtr 및 sPtr을 어떻게 사용하고 있는지와 관련이 있다고 생각합니다. 더 좋은 방법이 있습니까?CUDA에서 sincos()를 사용하여 접근하는 가장 좋은 방법

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); 
} 
+0

마지막으로 CUDA 4.2에서 C2050을 확인한 결과, sincos()는 별도의 sin() 및 cos() 호출 속도의 약 1.3x에서 함수 값을 생성 할 수있었습니다. 이것은 메모리에서 나 왔으며 지금은 CUDA가 가능한 머신 앞에 두 번 확인하지 않습니다. 어떤 GPU를 사용하고 두 변종에 대해 측정 한 실제 시간은 얼마입니까? 그것은 코드가 단순히 사인 및 코사인 값으로 (긴?) 배열을 채우는 것? 그렇다면 코드가 메모리 대역폭에 묶여있을 수 있으며 이러한 trig 함수를 평가할 수있는 속도에 제한을받지 않을 수 있습니다. – njuffa

+2

'sin()'과'cos()'를 사용하여'sincos()'커널의 레지스터 풋 프린트를 확인한 적이 있습니까? 그것은 커널의 성능을 변화시키는 점유 문제 일 수 있습니다. – talonmies

+0

감사합니다. 나는 그것을 고쳐야하고 그것이해야하는 것처럼 성능을 향상시킨다. – harmonickey

답변

3

포인터가 중복되어 있습니다.

double cosValue; 
double sinValue; 
sincos(twopit * f, &sinValue, &cosValue); 

그러나 성능에 많은 영향을 미칠지는 잘 모르겠지만 (시도해 볼 가치가 있음).

정밀도 요구 사항이 허용되는 경우 float 대신 double을 사용하고 해당 단 정밀도 함수 (이 경우 sincosf)를 사용하는 것도 고려하십시오.

관련 문제