CUDA поток медленнее обычного ядра
Я пытаюсь понять потоки CUDA, и я сделал свою первую программу с потоками, но это медленнее, чем обычная функция ядра...
почему этот код медленнее
cudaMemcpyAsync(pole_dev, pole, size, cudaMemcpyHostToDevice, stream_1);
addKernel<<<count/100, 100, 0, stream_1>>>(pole_dev);
cudaMemcpyAsync(pole, pole_dev, size, cudaMemcpyDeviceToHost, stream_1);
cudaThreadSynchronize(); // I don't know difference between cudaThreadSync and cudaDeviceSync
cudaDeviceSynchronize(); // it acts relatively same...
чем:
cudaMemcpy(pole_dev, pole, size, cudaMemcpyHostToDevice);
addKernel<<<count/100, 100>>>(pole_dev);
cudaMemcpy(pole, pole_dev, size, cudaMemcpyDeviceToHost);
Я подумал, что он должен работать быстрее... значение счетчика переменных составляет 6 500 000 (максимум) ... первый исходный код занимает 14 миллисекунд, а второй исходный код занимает 11 миллисекунд.
Кто-нибудь может мне это объяснить, пожалуйста?
1 ответ
В этом фрагменте вам нравится иметь дело только с одним потоком (stream_1
), но на самом деле это то, что CUDA автоматически делает для вас, когда вы явно не управляете потоками.
Чтобы воспользоваться потоками и асинхронной передачей памяти, вам нужно использовать несколько потоков и разделять свои данные и вычисления по каждому из них.