Скалярное произведение на CUDA c++

215
14 апреля 2018, 20:29

Добрый день. Начал изучать CUDA и уже несколько дней пытаюсь сделать скалярное произведение, именно с константной памятью Без const памяти все норм работает. А с ней считает неправильно. Выводит большое отрицательное число.

Помогите пожалуйста разобраться, что не так?

Спасибо

    #include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include "iostream"
#include <curand.h>
#include <curand_kernel.h>
// 0 -1 -8 -27 -64 -125 -216 - 343
#define N 8 //количество элементов массива
constant int a[N], b[N];
global void ad( int *c ) 
{
 int tid = threadIdx.x; //вычисление индекса элемента 
 if(tid > N-1) return; //проверка на выход за пределы массива
 //поэлементное сложение массивов 
 atomicAdd(c,  a[tid] * b[tid]);
}
int main()
{ 
 //выделение памяти под массивы на CPU 
 int host_c[1]; //выделение памяти под массивы для копирования на GPU 
 int dev_c[1];
 //заполнение массивов
 for (int i=0; i<N; i++)
 {
  a[i] = i * i;
  b[i] =  -i;
 }
 //Выделение памяти под массивы на GPU 
 //cudaMalloc( (void**)&dev_a, N * sizeof(int) );
 //cudaMalloc( (void**)&dev_b, N * sizeof(int) );
 cudaMalloc( (void**)&dev_c, sizeof(int) );
 //Копирование данных в память GPU
 //cudaMemcpy( dev_a, a, N * sizeof(int), cudaMemcpyHostToDevice ) ;
 //cudaMemcpy( dev_b, b, N * sizeof(int), cudaMemcpyHostToDevice ) ;
 //Вызов ядра
 ad<<<8, 1>>>( dev_c );
 //Получаем результат расчета
 host_c[0] = dev_c[0];
 //cudaMemcpy( host_c, dev_c, sizeof(int), cudaMemcpyDeviceToHost ) ;

 //Вывод результатов
 printf( "X = (  ");
 for (int i=0; i<N; i++)
 {
  if (i+1==N) std::cout << a[i];
  else std::cout << a[i] << ", ";
 }
 printf(")");
 printf( "\nY = (  ");
 for (int i=0; i<N; i++)
 {
  if (i+1==N) std::cout << b[i];
  else std::cout << b[i] << ", ";
 }
 printf(")");
 std::cout<<std::endl;
 std::cout << "X * Y = " << host_c[0] << std::endl;
 //Освобождение памяти 
 cudaFree( dev_c );
}

READ ALSO
C++ работа с файлами и папками

C++ работа с файлами и папками

Изучаю озвученную тему - хочу разобраться, как просматривать/переименовывать/удалять папкиНа данный момент нарыл:

178
Winsock timeout

Winsock timeout

ЗдравствуйтеВозникла проблема при работе с Winsock - в частности, не могу выставить время таймаута коннекта

182
Последний элемент массива в js

Последний элемент массива в js

Почему в данном коде последний элемент массива который передан функции inArray( [1,2,3,4,5] ) не добавляется в массив result ? Но если в конец массива...

161
Наследование в реакт?

Наследование в реакт?

У меня есть по сути два компонента с одной и той же логикой в методе componentWillReseiveProps и в некоторых методах еще Как мне применить наследование...

129