#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.
Комментариев нет:
Отправить комментарий