CUDA: больше размеров для блока или только один? - PullRequest
4 голосов
/ 28 марта 2011

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

Размеры матрицы не известны «a priori» и могут варьироваться [2-20.000].

Мне было интересно: я мог бы использовать (как предложил здесь Джонатан) одно измерение блока, например:

int thread_id = blockDim.x * block_id + threadIdx.x;

и проверьте, есть ли thread_id ниже, чем строки * столбцов ... это довольно просто и прямо.

Но есть ли какая-то конкретная причина производительности, почему я должен использовать два (или даже три) измерения сетки блока для выполнения такого вычисления (имея в виду, что у меня есть матрица в конце концов) вместо одного?

Я думаю о проблемах коалесценции, таких как последовательное чтение всех потоков значениями

1 Ответ

6 голосов
/ 28 марта 2011

Размеры существуют только для удобства, внутренне все линейно, поэтому не было бы никакого преимущества с точки зрения эффективности в любом случае. Избегать вычисления (надуманного) линейного индекса, как вы показали выше, может показаться немного быстрее, но не будет никакой разницы в том, как сливаются потоки.

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