Как сравнить программы CUDA? - PullRequest
0 голосов
/ 03 ноября 2019

Я пытался сравнить мое первое приложение CUDA, которое добавляет два массива, сначала используя ЦП, а затем используя графический процессор.

Вот программа.

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include<iostream>
#include<chrono>

using namespace std;
using namespace std::chrono;

// add two arrays
void add(int n, float *x, float *y) {
    for (int i = 0; i < n; i++) {
        y[i] += x[i];
    }
}

__global__ void addParallel(int n, float *x, float *y) {

    int i = threadIdx.x;

    if (i < n)
        y[i] += x[i];
}

void printElapseTime(std::chrono::microseconds elapsed_time) {
    cout << "completed in " << elapsed_time.count() << " microseconds" << endl;
}

int main() {

    // generate two arrays of million float values each
    cout << "Generating two lists of a million float values ... ";

    int n = 1 << 28;

    float *x, *y;

    cudaMallocManaged(&x, sizeof(float)*n);
    cudaMallocManaged(&y, sizeof(float)*n);

    // begin benchmark array generation
    auto begin = high_resolution_clock::now();

    for (int i = 0; i < n; i++) {
        x[i] = 1.0f;
        y[i] = 2.0f;
    }

    // end benchmark array generation
    auto end = high_resolution_clock::now();

    auto elapsed_time = duration_cast<microseconds>(end - begin);

    printElapseTime(elapsed_time);

    // begin benchmark addition cpu
    begin = high_resolution_clock::now();

    cout << "Adding both arrays using CPU ... ";
    add(n, x, y);

    // end benchmark addition cpu
    end = high_resolution_clock::now();

    elapsed_time = duration_cast<microseconds>(end - begin);

    printElapseTime(elapsed_time);

    // begin benchmark addition gpu
    begin = high_resolution_clock::now();

    cout << "Adding both arrays using GPU ... ";
    addParallel << <1, 1024 >> > (n, x, y);

    cudaDeviceSynchronize();

    // end benchmark addition gpu
    end = high_resolution_clock::now();

    elapsed_time = duration_cast<microseconds>(end - begin);

    printElapseTime(elapsed_time);

    cudaFree(x);
    cudaFree(y);

    return 0;
}

Удивительно, ноПрограмма генерирует следующий вывод:

Generating two lists of a million float values ... completed in 13343211 microseconds
Adding both arrays using CPU ... completed in 543994 microseconds
Adding both arrays using GPU ... completed in 3030147 microseconds

Интересно, где именно я иду не так. Почему вычисления на GPU занимают в 6 раз больше времени, чем на CPU.

Для справки, я использую Windows 10 на Intel i7 8750H и Nvidia GTX 1060.

1 Ответ

0 голосов
/ 06 ноября 2019

Обратите внимание, что ваш объединенный массив памяти содержит 268 миллион операций с плавающей запятой, что означает, что вы передаете около 1 ГБ данных на устройство при вызове ядра. Используйте профилировщик графического процессора (nvprof, nvvp или nsight), и вы должны увидеть передачу HtoD, занимающую основную часть вашего вычислительного времени.

...