CUDA. Почему при вычислениях на GPU скорость операций с float и double примерно одинакова?

Я проводил исследование эффективности использования GPU и CPU, float и double для решения больших и сверхбольших разреженных СЛАУ и столкнулся с расхождением ожидаемых и полученных результатов.

Предполагалось, что GPU должно проводить вычисления с float значительно быстрее чем с double, но на практике разница в скорости незаметна. Реализация программы производилась с использованием CUDA.

Я написал простенький тест, но и он показывал одинаковое время вычислений.

#include "iostream"
extern "C++" {
   #include <cublas_v2.h>
};
//****COMMENT FOR USE DOUBLE****
#define USE_FLOAT

#ifdef USE_FLOAT
typedef float value_type;
#define CUDA_DOT cublasSdot_v2
#else
typedef double value_type;
#define CUDA_DOT cublasDdot_v2
#endif

void test(){
    cublasHandle_t cublasHandle = nullptr;
    checkStatus(cublasCreate(&cublasHandle));
    cublasSetPointerMode(cublasHandle, CUBLAS_POINTER_MODE_DEVICE);
    value_type *tmp;
    cudaMalloc(&tmp, sizeof(value_type));
    time_point start;
    time_point stop;
    for (__int64 i = 2; i < INT64_MAX; i = i * 2) {
        unsigned long long dur = 0;
        value_type *ttt = new value_type[i];
        for(int j = 0; j < i; j++){
            ttt[j] = 0.0001;
        }
        value_type *a;
        value_type *b;
        checkStatus(cudaMalloc(&a, i*sizeof(value_type)));
        checkStatus(cudaMalloc(&b, i*sizeof(value_type)));
        checkStatus(cudaMemcpy(a, ttt, i*sizeof(value_type), cudaMemcpyHostToDevice));
        checkStatus(cudaMemcpy(b, ttt, i*sizeof(value_type), cudaMemcpyHostToDevice));

        delete[] ttt;

        for (int j = 0; j < 1000; j++){
            start = clock_type::now();
            CUDA_DOT(cublasHandle, i, a, 1, b,1, tmp);
            stop = clock_type::now();
            dur += getDuration(start, stop);
        }
        checkStatus(cudaFree(a));
        checkStatus(cudaFree(b));
        dur /= 1000;

        std::cout << dur << std::endl;
    }
    cudaFree(tmp);
    cublasDestroy(cublasHandle);
}

int main() {
    test();
    return 0;
}

Видеокарта на которой происходят вычисления: характеристики GPU

Может кто-нибудь объяснить в чем дело, и почему float не работает быстрее double? Был бы очень благодарен =)


Результаты полученные мной с помощью этого теста. Время указано в наносекундах результаты теста


Ответы (0 шт):