Почему данные переносятся с хоста на устройство, когда ЦП пытается прочитать управляемую память, инициализированную графическим процессором?

В следующем тестовом коде мы инициализируем данные с помощью графического процессора, а затем получаем доступ к данным с помощью процессора. У меня есть 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 и / или всего графического процессора. Это было бы мое предположение, хотя это всего лишь предположение. Обычно я не ожидаю от профилировщика совершенно точных результатов, когда профилирование крошечных фрагментов кода почти ничего не делает.

Другие вопросы по тегам