CUDA - указание <<< x, y >>> для цикла for - PullRequest
0 голосов
/ 15 марта 2011

Эй, у меня есть два массива размером 2000. Я хочу написать ядро ​​для копирования одного массива в другой.Массив представляет 1000 частиц.Индекс 0-999 будет содержать значение x, а 1000-1999 значение y для их положения.

Мне нужен цикл for для копирования до N частиц из одного массива в другой.например,

    int halfway = 1000;
    for(int i = 0; i < N; i++){
         array1[i] = array2[i];
         array1[halfway + i] = array[halfway + i];
    }

Поскольку число N всегда меньше 2000, могу ли я просто создать 2000 потоков?или мне нужно создать несколько блоков.

Я думал о том, чтобы сделать это внутри ядра:

  int tid = threadIdx.x;

  if (tid >= N) return;

  array1[tid] = array2[tid];
  array1[halfway + tid] = array2[halfway + tid];

и вызвать его следующим образом:

  kernel<<<1,2000>>>(...);

эта работа?это будет быстро?или мне лучше разбить проблему на блоки.Я не уверен, как это сделать, возможно: (это правильно?)

  int tid = blockDim.x*blockIdx.x + threadIdx.x;

  if (tid >= N) return;

  array1[tid] = array2[tid];
  array1[halfway + tid] = array2[halfway + tid];

  kernel<<<4,256>>>(...);

Ответы [ 3 ]

3 голосов
/ 15 марта 2011

Будет ли это работать?

Вы на самом деле пробовали это?

Не удастся запустить, потому что вы можете иметь максимум 512 потоков (значение может варьироватьсяпо разным архитектурам моя - одна из серии GTX 200).Вам потребуется больше блоков или меньше потоков и цикл for внутри с шагом blockDim.x.

Ваше многоблочное решение также должно работать.

Другой подход

Если это единственная цель ядра, вы также можете попробовать использовать cudaMemcpy с cudaMemcpyDeviceToDevice в качестве последнего параметра.

0 голосов
/ 16 марта 2011

Лучше использовать более одного блока для любого ядра.

Мне кажется, что вы просто копируете из одного массива в другой как последовательность значений со смещением.В этом случае вы можете просто использовать вызов API cudaMemcpy и указать cudaMemcpyDeviceToDevice

cudaMemcpy(array1+halfway,array1,1000,cudaMemcpyDeviceToDevice);

API определит лучший раздел блока / потоков.

0 голосов
/ 15 марта 2011

Единственный способ ответить на вопросы о конфигурациях - это проверить их. Для этого напишите ваши ядра, чтобы они работали независимо от конфигурации. Часто я предполагаю, что я запущу достаточно потоков, что облегчает написание ядра. Затем я сделаю что-то вроде этого:

threads_per_block = 512;

num_blocks = SIZE_ARRAY/threads_per_block;
if(num_blocks*threads_per_block<SIZE_ARRAY)
    num_blocks++;

my_kernel <<< num_blocks, threads_per_block >>> ( ... );

(за исключением, конечно, threads_per_block может быть определением, аргументом командной строки или итерацией для проверки многих конфигураций)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...