В функции ядра я хочу два вектора разделяемой памяти, как с длиной size
(фактически sizeof(float)*size
).Использование динамического распределения общей памяти для двух разных векторов
Поскольку не представляется возможным выделить память непосредственно в функции ядра, если переменная нужна, я должен был передать его динамически, как:
myKernel<<<numBlocks, numThreads, 2*sizeof(float)*size>>> (...);
и внутри ядра:
extern __shared__ float row[];
extern __shared__ float results[];
Но это не работает.
Вместо этого я сделал только один вектор extern __shared__ float rowresults[]
, содержащий все данные, используя выделенную память 2*size
. Таким образом, звонки row
по-прежнему совпадают, а звонки results
похожи на rowresults[size+previousIndex]
. И это действительно работает.
Это не большая проблема, потому что я все равно получаю ожидаемые результаты, но есть ли способ разделить мою динамически выделенную разделяемую память на две (или более) разные переменные? Просто для красоты.
Более красивый способ сделать это, вот что я искал. Благодарю. – machlas
@Imortenson Поддерживает ли этот метод преимущества динамического доступа к выравниванию элементов в памяти? Будет ли доступ к 'float4' на выравнивание' 32byte', если вы выделили память как 'sizeof (float)' или доступ будет следовать за выравниванием 'float'? Спасибо. – BugShotGG
В вашем примере вы знаете размеры ваших массивов; поэтому почему бы не определить «struct» вместо этого и переинтерпретировать общую память как эту структуру? – einpoklum