Задать вопрос

Как использовать тип double при вычислениях на GPU?

Я провожу математические вычисления на GPU. Для этого мною написан следующий код:
Правильно работающий код с типом float под спойлером
using System;
using Cudafy;
using Cudafy.Host;
using Cudafy.Translator;

namespace CUDAfy_example
{
    class Program
    {
        static void Main()
        {
            // Создание GPGPU объекта.
            var gpu = CudafyHost.GetDevice(eGPUType.OpenCL);
            CudafyTranslator.Language = eLanguage.OpenCL;
            var module = CudafyTranslator.Cudafy();
            gpu.LoadModule(module);

            int N = 20;

            float[,] a = new float[N, 1];
            float[,] b = new float[N, 1];
            float[,] c = new float[N, 1];

            // Выделение памяти на GPU.
            float[,] dev_c = gpu.Allocate<float>(c);

            // Заполнение массивов на CPU.
            for (int i = 0; i < N; i++)
            {
                a[i, 0] = -i + (float)0.5;
                b[i, 0] = i * i;
            }

            // Копирование массивов 'a' и 'b' из CPU (хоста) на GPU.
            float[,] dev_a = gpu.CopyToDevice(a);
            float[,] dev_b = gpu.CopyToDevice(b);
            gpu.Launch(N, 1).Calculation(dev_a, dev_b, dev_c, N);

            // Копирование массива 'c' обратно с GPU на CPU.
            gpu.CopyFromDevice(dev_c, c);

            // Отображение результатов.
            for (int i = 0; i < N; i++)
                Console.WriteLine("{0} + {1} = {2}", a[i, 0], b[i, 0], c[i, 0]);
            Console.ReadLine();

            // Освобождение памяти выделенной ранее на GPU.
            gpu.FreeAll();
        }

        [Cudafy]
        public static void Calculation(GThread thread, float[,] a, float[,] b, float[,] c, int N)
        {
            int tid = thread.blockIdx.x;

            int period = 10;
            if (tid < N)
            {
                float sum = 0;
                for (int j = tid; j < tid + period; j++)
                    sum += a[j, 0];

                c[tid, 0] = a[tid, 0] + b[tid, 0] + sum;
            }      
        }
    }   
}


Вышеприведённый код (под спойлером) работает хорошо. Но в этом коде у переменных и массивов используется тип float. Мне же необходимо использовать тип double.
Когда я переписал вышеприведённый код, заменив все типы float на double
Код с типом double под спойлером (не выполняется из-за ошибки)
using System;
using Cudafy;
using Cudafy.Host;
using Cudafy.Translator;

namespace CUDAfy_example
{
    class Program
    {
        static void Main()
        {
            // Создание GPGPU объекта.
            var gpu = CudafyHost.GetDevice(eGPUType.OpenCL);
            CudafyTranslator.Language = eLanguage.OpenCL;
            var module = CudafyTranslator.Cudafy();
            gpu.LoadModule(module);

            int N = 20;

            double[,] a = new double[N, 1];
            double[,] b = new double[N, 1];
            double[,] c = new double[N, 1];

            // Выделение памяти на GPU.
            double[,] dev_c = gpu.Allocate<double>(c);

            // Заполнение массивов на CPU.
            for (int i = 0; i < N; i++)
            {
                a[i, 0] = -i + (double)0.5;
                b[i, 0] = i * i;
            }

            // Копирование массивов 'a' и 'b' из CPU (хоста) на GPU.
            double[,] dev_a = gpu.CopyToDevice(a);
            double[,] dev_b = gpu.CopyToDevice(b);
            gpu.Launch(N, 1).Calculation(dev_a, dev_b, dev_c, N);

            // Копирование массива 'c' обратно с GPU на CPU.
            gpu.CopyFromDevice(dev_c, c);

            // Отображение результатов.
            for (int i = 0; i < N; i++)
                Console.WriteLine("{0} + {1} = {2}", a[i, 0], b[i, 0], c[i, 0]);
            Console.ReadLine();

            // Освобождение памяти выделенной ранее на GPU.
            gpu.FreeAll();
        }

        [Cudafy]
        public static void Calculation(GThread thread, double[,] a, double[,] b, double[,] c, int N)
        {
            int tid = thread.blockIdx.x;

            int period = 10;
            if (tid < N)
            {
                double sum = 0;
                for (int j = tid; j < tid + period; j++)
                    sum += a[j, 0];

                c[tid, 0] = a[tid, 0] + b[tid, 0] + sum;
            }      
        }
    }   
}

то компилятор стал выдавать ошибку на строке gpu.LoadModule(module);.

Как в коде заменить тип float на тип double, чтобы программа заработала без ошибок?

P.S. Моя видеокарта поддерживает OpenCL 1.2.
Модель видеокарты ASUS Radeon HD5570.
P.P.S. Я новичок в этом деле.
  • Вопрос задан
  • 979 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
@ERAFY Автор вопроса
Комментировать
@Yupa20171123
Возможно надо это дело включить. Чтото вроде #pragma OPENCL EXTENSION cl_khr_...
cl_khr_fp64 --- Double precision floating-point
смотри [https://www.khronos.org/registry/OpenCL/sdk/1.0/do...

Я еще до этого не дошел... :)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы