С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

CUDA: сложение массивов большого размера - CUDA

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Рисование линии http://www.cyberforum.ru/cpp-beginners/thread689688.html
Цитирую дословно из Петцольда: LineTo(hdc, xEnd, yEnd); Эта функция рисует отрезок до точки (xEnd, yEnd), не включая ее в отрезок. Для последующих вызовов LineTo текущее положение пера...
C++ Динамический масив: записать в масив все делители числа n Нужно записать в масив все делители числа n програма запускается но видает ошибку доступа к памяти... помогите разобраться #include <iostream> #include <conio.h> #include <alloc.h> void... http://www.cyberforum.ru/cpp-beginners/thread689685.html
C++ В матрице найти столбец, в котором разность между максимальным элементом и среднем арифметическим больше первого элемента
В матрице имеется столбец в котором разность между максимальным элементом и среднем арифметическим больше первого элемента наити этот столбец и заметить этот элемент на 1.вывести новую матрицу. ...
Для данной журнальной ведомости определить процент успеваемости C++
Здравствуйте, помогите пожалуйста решить задачу: В журнале группы ежедневно на каждом занятии против фамилии делаются следующие пометки: 0 - отсутствие без уважительной причины, 1 - отсутствие по...
C++ цикл for http://www.cyberforum.ru/cpp-beginners/thread689662.html
что мне делать, если first price и last_price типа int, а stride типа float и у меня из-за этого зацикливается программа.. for (int i=first_price; i<=last_price; i=i+stride){ Добавлено через 6...
C++ ЖНФ матрицы - алгоритм поиска Всем привет. Интересует алгоритм поиска ЖНФ (Жорданова нормальная форма) матрицы. Я так понимаю в начале все пока сводится к поиску собственных значений. Если они не равны между собой и не кратны... подробнее

Показать сообщение отдельно
Cdvig
9 / 9 / 0
Регистрация: 08.10.2009
Сообщений: 173

CUDA: сложение массивов большого размера - CUDA

06.11.2012, 12:32. Просмотров 1749. Ответов 0
Метки (Все метки)

Доброго времени, есть необходимость написать программу с использованием CUDA для сложения массивов размером около 450000000 элементов.
написал тест
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
__global__ void addKernel(int *c, int *a, int *b)
{
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    c[i] = a[i] + b[i];
}
 
int main()
{
    const int arraySize = 4;
    int a[arraySize];
    int b[arraySize];
    int c[arraySize];
    int *dev_a = NULL;
    int *dev_b = NULL;
    int *dev_c = NULL;
    for (int i = 0, j = arraySize; i < arraySize, j > 0; i++, j--)
    {
        a[i] = i;
        b[j] = j;
    }
    printf("%d, %d, %d\n", a[0], a[1], a[2]);
    printf("%d, %d, %d\n", b[0], b[1], b[2]);
    cudaMalloc((void**)&dev_c, arraySize * sizeof(int));
    cudaMalloc((void**)&dev_a, arraySize * sizeof(int));
    cudaMalloc((void**)&dev_b, arraySize * sizeof(int));
    cudaMemcpy(dev_a, a, arraySize * sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(dev_b, b, arraySize * sizeof(int), cudaMemcpyHostToDevice);
    addKernel<<<1, arraySize>>>(dev_c, dev_a, dev_b);
    cudaMemcpy(c, dev_c, arraySize * sizeof(int), cudaMemcpyDeviceToHost);
    printf("%d, %d, %d\n", c[0], c[1], c[2]);
    cudaFree(dev_c);
    cudaFree(dev_a);
    cudaFree(dev_b);
    system("pause");
    return 0;
}
но почему то не высчитывает правильно. И есть ли советы или реальные примеры по складыванию массивов большого объема.

Добавлено через 11 минут
C++
1
2
a[i] = i;
b[i] = j;
так правильнее

Добавлено через 5 минут
причем максимальный размер массива 1024, а мне надо гораздо побольше.

Добавлено через 3 часа 47 минут
Изменил код, уже лучше, но все равно мало помещается.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    const int arraySize = 11721 * 11721;// = 137381841
                                           //450000000  
    int *a = (int *)malloc(sizeof(int)*arraySize);
    int *b = (int *)malloc(sizeof(int)*arraySize);
    int *c = (int *)malloc(sizeof(int)*arraySize);
    
    int *dev_a = NULL;
    int *dev_b = NULL;
    int *dev_c = NULL;
    for (int i = 0, j = arraySize; i < arraySize, j > 0; i++, j--)
    {
            a[i] = i;
            b[i] = j;
    }
    
    printf("%d, %d, %d\n", a[0], a[arraySize / 2], a[arraySize - 1]);
    printf("%d, %d, %d\n", b[0], b[1], b[2]);
    cudaMalloc((void**)&dev_c, arraySize * sizeof(int));
    cudaMalloc((void**)&dev_a, arraySize * sizeof(int));
    cudaMalloc((void**)&dev_b, arraySize * sizeof(int));
    cudaMemcpy(dev_a, a, arraySize * sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(dev_b, b, arraySize * sizeof(int), cudaMemcpyHostToDevice);
    addKernel<<<128, 128>>>(dev_c, dev_a, dev_b, arraySize);
    cudaMemcpy(c, dev_c, arraySize * sizeof(int), cudaMemcpyDeviceToHost);
    printf("%d, %d, %d\n", c[0], c[1], c[2]);
    cudaFree(dev_c);
    cudaFree(dev_a);
    cudaFree(dev_b);
    system("pause");
    return 0;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.