CUFFT в 1000 раз медленнее в VS2013 / Cuda7.0 по сравнению с VS2010 / Cuda4.2

Этот простой код CUFFT был запущен на двух IDE —

  1. VS 2013 с Cuda 7.0
  2. VS 2010 с Cuda 4.2

Я обнаружил, что VS 2013 с Cuda 7.0 был 1000 раз медленнее примерно. Код, выполненный в 0.6 ms в VS 2010 и взял 520 ms на VS 2013, как в среднем.

#include "stdafx.h"#include "cuda.h"#include "cuda_runtime_api.h"#include "cufft.h"typedef cuComplex Complex;
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start);
const int SIZE = 10000;
Complex *h_col = (Complex*)malloc(SIZE*sizeof(Complex));
for (int i = 0; i < SIZE; i++)
{
h_col[i].x = i;
h_col[i].y = i;
}
Complex *d_col;
cudaMalloc((void**)&d_col, SIZE*sizeof(Complex));
cudaMemcpy(d_col, h_col, SIZE*sizeof(Complex), cudaMemcpyHostToDevice);

cufftHandle plan;
const int BATCH = 1;
cufftPlan1d(&plan, SIZE, CUFFT_C2C, BATCH);
cufftExecC2C(plan, d_col, d_col, CUFFT_FORWARD);

cudaMemcpy(h_col, d_col, SIZE*sizeof(Complex), cudaMemcpyDeviceToHost);

cudaEventRecord(stop);
cudaEventSynchronize(stop);
float milliseconds = 0;
cudaEventElapsedTime(&milliseconds, start, stop);
cufftDestroy(plan);
cout << milliseconds;

return 0;
}

Код запускался на том же компьютере, с той же ОС, той же графической картой и сразу один за другим. Конфигурация в обоих случаях была x64 Release. Вы можете выбрать, компилировать ли файл с использованием компилятора C ++ или CUDA C / C ++. Я попробовал оба варианта в обоих проектах, и это не имело никакого значения.

Есть идеи, чтобы это исправить?

FWIW, я получаю те же результаты с Cuda 6.5 на VS 2013, что и Cuda 7

1

Решение

Библиотека cufft значительно увеличилась с 4,2 до 7,0, что приводит к значительному увеличению времени инициализации. Если вы уберете это время инициализации как фактор, я думаю, вы обнаружите, что разница во времени выполнения будет намного меньше 1000-кратной.

Вот модифицированный код, демонстрирующий это:

$ cat t807.cu
#include <cufft.h>
#include <cuComplex.h>
typedef cuComplex Complex;
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start);
const int SIZE = 10000;
Complex *h_col = (Complex*)malloc(SIZE*sizeof(Complex));
for (int i = 0; i < SIZE; i++)
{
h_col[i].x = i;
h_col[i].y = i;
}
Complex *d_col;
cudaMalloc((void**)&d_col, SIZE*sizeof(Complex));
cudaMemcpy(d_col, h_col, SIZE*sizeof(Complex), cudaMemcpyHostToDevice);

cufftHandle plan;
const int BATCH = 1;
cufftPlan1d(&plan, SIZE, CUFFT_C2C, BATCH);
cufftExecC2C(plan, d_col, d_col, CUFFT_FORWARD);

cudaMemcpy(h_col, d_col, SIZE*sizeof(Complex), cudaMemcpyDeviceToHost);

cudaEventRecord(stop);
cudaEventSynchronize(stop);
float milliseconds = 0;
cudaEventElapsedTime(&milliseconds, start, stop);
cufftDestroy(plan);
cout << milliseconds << endl;

cudaEventRecord(start);
for (int i = 0; i < SIZE; i++)
{
h_col[i].x = i;
h_col[i].y = i;
}
cudaMemcpy(d_col, h_col, SIZE*sizeof(Complex), cudaMemcpyHostToDevice);

cufftPlan1d(&plan, SIZE, CUFFT_C2C, BATCH);
cufftExecC2C(plan, d_col, d_col, CUFFT_FORWARD);

cudaMemcpy(h_col, d_col, SIZE*sizeof(Complex), cudaMemcpyDeviceToHost);

cudaEventRecord(stop);
cudaEventSynchronize(stop);
milliseconds = 0;
cudaEventElapsedTime(&milliseconds, start, stop);
cufftDestroy(plan);
cout << milliseconds << endl;

return 0;
}
$ nvcc -o t807 t807.cu -lcufft
$ ./t807
94.8298
1.44778
$

Второе число, представленное выше, представляет по существу тот же код с удаленной инициализацией cufft (так как это было сделано при первом проходе).

6

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector