Добрый день. Начал изучать 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 );
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Изучаю озвученную тему - хочу разобраться, как просматривать/переименовывать/удалять папкиНа данный момент нарыл:
ЗдравствуйтеВозникла проблема при работе с Winsock - в частности, не могу выставить время таймаута коннекта
Почему в данном коде последний элемент массива который передан функции inArray( [1,2,3,4,5] ) не добавляется в массив result ? Но если в конец массива...
У меня есть по сути два компонента с одной и той же логикой в методе componentWillReseiveProps и в некоторых методах еще Как мне применить наследование...