Почему данные переносятся с хоста на устройство, когда ЦП пытается прочитать управляемую память, инициализированную графическим процессором?
В следующем тестовом коде мы инициализируем данные с помощью графического процессора, а затем получаем доступ к данным с помощью процессора. У меня есть 2 вопроса о результатах профилирования от nvprof.
Почему одни данные переносятся с хоста на устройство? В моем понимании это должно быть устройство для хоста.
Почему количество H->D равно 2? Думаю, должно быть 1, потому что данные на одной странице.
Заранее спасибо!
моя среда
- Версия драйвера: 418.87.00
- Версия CUDA: 10.1
- убунту 18.04
#include <cuda.h>
#include <iostream>
using namespace std;
__global__ void setVal(char* data, int idx)
{
data[idx] = 'd';
}
int main()
{
const int count = 8;
char* data;
cudaMallocManaged((void **)&data, count);
setVal<<<1,1>>>(data, 0); //GPU page fault
cout<<" cpu read " << data[0] <<endl;
cudaFree(data);
return 0;
}
==28762== Unified Memory profiling result:
Device "GeForce GTX 1070 (0)"
Count Avg Size Min Size Max Size Total Size Total Time Name
2 32.000KB 4.0000KB 60.000KB 64.00000KB 11.74400us Host To Device
1 - - - - 362.9440us Gpu page fault groups
Total CPU Page faults: 1
1 ответ
Почему одни данные переносятся с хоста на устройство? В моем понимании это должно быть устройство для хоста.
Вы обмениваетесь данными между хостом и устройством. Поскольку запуск ядра графического процессора является асинхронным, код вашего хоста, выпущенный после запуска ядра, фактически обращается к данным до кода графического процессора.
Поставить cudaDeviceSynchronize()
после вызова ядра, чтобы код ЦП не пытался читать данные до завершения работы ядра.
У меня нет ответа на ваш другой вопрос. Профилировщик часто не может идеально справиться с очень небольшими объемами активности. Он не обязательно инструментирует все SM во время выполнения профилирования, и некоторые из его результатов могут быть масштабированы для размера GPC, TPC и / или всего графического процессора. Это было бы мое предположение, хотя это всего лишь предположение. Обычно я не ожидаю от профилировщика совершенно точных результатов, когда профилирование крошечных фрагментов кода почти ничего не делает.