2012-11-28 4 views
0

C로 프로그램을 만들고 CUDA로 변경하려고합니다.Cuda의 알고리즘

그래프에 대한 번호가있는 프로그램 출력 파일. 내가 출력하는 프로그램을 파일 만 계산을 얻을 수 CUDA와

는 알고리즘 run_state<<< 1, N>>>(d_oldv, d_newv, d_w, d_t); 그렇게해야 출력 256 개 값도 #define N 256;

__device__ void nextState(int i, darray oldv, darray newv, darray w, int t){ 

double dv; 

    dv = -8*oldv[i]*(oldv[i]-0.1)*(oldv[i]-1) - oldv[i]*w[i]; 

/* Stimulate in leftmost region */ 
    if ((t >=10) && (t<=15) && (i < 4)) 
    dv += 2; 

/* diffusion */ 
    newv[i] = oldv[i] + 0.1 *dv + 
      0.1 *1.0*(oldv[i-1]-2*oldv[i]+oldv[i+1])/(1.0*1.0); 

    w[i] = w[i] + 0.1 *eps(oldv[i],w[i]) 
         *(-w[i]-8*oldv[i]*(oldv[i]-0.1-1)); 

} 

__device__ double eps(double u, double v) 
{ 
    return (0.002 + (0.2*v)/(u+0.3)); 
} 

__global__ void run_state(darray* oldv, darray* newv, darray* w, int* t) 
{ 
int i = threadIdx.x; 

nextState(i, *oldv, *newv, *w, *t); 

} 

여기 코드를

를 수행하지 않은 . 그것은 그렇습니다. 그러나 모두 0.000에 있습니다 ...

그래서 나는이 함수들 중 하나에서 실수를 저 지르면 방황하고 있습니다. 사전

+0

당신이 당신의 CUDA 통화 모두에 오류 검사를하고 있습니까? (cudaMalloc, cudaMemcpy, 커널 호출 등) 데이터가 GPU에 제대로 표시되지 않거나 GPU가 생각하는 코드를 실행하지 않을 수도 있습니다. –

+0

@ 로버트 내가 쓴 기능에 문제가 있다면 방황하고, 그렇지 않다면 당신이 말한 것과 관련이 있다고 생각할 것입니다. – Tom

+0

커널에 "포인터 포인터"인수를 전달해야하는 이유를 이해할 수 없습니까? 이것은 d_oldv, d_newv 및 d_w를 의미합니다. 장치에서 호스트 포인터를 참조 할 수는 없습니다 –

답변

1

에서

덕분에 당신은 당신의 기능이 같은 기능은 또한 다음 테스트 할 수 있습니다 로컬 디버깅을 호스트에 사용할 수 있도록 __host__ 지시어를 사용하려고 제대로 작동하는지 확인하려는 경우. 호스트에서 작동하고 장치에서 작동하지 않는 경우 정보를 호스트에서 장치로 복사 할 때 문제가 발생할 수 있습니다.

은 다음과 같이 함수를 선언 :

__host__ __device__ void nextState(int i, darray oldv, darray newv, darray w, int t)