Я изучаю CUDA. Сегодня я пробую код в книге: CUDA Application Design And Development
, что меня удивляет. Почему CUDA Thrust так медленно? Вот код и вывод.Уменьшение тяги CUDA происходит так медленно?
#include <iostream>
using namespace std;
#include<thrust/reduce.h>
#include<thrust/sequence.h>
#include<thrust/host_vector.h>
#include<thrust/device_vector.h>
#include <device_launch_parameters.h>
#include "GpuTimer.h"
__global__ void fillKernel(int *a, int n)
{
int tid = blockDim.x * blockIdx.x + threadIdx.x;
if(tid <n) a[tid] = tid;
}
void fill(int *d_a, int n)
{
int nThreadsPerBlock = 512;
int nBlock = n/nThreadsPerBlock + ((n/nThreadsPerBlock)?1:0);
fillKernel<<<nBlock, nThreadsPerBlock>>>(d_a, n);
}
int main()
{
const int N = 500000;
GpuTimer timer1, timer2;
thrust::device_vector<int> a(N);
fill(thrust::raw_pointer_cast(&a[0]), N);
timer1.Start();
int sumA = thrust::reduce(a.begin(), a.end(), 0);
timer1.Stop();
cout << "Thrust reduce costs " << timer1.Elapsed() << "ms." << endl;
int sumCheck = 0;
timer2.Start();
for(int i = 0; i < N; i++)
sumCheck += i;
timer2.Stop();
cout << "Traditional reduce costs " << timer2.Elapsed() << "ms." << endl;
if (sumA == sumCheck)
cout << "Correct!" << endl;
return 0;
}
Возможно, потому, что ваш размер входных данных довольно мал, или ваш графический процессор работает довольно медленно, или ваш хост-процессор довольно быстрый, или ваша платформа CUDA, как много латентности? Как мы можем ответить, почему ваш конкретный эксперимент не соответствует произвольному ожидаемому результату, когда мы не знаем, как эксперимент был выполнен? – talonmies