2012-08-23 2 views
1

이 짧은 cuda 코드에서 세그먼트 오류의 소스를 가져올 수 없습니다. 정렬 용 STL 라이브러리 대 Thrust 라이브러리의 정렬 속도를 테스트하는 데 사용하고 있습니다. 복소수 배열의 크기를 명령 줄 인수로 정렬하도록 전달하고 있습니다.작은 코드로 seg 오류 찾기

여기 코드

inline void check_cuda_error(char *message) 

    { 
     cudaThreadSynchronize(); 
     cudaError_t error = cudaGetLastError(); 
     if(error != cudaSuccess) 
     { 
     printf("CUDA error after %s: %s\n", message, cudaGetErrorString(error)); 
     } 
    } 



      int main(int argc, char *argv[]) 
     { 
      int N = atoi(argv[1]); 
      double* h = new double[N]; 
      for (int i = 0; i < N; ++i) 
      { 
       h[i] = (double)rand()/RAND_MAX; //std::cout << h[i] << " " ; 
      } 

      clock_t start , stop; 

      std::cout << std::endl; 

      // Start timing 
      start = clock(); 
      std::sort(h, h+N); 
      stop = clock(); 
      std::cout << "Host sorting took " << (stop - start) /(double)CLOCKS_PER_SEC << std::endl ; 


      // Start the GPU work. Initialize to random numbers again. 
      for (int i = 0; i < N; ++i) 
      { 
       h[i] = (double)rand()/RAND_MAX; //std::cout << h[i] << " " ; 
      } 
      double* d = 0; 
      const size_t num_bytes = N * sizeof(double); 
      cudaMalloc((void**)&d, num_bytes); 
      check_cuda_error("Memory Allocation"); 

      cudaMemcpy(d ,h , N * sizeof(double), cudaMemcpyHostToDevice); // Transfer data 
      thrust::sort(d, d+ N) ; 
      return 0; 
     } 

나는 다음과 같은 오류

[BeamerLatex/Farber]$ nvcc -arch=sm_20 sortcompare.cu ; ./a.out 16777216 

Host sorting took 3.77 
[1] 4661 segmentation fault ./a.out 16777216 
[BeamerLatex/Farber]$ 
+0

관련이 없지만 'h'를 (를) 삭제하지 않았습니다 ... –

+0

포함 항목을 추가 할 수 있습니까? 나는 그들 모두를 google에 cba, 그리고 그것은 코드의 실행 버전을 가지고 도움이 될 것입니다 – sji

+0

그냥 추측하지만, cudaMalloc의 반환 값을 확인하시기 바랍니다 수 있습니다. cudaErrorMemoryAllocation 인 경우 대상이 여전히 0이기 때문에 cudaMemcpy 호출이 실패 할 가능성이 높습니다. 일반적으로 segfault로 연결됩니다. –

답변

2

당신이 원시 포인터에 추력 :: 종류를 실행할 수 없습니다 것 같다 얻을, 당신은 device_ptr 처음에 캐스팅 할 필요가 예 :

thrust::device_ptr<double> dv = thrust::device_pointer_cast(d); 
thrust::sort(dv, dv+ NN) ; 

이 광고는 정상적으로 작동합니다.

+0

아 감사합니다! 그것에 대해 잊어 버렸습니다. – smilingbuddha