Список вопросов
Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
901
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6088
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Ограничения на размер grid в Nvidia CUDA при двухмерной сетке?
Просмотров: 336
 
Ответов: 1
Всем привет. Возможно, мой вопрос покажется многим на первый взгляд очевидным, но я бы всё-таки призвал вас не считать его идиотским до тех пор, пока не прочтёте до конца.
Итак, в чём же суть вопроса. Как известно из документации CUDA, размер сетки запускаемого ядра имеет ограничения, которые зависят от конкретного устройства. В большинстве современных видеокарт ограничение равно 65535x65535x1. На моих видеокартах g210m и 8800gt это именно так, я проверял. Но в этом месте я встретил довольно странную вещь — в моей программе по какой-то неизвестной мне причине невозможно запустить ядро, которое бы имело размерность (по нитям) больше 5808x5808 (это число может быть меньше в зависимости от размера блока, я написал строгий максимум) или же больше 264х264 (если измерять в блоках) — и последнее число неизменно. Как только количество запускаемых блоков переваливает за 265х265, ядро запускается, отрабатывает, но в качестве результата всегда выдаёт ноль.
Дебаггер от Nvidia Nsight молчит, никаких ошибок не выбрасывается, профайлер выдаёт результаты работы, в которых ядро запускается. Ограничение всплывает на всех видеокартах, на которых я запускал программу — в сумме на 8 разных моделях (8400m g, 8800gt, 9600gso, 8500gt, 9600gt, ION, g210m, gf9300)
Так вот всё это наводит меня на мысль, что есть ограничения не только на размерность сетки, но и на суммарное количество нитей в сетке (ведь на количество нитей в блоке ограничение есть — почему бы и тут ему не быть). Только вот ни официальная документация, ни учебник Борескова/Харлмова, ни best practices guide ничего не этот счёт не говорят — просто говорят, что есть ограничения, уже озвученные в самом начале вопроса.
Поскольку копаюсь я с этим примерно по часа два в день на протяжении уже недели, и никакого прогресса нет, я прошу помощи — куда копать? Любые замечания приветствуются, если нужно сделать какие-то уточнения — скажите
Только что проверил. Мне не удалось повторить вашу проблему.
У меня GTX470.
Итак. Написал ядро:
__global__ void testKernel( int* g_odata)
{
if(threadIdx.x==0)
{
g_odata[2*(blockIdx.y*gridDim.x+blockIdx.x)] = blockIdx.y;
g_odata[2*(blockIdx.y*gridDim.x+blockIdx.x)+1] = blockIdx.x;
}
}
Запустил его на 8192х8192 блоков и 1024 треда(в ваших видяхах максимум 512 тредов в блоке, на ферми 1024):
dim3 grid( 8192, 8192, 1);
dim3 threads( 1024, 1, 1);
testKernel<<< grid, threads, 0 >>>( d_odata);
Естественно выделил память и т.п.
И получил последним элементом массива: 8191x8191.
На больших числах не тестировал, потому что память кончается :( Надо уже какую-то логику реализовывать.
А вообще не понятно откуда у вас эти не круглые значения 265, 264?
__global__ void testKernel( int* g_odata)
{
if(threadIdx.x==0)
{
g_odata[2*(blockIdx.y*gridDim.x+blockIdx.x)] = blockIdx.y;
g_odata[2*(blockIdx.y*gridDim.x+blockIdx.x)+1] = blockIdx.x;
}
}
dim3 grid( 8192, 8192, 1);
dim3 threads( 1024, 1, 1);
testKernel<<< grid, threads, 0 >>>( d_odata);
Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться