У меня есть куча векторов (~ 500). Мне нужно найти тройные продукты всех комбинаций векторов в OpenCL. В C++ есть много combination algorithms (r из n вещей), но я еще не нашел каких-либо реализованных для GPU. Я видел довольно много parallel permutation algorithms в Cuda, но я просто хочу знать, существуют ли какие-либо жизнеспособные алгоритмы комбинации?Комбинации целых чисел в OpenCL
ответ
Мне нужно угадать немного здесь и там, чтобы ответить на ваш вопрос.
Я полагаю, у вас есть массив V из векторов n (~ 500). Эти векторы имеют одинаковую размерность m (вероятно, m = 3).
То, что вы хотите, это компонент, мудрая продукт каждые 3 векторов v я, v J, v к, где я, J, K в {0, .., п-1}.
Простой 3-мерный пример:
result[idx].x = V[i].x * V[j].x * V[k].x;
result[idx].y = V[i].y * V[j].y * V[k].y;
result[idx].z = V[i].z * V[j].z * V[k].z;
Теперь, возможно, ваши векторы не 3-мерные и, возможно, вы не хотите, чтобы компонент мудрого продукт, но сумма его (как в скалярном произведении), но Я уверен, что вы можете соответствующим образом изменить код.
Настоящий вопрос заключается в том, как вычислить все возможные i, j, k и idx. Верный?
Теперь с CUDA вы находитесь в очень удачном положении. Вы можете просто запустить n * n * n потоков в сетке и, следовательно, бесплатно получить i, j, k, не задумываясь о способах вычисления комбинаций или перестановок вообще. Просто выполните следующие действия:
dim3 grid, block;
block.x = n;
block.y = 1;
block z = 1;
grid.x = n;
grid.y = n;
grid.z = 1;
compute_product_kernel<<<grid, block>>>(V, result);
Таким образом вы запустите n * n блоков из n потоков. Вычислительный я, J, K становится тривиальным, вычисление IDX легко:
__device__ void compute_product_kernel(myVector* V, myVector* result)
{
int i = blockIdx.x;
int j = blockIdx.y;
int k = threadIdx.x;
int idx = i * gridDim.y * blockDim.x + j * blockDim.x + k;
...
}
Конечно все это работает только потому, что ваш п находится в пределах блока и сетки диапазона CUDA в. больше
Две вещей, хотя:
- Может быть, вы хотите перестановки вместо комбинаций. Вы можете сделать это, пропустив каждую комбинацию, где любые два из i, j, k будут одинаковыми. Но я бы порекомендовал держать их в любом случае, потому что вычисление, когда пропустить, вероятно, дороже, чем выполнение реальной работы. Также я бы посоветовал использовать перестановку для сохранения памяти для
result
, потому что это спасло бы вас менее 1% и сделало бы вычисления более сложными. - Уверены, у вас достаточно памяти, чтобы на самом деле это сделать? Для сохранения результата требуются байты n * n * n * m * sizeof (float). При n = 500 и m = 3, которые уже были бы 1,5 ГБ. Это действительно то, что вы ищете? Возможно, следующий шаг вашей обработки можно объединить в расчет, чтобы не сохранять промежуточный результат.
- 1. Комбинации ограниченного набора целых чисел
- 2. OpenCL: сумма параллельно n целых чисел
- 3. k-комбинации набора целых чисел в порядке возрастания размера
- 4. Хранение и получение комбинации символов и целых чисел в массиве
- 5. подсчет целых целых чисел
- 6. Найдите комбинации целых чисел, которые добавляют к сумме
- 7. Regex для извлечения целых чисел и игнорировать числовые комбинации букв
- 8. Как можно эффективно генерировать эти комбинации целых чисел?
- 9. Алгоритм для нахождения комбинации целых чисел больше заданного значения
- 10. Другой способ получить все комбинации целых чисел массива Javascript
- 11. Массив целых чисел Сравнение целых чисел VB.NET
- 12. Комбинации чисел до равных Всего
- 13. Преобразование строки целых чисел от входа в массив целых чисел
- 14. Отличие больших целых чисел от близких целых чисел в python
- 15. Как найти повторяющуюся последовательность целых чисел в массиве целых чисел?
- 16. уменьшить список целых чисел/диапазон целых чисел в scala
- 17. Как превратить текстовую строку целых чисел в массив целых чисел?
- 18. Подсчет списка целых чисел в списки одинаковых целых чисел
- 19. BPEL: скопировать массив целых чисел в другой массив целых чисел
- 20. Четные множества целых чисел
- 21. цепочка целых чисел головоломка
- 22. Исключение целых целых чисел в Fortran
- 23. Комбинации чисел с весом
- 24. C# Комбинации чисел
- 25. алгоритм комбинации чисел
- 26. Регулярное выражение для целых чисел и целых чисел?
- 27. Linq пересекает дочерний список целых чисел по списку целых чисел
- 28. минимизировать отклонение k целых чисел от n упорядоченных целых чисел
- 29. указатель на массив целых чисел и обычный массив целых чисел
- 30. Обратная строка целых чисел, не меняя самих целых чисел
Благодарим вас за подробный ответ. Фактически скалярное тройное произведение вычисляет a. (Bxc) для трех векторов a, b, c. Но я понимаю, что вы представляете. Следующий шаг - сортировка всех трех продуктов в порядке убывания. Поэтому я не уверен, что смогу как-нибудь немного сократить шаг. Я должен иметь возможность использовать подмножество векторного набора, ограничивающего примерно 100-200 векторов, чтобы уменьшить нагрузку. – shunyo