С Новым годом! Форум программистов, компьютерный форум, киберфорум
CUDA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 6
1

Двумерный массив

23.05.2023, 10:38. Показов 1379. Ответов 6
Метки cuda (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, подскажите пожалуйста, почему при малом количестве блоков и нитей, например 100 на 100. начиная с d[10000] и заканчивая d[10999] идут 5, до этого и после данные правильные, а затем идут опят 5.
Можно ли исправить программу, чтобы она работала при малых количествах блоков и нитей.

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
 
#define N 1000
 
__global__ void matrixAdd1(int* d, int width)
{
    int row = blockIdx.y * blockDim.y + threadIdx.y;
    int col = blockIdx.x * blockDim.x + threadIdx.x;
    while ((row * width + col)<N*N) {
        d[row * width + col] = row * width + col;
        row += blockDim.y * gridDim.y;
        col += blockDim.x * gridDim.x;
    }
}
 
int main() {
    FILE * tidxy;
    tidxy = fopen("tidxy.txt", "w");
     int *dev_d;
    int size = N * N * sizeof(int);
 
    // Выделение памяти для одномерных массивов на хосте (CPU)
 
 
    int* d = new int[N*N];
    d = (int*)malloc(size);
    // Заполнение матриц a и b случайными значениями
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
            d[i * N + j] = 5;
    }
 
    // Выделение памяти на устройстве (GPU)
    cudaMalloc((void**)&dev_d, size);
    // Копирование данных из хоста (CPU) в память устройства (GPU)
    cudaMemcpy(dev_d, d, size, cudaMemcpyHostToDevice);
   matrixAdd1 << <100, 100 >> > (dev_d, N);
    // Копирование результата из памяти устройства (GPU) на хост (CPU)
    cudaMemcpy(d, dev_d, size, cudaMemcpyDeviceToHost);
    // Вывод результата
    fprintf(tidxy, "Matrix c : \n");
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            fprintf(tidxy,"%d ", d[i * N + j]);
        }
        fprintf(tidxy,"\n");
    }
    // Освобождение памяти на устрой    стве(GPU)
    cudaFree(dev_d);
    // Освобождение памяти на хосте (CPU)
    free(d);
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.05.2023, 10:38
Ответы с готовыми решениями:

OpenCL Cloo Как передать двумерный массив?
Как передать дувумернный массив в kernel? и как получить индекс каждого элемента, получить вроде...

Двумерный массив. Ввести двумерный массив, найти сумму элементов каждого столбца
Ввести двумерный массив, найти сумму элементов каждого столбца.

Двумерный массив. Заполнить и вывести двумерный массив БЕЗ использования цикла FOR
Заполнить ивывести двумерный массив БЕЗ использования цикла FOR очень срочно!!!

Можно ли заменить двумерный массив на массив массивов и наоборот - массив массивов на двумерный массив?
._.

Создать двумерный массив, опираясь на другой двумерный массив
У меня есть такой массив 0 0 0 0 0 0 0 6 3 2 2 8 9 3 7 6 8 3 4 5 1 0 ...

6
Asm/C++/Delphi/Py/PHP/VBA
6751 / 1997 / 231
Регистрация: 14.12.2014
Сообщений: 4,200
Записей в блоге: 12
23.05.2023, 22:07 2
пвп, почему у вас тут используются поля y, когда массивы блоков и потоков одномерные?
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 6
23.05.2023, 22:15  [ТС] 3
Скорее всего я что-то не учел. Я сейчас хочу научиться работать с двумерными массивами. И эту задачу взял, чтобы разобраться в этой теме.
0
Asm/C++/Delphi/Py/PHP/VBA
6751 / 1997 / 231
Регистрация: 14.12.2014
Сообщений: 4,200
Записей в блоге: 12
25.05.2023, 19:54 4
Если у вас 100 блоков и 100 потоков для обработки массива 100x100, значит берите col = threadIdx.x, row = blockIdx.x.
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 6
25.05.2023, 20:10  [ТС] 5
А если массив будет большего размера?
0
Asm/C++/Delphi/Py/PHP/VBA
6751 / 1997 / 231
Регистрация: 14.12.2014
Сообщений: 4,200
Записей в блоге: 12
25.05.2023, 21:03 6
Тогда блоков и потоков будет больше. Если размер будет больше 1024 (обычно кол-во потоков 1024), то можно разбить на части. Например, у вас 2000*2000. Делаем двумерный блок { 2000, 2 } и 1000 потоков. Номер блока X – ряд. Номер потока + номер блока Y * 1000 = столбец. Как-то так.
1
70 / 14 / 3
Регистрация: 10.07.2018
Сообщений: 284
02.07.2023, 18:16 7
В коде отсутствует закрытие файла при помощи функции fclose(tidxy) перед завершением программы. Это может привести к непредсказуемому поведению программы при работе с файлом. Не забывайте закрывать открытые файлы после их использования.

Также обратите внимание на использование двух методов выделения памяти на хосте для массива d. Это избыточно и может привести к ошибкам. Вместо этого можно использовать только один метод выделения памяти, например, malloc().

И еще одна замечание касается использование блоков и потоков в GPU. При выборе количества блоков и потоков важно учитывать ограничения, накладываемые на GPU. Например, максимальное количество потоков на блок может быть ограничено и может различаться в зависимости от используемой видеокарты. Поэтому, выбирая количество блоков и потоков, необходимо учитывать технические характеристики используемой GPU.
0
02.07.2023, 18:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2023, 18:16
Помогаю со студенческими работами здесь

Считать из текстового файла двумерный массив и записать его двумерный динамический
Есть текстовый файл(см.Рисунок) и его надо загрузить в динамический массив(почему...

Сделайте, чтобы двумерный вектор обогнал двумерный массив при заполнении случайными числами
Всем привет! Попробовал сравнить время заполнения векторов в векторе и массивов в массиве...

Как двумерный лист преобразовать в двумерный массив
Добрый день господа. Перелазил весь интернет, очень мало информации по двумерным Листам. Как...

Дан двумерный массив A N*N). Сформировать двумерный упорядоченныймассив (А 11<=A 12<= .<=A 23<=.<=A nn)
Дан двумерный массив A(N*N). Сформировать двумерный упорядоченный массив (А11&lt;=A12&lt;=...

Как можно вложить двумерный массив в двумерный?
Нужно написать программу перемножения двух матриц размерностью МxМ, элементы которых, матрицы...

Двумерный массив преобразовать в двумерный List<T>
имеется матрица Single matr; Не важно как и откуда я ее заполняю, но на выходе выходит матрица из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru