2016-11-22 9 views
0

Я пытаюсь сделать матричное умножение между матрицей 3x3 и матрицей 360x360. Меньшая матрица (3x3) будет обрабатываться с первым (3x3) блоком большой матрицы и т. Д. Следовательно, я хочу, чтобы моя меньшая матрица была постоянной и скользнула по моей большей матрице.cuda: матричное умножение с использованием общих и глобальных

Можно ли сохранить мою меньшую матрицу как часть общей памяти и иметь мою большую матрицу, разделенную на 3x3 в глобальном?

Я не нахожу способ скопировать меньшую матрицу для совместного использования непосредственно с хоста. Пожалуйста, поправьте меня, если моя визуализация куды ошибочна.

Спасибо.

+2

Вы не можете копировать в общую память с хоста. Это не поддерживается. – talonmies

ответ

1

Невозможно заполнить общую память от хоста.

Однако лучший способ обработки констант для всех потоков, таких как матрица 3x3, из вашего примера, состоит в том, чтобы поместить их в постоянную память (размер которой составляет 64 kB). Существует 2 способа использования постоянной памяти:

  • Самый простой способ - использовать аргументы ядра. Определите struct, содержащую ваши аргументы ядра, включая матрицу 3х3, и передать его в ядро ​​
  • Использование __constant__ типа квалификационного и использовать cudaMemcpyToSymbol для заполнения его от хоста:

    //In global scope 
    __constant__ float mat_gpu[3][3]; 
    //In the function that you use to populate the data 
    cudaMemcpyToSymbol(mat_gpu, mat_cpu, 9 * sizeof(float)); 
    //In your kernel you just use the mat_gpu variable 
    
+0

Большое спасибо за ваш удивительный ответ. Можете ли вы предоставить какой-либо пример использования этого спецификатора типа __constant__ и cudaMemcpyToSymbol. Это было бы очень полезной помощью. Заранее спасибо. –

+1

Я добавил пример использования cudaMemcpyToSymbol, надеюсь, что это поможет! – ptrendx