Сортировка массива

Здравствуйте! Посмотрите, пожалуйста, в чем ошибка.
Вот функции Insert и ShellCPU:

  1. float* Insert( float* a,int N)   //простыми вставками
  2. {
  3.         int x,j;
  4.         for (int i=1; i<N;i++)
  5.         {
  6.                
  7.                 x=a[i];
  8.                 j=i-1;
  9.                 while ((x<a[j]) && (j>=0))
  10.                 {
  11.                 a[j+1]=a[j];
  12.                   j=j-1;
  13.                  
  14.                 }
  15.                 a[j+1]=x;
  16.         }
  17.         return(a);
  18.        
  19. }
  20.  
  21.  
  22. float ShellCPU(float* list, int N)  //сортировка Шелла
  23. {
  24. float x=log ((float) (N));     
  25. int passes =x/log(2.0) ;
  26. while (passes >= 1)
  27. {
  28.          int increment = passes*passes-1;
  29.         for ( int start = 1; start<=  increment;start++)
  30.         {
  31.         Insert(list, N);
  32.         }
  33.         passes = passes - 1;
  34. }
  35. return 1;
  36. }

Когда просто их вызываешь, они сортируют массив.
А вот в этой программе они зануляют массив:

  1. int main(int argc, char* argv[])
  2. {
  3.         char c;
  4.         if(!InitCUDA())  {return 0;}
  5.         int N; printf("Enter size of array:\n"); scanf("%d",&N);
  6.        
  7.         float *A = new float[N];        float *B = new float[N];
  8.         generateArray(A,N);  // генерируем случайным образом
  9.     printArray(A,N);     // выводим на экран результат
  10.        
  11.         char    *device_result  = 0;
  12.         char    host_result[12] ={0};
  13.         unsigned int timer1 = 0, timer2 = 0, timer3 =0;
  14.         CUT_SAFE_CALL( cutCreateTimer(&timer1));
  15.         CUT_SAFE_CALL( cutCreateTimer(&timer2));
  16.         CUT_SAFE_CALL( cutCreateTimer(&timer3));
  17.        
  18.         float *cM = NULL;
  19.         // количество байтов на GPU с которым будем работать
  20.         int numBytes = N*sizeof(float);
  21.         // Выделяем память под массив на GPU
  22.         cudaMalloc((float**)&cM, numBytes);
  23.         // копируем туда наш массив A
  24.         cudaMemcpy(cM, A, numBytes, cudaMemcpyHostToDevice);
  25.     CUT_SAFE_CALL(cutStartTimer(timer3));
  26.         // вызываем в многопоточном режиме
  27.         //for(int UmenRow = 0;UmenRow<N-1; UmenRow++)
  28.           // ShellGPU<<<1,N>>>(cM, N,UmenRow);
  29.        
  30.         CUT_SAFE_CALL(cutStopTimer(timer3));
  31.         printf("\n");
  32.         printf("Processing time on GPU: %f (ms)  ", cutGetTimerValue(timer3));
  33.         CUT_CHECK_ERROR("Kernel execution failed\n");
  34.         cudaMemcpy(B, cM, numBytes, cudaMemcpyDeviceToHost);
  35.         printArray(B,N);
  36.         printf("\n");
  37.  
  38. //-------------------------------------
  39.         CUT_SAFE_CALL(cutStartTimer(timer2));
  40.        
  41.         ShellCPU(A,N);
  42.        
  43.         CUT_SAFE_CALL(cutStopTimer(timer2));
  44.         printf("\n");
  45.         printf("Processing time on CPU: %f (ms)  ", cutGetTimerValue(timer2));
  46.         printArray(A,N);
  47.         printf("\n");
  48.         scanf("%",&c);
  49.         CUT_SAFE_CALL(cutDeleteTimer( timer3));
  50.         CUT_SAFE_CALL(cutDeleteTimer( timer2));
  51.     CUT_SAFE_CALL(cutDeleteTimer( timer1));
  52.         CUDA_SAFE_CALL(cudaFree(device_result));
  53.  
  54.         printf("%s\n", host_result);
  55.         CUT_EXIT(argc, argv);
  56.         return 0;
  57. }

Как это исправить?

AttachmentSize
Image icon Безымянный.png23.16 KB

Forums: