Идентификатор потока CUDA внутри ядра - PullRequest
2 голосов
/ 23 ноября 2011

Как узнать текущий идентификатор потока выполнения внутри функции ядра?Я ожидаю, что предопределенная переменная похожа на blockIdx или threadIdx, но не может найти упоминания «streamId»Есть ли другой способ?

Ответы [ 2 ]

7 голосов
/ 23 ноября 2011

В CUDA потоки - это средство хост-драйвера - фактически это просто набор командных конвейеров, из которых драйвер выбирает задачи для запуска на GPU. В «базовой» архитектуре CUDA графический процессор имеет «механизм DMA» для передачи памяти по шине PCI Express и «механизм выполнения» для выполнения кода ядра и все. В Fermi может быть до двух «механизмов DMA», и «механизм выполнения», по-видимому, настраивается в качестве хост-драйвера, что позволяет выполнять несколько ядер. Драйвер передает работу из одного или нескольких буферов FIFO (которые предоставляются через API потоков) на эти механизмы. Но сам GPU ничего не знает о потоках, они просто устройства на стороне хоста.

6 голосов
/ 23 ноября 2011

Если вам нужен идентификатор потока в ядре, вы всегда можете передать его в качестве параметра вашему ядру:

__global___
void kernel(int streamId) {
    //...
}

void callKernel() {
    cudaStream_t stream;
    cudaStreamCreate(&stream);

    kernel<<<1,1,0,stream>>>((int)stream);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...