Я пытался увидеть количество инструкций, выполняемых в ядре, когда размер типа данных измененРазмер данных в инструкции на отношения Деформации в CUDA
Для того, чтобы получить структуру данных пользовательского размера я создал-структуру, как следующее,
#define DATABYTES 40
__host__ __device__
struct floatArray
{
float a[DATABYTES/4];
};
, а затем создали ядро просто скопировать выше массив типа данных из одного массива в другую
__global__
void copy_large_data(floatArray * d_in, floatArray * d_out)
{
d_out[threadIdx.x] = d_in[threadIdx.x];
}
затем вызывается вышеупомянутое ядро для о олько 32 нить с одного блоком
floatArray * d_in;
floatArray * d_out;
cudaMalloc(&d_in, 32 * sizeof(floatArray));
cudaMalloc(&d_out, 32 * sizeof(floatArray));
copy_large_data<<<1, 32>>>(d_in, d_out);
Когда я профилировать программу с помощью nvprof
и проверен на instructions per warp
я мог видеть, что значение параметра изменяется с изменением величины DATABYTES
.
Мои вопросы: является ли причиной увеличения количества этих команд из-за массива внутри структуры floatArray
. Поскольку, когда мы вызываем копию в ядре, она фактически расширяет и копирует каждый элемент массива a
внутри структуры floatArray
, создавая дополнительные инструкции.
Есть ли способ скопировать настраиваемую структурную переменную в ядро с использованием одной инструкции?
Так что вы говорите, что максимальное DataSize данных, которые мы можем передать с помощью одной команды составляет 128 бит? – BAdhi
Да, но имейте в виду, что транзакции внутри warp могут объединяться в 128-байтные транзакции. – havogt
Вы имеете в виду при правильном использовании кеша L1? потому что я думаю, что если мы используем только кеш L2, размер транзакции сокращается до 32 байт. – BAdhi