Время CUDA GPU в MATLAB увеличивается при увеличении размера сетки - PullRequest
0 голосов
/ 13 января 2019

Я использую MATLAB R2017a. Я запускаю простой код для расчета совокупной суммы от первой точки до i-й точки.

мой код ядра CUDA:

__global__ void summ(const double *A, double *B, int N){
    for (int i=threadIdx.x; i<N; i++){
B[i+1] = B[i] + A[i];}}

мой код MATLAB

k=parallel.gpu.CUDAKernel('summ.ptx','summ.cu');

n=10^7;
A=rand(n,1);
ans=zeros(n,1);
A1=gpuArray(A);
ans2=gpuArray(ans);

k.ThreadBlockSize = [1024,1,1];
k.GridSize = [3,1];
G = feval(k,A1,ans2,n);
G1 = gather(G);
GPU_time = toc

Мне интересно, почему время GPU увеличивается, когда я увеличиваю размер сетки (k, .GridSize). за мгновение для 10 ^ 7 данных

k.GridSize=[1,1] the time is 8.0748s
k.GridSize=[2,1] the time is 8.0792s
k.GridSize=[3,1] the time is 8.0928s

Из того, что я понимаю, для 10 ^ 7 числа данных системе потребуется 10 ^ 7/1024 ~ 9767 блоков, поэтому размер сетки должен быть [9767,1].

Устройство с графическим процессором

Name: 'Tesla K20c'
                 Index: 1
     ComputeCapability: '3.5'
        SupportsDouble: 1
         DriverVersion: 9.1000
        ToolkitVersion: 8
    MaxThreadsPerBlock: 1024
      MaxShmemPerBlock: 49152
    MaxThreadBlockSize: [1024 1024 64]
           MaxGridSize: [2.1475e+09 65535 65535]
             SIMDWidth: 32
           TotalMemory: 5.2983e+09
       AvailableMemory: 4.9132e+09
   MultiprocessorCount: 13
          ClockRateKHz: 705500
           ComputeMode: 'Default'
  GPUOverlapsTransfers: 1
KernelExecutionTimeout: 0
      CanMapHostMemory: 1
       DeviceSupported: 1
        DeviceSelected: 1

спасибо за ваш ответ.

1 Ответ

0 голосов
/ 13 января 2019

Вы, кажется, беспокоитесь об очень очень небольшой части времени по сравнению с общим эффектом. Реальный вопрос, который вы должны задать: имеет ли смысл такое количество времени для решения этой проблемы? Ответа на это нет абсолютно нет.

Вот модифицированный код, который должен работать намного быстрее

n=10^7;
dev = gpuDevice;

A = randn(n,1,'gpuArray');
B = randn(n,1,'gpuArray');
tic
G = A+cumsum(B);
wait(dev)
toc

На моем 1060 это работает за 0,03 секунды. Для еще более высоких скоростей вы можете использовать одинарную точность

В любом случае, эти 0,02 секунды могут быть легко связаны с небольшими изменениями нагрузки на ваш графический процессор. Это гораздо более вероятный сценарий, чем использование размеров сетки.

...