Я не уверен, полностью ли я понимаю вашу проблему, но да, у вас может быть несколько активных одновременно работающих ядер.
Из Руководства по вычислениям CUDA v. 3.2 pg.38: http://developer.download.nvidia.com/compute/cuda/3_2/toolkit/docs/CUDA_C_Programming_Guide.pdf
Некоторые устройства с вычислительной способностью 2.x могут выполнять несколько ядер одновременно.Приложения могут запрашивать эту возможность, вызывая cudaGetDeviceProperties () и проверяя свойство concurrentKernels.
Мой вопрос к вам - почему вы хотите использовать несколько ядер?
Я думаю, что вам нужноперечитайте руководство CUDA (см. выше).Похоже, что вы хотите сделать, это одно ядро с несколькими блоками / потоками, каждый из которых имеет свой кусок общей памяти.Далее вам нужно выяснить, насколько большой элемент использовать для каждого блока.Помните, что вам нужны два «куска» памяти и продукт (3 квадратные 2D матрицы одинакового размера).Для этого сделайте запрос к устройству и получите вычислительную мощность и прочитайте приведенное выше руководство, чтобы определить итоговый объем разделяемой памяти.
Затем используйте код, подобный следующему:
if (ComputeCapability >= 2.0)
{
NumberOfSharedValues = (32768/GetSize(Dummy));
FullUseageThreadsPerBlock = 512;
MaxBlocksPerSM = 3;
}
else
{
//Tot. Shared mem / Size per var / Number of Arrays
NumberOfSharedValues = (16384/GetSize(Dummy)/3);
//CC1.2 && CC1.3
if (ComputeCapability >= 1.2)
{
FullUseageThreadsPerBlock = 512;
MaxBlocksPerSM = 2;
}
else //CC1.0 && CC1.1
{
FullUseageThreadsPerBlock = 256;
MaxBlocksPerSM = 3;
}
}
Где Dummy
имеет шаблонный тип, и я написал функции для возврата размеров общих шаблонных типов (например, int, float, double) в CUDA (например, в C и int обычно 16 бит, в CUDA его 32-битный).
Скопируйте массивы для умножения в глобальную память на устройстве.
Затем возьмите квадратный корень из вашей переменной NumberOfSharedValues
и напишите ядро, которое объявляет три массива в разделяемой памяти этой длины (два"чанки" и продукт).
Пусть ядро скопирует чанки для умножения в общую память, выполните умножение, а затем запишите полученный чанк "product" обратно в глобальную память.
Наконец, прочитайте глобальный массив продуктов обратно на хост.
Вуаля, я думаю, это должно помочь вам.
Помните, что вы будете назначать общий ресурс.Описанная выше память - это объем, доступный одному мультипроцессору (а поскольку каждый из ваших блоков выделяет столько памяти, то блоки = # мультипроцессоры), поэтому ваш общий размер элементов, которые вы можете обрабатывать одновременно, будет зависеть от того, сколькоу вас есть мультипроцессоры, опять же запрашиваемое количество.
Также помните, что вы можете использовать cuMemGetInfo
, чтобы получить объем свободной памяти, чтобы убедиться, что вы можете поместить свой массив who в глобальную память.
Повторное чтение руководства и просмотр @ примеров, опубликованных NVIDIA, имеют решающее значение для понимания иерархии памяти на устройстве и написания хороших ядер.
Надеюсь, это поможет !!