сколько процессоров я могу получить в блоке на cuda GPU? - PullRequest
1 голос
/ 23 мая 2010

Мне нужно задать три вопроса

  1. Если я создаю только один блок потоков в cuda и выполняю на нем параллельную программу, то возможно ли, чтобы более одного процессора было отдано одному блоку, чтобы моя программа получила некоторые преимущества многопроцессорной платформы? Чтобы быть более понятным, если я использую только один блок потоков, то сколько процессоров будет выделено для него, потому что, насколько я знаю (я, возможно, неправильно понял), одна деформация дается только один элемент обработки.
  2. можно ли синхронизировать потоки разных блоков? если да, пожалуйста, дайте несколько советов, чтобы сделать это.
  3. Как узнать размер основы? это исправлено для конкретного оборудования?

Ответы [ 5 ]

2 голосов
/ 26 мая 2010

1 возможно, что более одного процессора будет отдано одному блоку, так что моя программа получит некоторые преимущества многопроцессорной платформы

Простой ответ: Нет.

Модель программирования CUDA отображает один потокоблок на один мультипроцессор (SM);блок не может быть разделен на два или более мультипроцессора, и после запуска он не будет перемещаться с одного мультипроцессора на другой.

Как вы видели, CUDA предоставляет __syncthreads(), чтобы позволить потокам внутри блока синхронизироваться.Это очень дешевая операция, и это отчасти потому, что все потоки в блоке находятся в непосредственной близости (на одном SM).Если бы им было разрешено делиться, то это было бы невозможно.Кроме того, потоки внутри блока могут взаимодействовать путем совместного использования данных в общей памяти;общая память является локальной для SM, и, следовательно, разделение блока также может нарушить это.

2 Могу ли я синхронизировать потоки разных блоков?

Не совсем нет.Есть некоторые вещи, которые вы можете сделать, например, заставить последний блок сделать что-то особенное (см. Пример threadFenceReduction в SDK), но общая синхронизация на самом деле невозможна.Когда вы запускаете сетку, вы не можете контролировать планирование блоков на мультипроцессорах, поэтому любая попытка глобальной синхронизации может привести к тупику.

3 Как узнать размер деформации?это исправлено для конкретного оборудования?

Да, это исправлено.Фактически, для всех текущих устройств с поддержкой CUDA (как 1.x, так и 2.0) он установлен равным 32. Если вы полагаетесь на размер основы, вам следует обеспечить прямую совместимость, проверив размер основы.

В коде устройства вы можете просто использовать специальную переменную warpSize.В коде хоста вы можете запросить размер деформации для определенного устройства с помощью:

cudaError_t result;
int deviceID;
struct cudaDeviceProp prop;

result = cudaGetDevice(&deviceID);
if (result != cudaSuccess)
{
    ...
}
result = cudaGetDeviceProperties(&prop, deviceID);
if (result != cudaSuccess)
{
    ...
}

int warpSize = prop.warpSize;
0 голосов
/ 25 мая 2010

Для синхронизации потоков между несколькими блоками (по крайней мере, если речь идет об обновлениях памяти), вы можете использовать новый вызов __threadfence_system(), который доступен только на устройствах Fermi (Compute Capability 2.0 и выше).Эта функция описана в Руководстве по программированию CUDA для CUDA 3.0.

0 голосов
/ 24 мая 2010

# 3. Вы можете запросить SIMDWidth, используя cuDeviceGetProperties - см. Документ

0 голосов
/ 24 мая 2010

Могу ли я синхронизировать потоки другого блока следующим способом.Пожалуйста, скажите мне, если есть какие-либо проблемы в этом подходе (я думаю, что будут некоторые, но так как я не очень опытен в cuda, я, возможно, не учел некоторые факты)

</p>

__global__ void sync_func(int *glob_var){
int i = 0 ; //local variable to each thread
int total_threads = blockDim.x *threadDim.x
while(*glob_var != total_threads){
    if(i == 0){
      atomicAdd(int *glob_var, 1);
      i = 1;
    }
}

выполнить код, который должен бытьвыполняется одновременно всеми потоками;}

0 голосов
/ 23 мая 2010
  1. Начиная с 2.3 один процессор на блок потока. Может быть по другому в процессорах cuda 3 / Fermi, не помню

  2. не совсем, но ... (в зависимости от ваших требований вы можете найти обходной путь) читать этот пост CUDA: синхронизация потоков

...