Cuda cuComplex.h на девайсе не считает экспоненту

Необходимо посчитать экспоненту от комплексного числа (615 + 0i). Выяснилось, что функция считает complex_exp(88), но не считает от 89 и выше. Если функцию вызвать с хоста, то все считает. Почему не считает на устройстве?

  1. #include <cuComplex.h>
  2. #include "cuda_runtime.h"
  3. #include "device_launch_parameters.h"
  4. #include <iostream>
  5. #define SIZE 1
  6. using namespace std;
  7. __device__ __host__ cuDoubleComplex complex_exp(cuDoubleComplex z)
  8. {
  9.         cuDoubleComplex res;
  10.         double y = cuCimag(z);
  11.         double x = exp(cuCreal(z));
  12.         res = make_cuDoubleComplex(x*cos(y), x*sin(y));
  13.         return res;
  14. }
  15.  
  16. __global__ void func(cuDoubleComplex* left, cuDoubleComplex* result)
  17. {
  18.   // Получаем id текущей нити.
  19.   int idx = threadIdx.x;
  20.   // Расчитываем результат.
  21.   result[idx] = complex_exp (left[idx]);
  22. }
  23. void main()
  24. {
  25. //Выделяем память под вектора
  26.   cuDoubleComplex* vec1 = new cuDoubleComplex[SIZE];
  27.   cuDoubleComplex* vec3 = new cuDoubleComplex[SIZE];
  28.   //Инициализируем значения векторов
  29.   for (int i = 0; i < SIZE; i++)
  30.   {
  31.     vec1[i] = make_cuDoubleComplex(89,0);
  32.   }
  33.   //Указатели на память видеокарте
  34.   cuDoubleComplex* devVec1;
  35.   cuDoubleComplex* devVec3;
  36.   //Выделяем память для векторов на видеокарте
  37.   cudaMalloc((void**)&devVec1, sizeof(cuDoubleComplex) * SIZE);
  38.   cudaMalloc((void**)&devVec3, sizeof(cuDoubleComplex) * SIZE);
  39.   //Копируем данные в память видеокарты
  40.   cudaMemcpy(devVec1, vec1, sizeof(cuDoubleComplex) * SIZE, cudaMemcpyHostToDevice);
  41.   func<<<1, SIZE>>>(devVec1, devVec3);
  42.   cudaEvent_t syncEvent;
  43.   cudaEventCreate(&syncEvent);    //Создаем event
  44.   cudaEventRecord(syncEvent, 0);  //Записываем event
  45.   cudaEventSynchronize(syncEvent);  //Синхронизируем event
  46.   //Только теперь получаем результат расчета
  47.   cudaMemcpy(vec3, devVec3, sizeof(cuDoubleComplex) * SIZE, cudaMemcpyDeviceToHost);
  48.   for (int i = 0; i < SIZE; i++)
  49.   {
  50.         cout<<cuCreal(vec3[i])<<","<<cuCimag(vec3[i])<<endl;
  51.   }
  52.   cuDoubleComplex z = make_cuDoubleComplex(89,0);
  53.   z = complex_exp(z);
  54.   cout<<cuCreal(z)<<","<<cuCimag(z)<<endl;
  55.   // Высвобождаем ресурсы
  56.   cudaEventDestroy(syncEvent);
  57.   cudaFree(devVec1);
  58.   cudaFree(devVec3);
  59.   delete[] vec1; vec1 = 0;
  60.   delete[] vec3; vec3 = 0;
  61.         system("pause");
  62. }
  63. <code>
  64.  

Forums: