Я запускаю функцию пригодности для 1024 матриц, каждая матрица получает свой собственный блок и имеет тот же размер. Каждый блок имеет потоки n*n
(размерность матрицы) и должен иметь общую память n*n
, чтобы я мог легко сократить сумму. Однако размер n
для всех матриц является переменным до времени выполнения (т. Е. Его можно вручную изменить, хотя всегда имеет значение 2, поэтому суммирование простое). Проблема здесь в том, что разделяемая память должна выделяться с использованием константы, но мне также нужно передать значение ядру из хоста. Где объявить размер n
так, чтобы он был видимым для CPU (для передачи в ядро) и может использоваться для объявления размера общей памяти (в ядре)?CUDA Где объявить константу для распределения общей памяти
Мой код структурирована следующим образом:
из main.cu
я называю ядро:
const int num_states = 1024
const int dimension = 4
fitness <<< num_states, dimension * dimension >>> (device_array_of_states, dimension, num_states, device_fitness_return);
, а затем в kernel.cu
у меня есть:
__global__ void fitness(
int *numbers,
int dimension,
int num_states,
int *fitness_return) {
__shared__ int fitness[16]; <<-- needs to be dimension * dimension
//code
}
numbers
представляет собой массив, представляющий 1024 матрицы , dimension
- длина строки и столбца, num_states
- 1024, fitness_return
i s массив с длиной 1024, который содержит значение пригодности для каждой матрицы. В ядре общая память жестко закодирована с квадратом dimension
(поэтому dimension
- это 4 в этом примере).
Где и как я могу объявить dimension
, чтобы его можно было использовать для распределения общей памяти, а также для вызова ядра, поэтому мне нужно только обновить dimension
в одном месте? Спасибо за вашу помощь.
Отредактировано решение. – einpoklum
Объявите его в глобальном масштабе, прежде чем использовать его. –
Параметры шаблона - ваш друг в этом случае – talonmies