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;
}
Видеокарта на которой происходят вычисления:

Может кто-нибудь объяснить в чем дело, и почему float не работает быстрее double? Был бы очень благодарен =)
Результаты полученные мной с помощью этого теста. Время указано в наносекундах
