Страницы

Поиск по вопросам

понедельник, 23 декабря 2019 г.

Суммирование всех элементов с помощью GPU

#cpp #cuda


Здравствуйте! Не давно познакомился с CUDA, пишу маленькую программу для сравнения
скорости на GPU и CPU. Ядро должно суммировать все элементы, но суммирует только последний
элемент. В чем проблема? Может синхронизация нужна?

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

using namespace std;
__global__ void add(int *matr, int N, int *sum)
{
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    //if (idx> > (matr_d, N, sum_d);

    cudaMemcpy(sum_h, sum_d, sizeof(int), cudaMemcpyDeviceToHost);
    cout << "sum: " << sum_h[0] << endl;

    free(matr_h);
    cudaFree(matr_d);
    system("pause");
}

    


Ответы

Ответ 1



Проблема в том, что у вас код if (idx

Ответ 2



@Владимир Мартьянов прав. Во первых, для решения задачи внешними источниками, нужны версии CUDA, SM, COMPUTE.Есть простой до безобразия способ. Создайте символ __shared__, и атомарно аккумулируйте значение. Потом просто с хоста мапте значение MapToSymbol. Но тогда бессмысленно параллелить вычисления.Второй способ, более сложный и требует понимания архитектуры CUDA. Смысл описан здесь: CUDA :: Memory Fence Functions.

Комментариев нет:

Отправить комментарий