В произвольном порядке:
- Память устройства (т. Е. Память, выделенная с помощью
cudaMalloc
) не может быть доступна напрямую на хосте, поэтому ваши вычисления maxError
недопустимы, поскольку y
указатель в памяти устройства Чтобы выполнить проверку на наличие ошибок, вам требуется копия y
на локальную копию хоста памяти перед запуском l oop cudaMemset
устанавливает байты , а не слова ( так же, как обычный memset
). Вам нужно либо установить значения на хосте и скопировать их на устройство, либо в другое ядро, либо использовать что-то вроде thrust::fill_n
. - В духе вашего предыдущего вопрос , как правило, задержка установки при первом вызове ядра имеет место, поэтому выполните разминку перед синхронизацией
Выполнение этих трех вещей дает мне следующее:
int main()
{
int N = 1 << 20;
std::vector<float> xh(N, 1.0f);
std::vector<float> yh(N, 2.0f);
float* x, * y;
cudaMalloc(&x, N * sizeof(float));
cudaMemcpy(x, &xh[0], N * sizeof(float), cudaMemcpyHostToDevice);
cudaMalloc(&y, N * sizeof(float));
cudaMemcpy(y, &yh[0], N * sizeof(float), cudaMemcpyHostToDevice);
int blockSize, numBlocks;
cudaOccupancyMaxPotentialBlockSize(&numBlocks, &blockSize, add);
for(int rep=0; rep<10; rep++) {
auto t1 = std::chrono::high_resolution_clock::now();
add << <numBlocks, blockSize >> > (N, x, y);
cudaDeviceSynchronize();
auto t2 = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count();
std::cout << rep << " duration CUDA: " << duration <<std::endl;
}
cudaMemcpy(&yh[0], y, N * sizeof(float), cudaMemcpyDeviceToHost);
float maxError = 0.0f;
for (int i = 0; i < N; i++)
maxError = fmax(maxError, fabs(yh[i] - 12.0f));
std::cout << "Max error: " << maxError << std::endl;
cudaFree(x);
cudaFree(y);
cudaDeviceReset();
return 0;
}
И его компиляция и запуск дает мне следующее:
$ nvcc -arch=sm_52 -std=c++11 -o devmem devmem.cu
$ ./devmem
0 duration CUDA: 155
1 duration CUDA: 94
2 duration CUDA: 95
3 duration CUDA: 94
4 duration CUDA: 94
5 duration CUDA: 93
6 duration CUDA: 93
7 duration CUDA: 99
8 duration CUDA: 92
9 duration CUDA: 93
Max error: 0
По сравнению с таймингами в моем последнем ответе вам, вы можете видеть, что использование памяти устройства обеспечивает ускорение по сравнению с управляемой памятью в моей системе. Как всегда, ваши результаты могут отличаться.