Tôi tính phương trình A * x = B, trong đó A là ma trận và B là vectơ, x là vectơ trả lời (không xác định).Matlab + CUDA chậm trong việc giải phương trình vector-ma trận A * x = B
phần cứng thông số kỹ thuật: 3630QM i7 của Intel (4 lõi), nVidia GeForce GT 640M (384 lõi CUDA)
Dưới đây là một ví dụ:
>> A=rand(5000);
>> B=rand(5000,1);
>> Agpu=gpuArray(A);
>> Bgpu=gpuArray(B);
>> tic;A\B;toc;
Elapsed time is 1.382281 seconds.
>> tic;Agpu\Bgpu;toc;
Elapsed time is 4.775395 seconds.
Bằng cách nào đó GPU là chậm hơn nhiều ... Tại sao ? Nó cũng chậm hơn trong các phép tính FFT, INV, LU, nên liên quan đến phép phân chia ma trận.
Tuy nhiên, GPU nhanh hơn nhiều trong nhân ma trận (cùng một dữ liệu):
>> tic;A*B;toc;
Elapsed time is 0.014700 seconds.
>> tic;Agpu*Bgpu;toc;
Elapsed time is 0.000505 seconds.
Câu hỏi chính là lý do tại sao GPU A \ B (mldivide) như vậy là chậm so với CPU?
CẬP NHẬT
Dưới đây là một số kết quả hơn khi A, B (trên CPU), AA, BB (trên GPU) là rand (5000):
>> tic;fft(A);toc;
Elapsed time is *0.117189 *seconds.
>> tic;fft(AA);toc;
Elapsed time is 1.062969 seconds.
>> tic;fft(AA);toc;
Elapsed time is 0.542242 seconds.
>> tic;fft(AA);toc;
Elapsed time is *0.229773* seconds.
>> tic;fft(AA);toc;
lần Bold là lần ổn định. Tuy nhiên, GPU chậm hơn gần gấp hai lần. Nhân tiện, tại sao GPU thậm chí còn chậm hơn trong hai lần thử đầu tiên? Nó được biên dịch hai lần trước?
Ngoài ra:
>> tic;sin(A);toc;
Elapsed time is *0.121008* seconds.
>> tic;sin(AA);toc;
Elapsed time is 0.020448 seconds.
>> tic;sin(AA);toc;
Elapsed time is 0.157209 seconds.
>> tic;sin(AA);toc;
Elapsed time is *0.000419 *seconds
Sau hai tính toán GPU là vô cùng nhanh hơn trong các phép tính tội lỗi.
Vì vậy, vẫn còn, tại sao GPU quá chậm trong phân chia ma trận, tính toán fft và tương tự, mặc dù quá nhanh trong nhân ma trận và lượng giác? Câu hỏi thực sự không nên như vậy ... GPU nên nhanh hơn trong tất cả các tính toán này vì Matlab đã phát hành các chức năng chồng chéo (mldivide, fft) cho GPU.
Ai đó có thể giúp tôi giải quyết những vấn đề này không? :)
Mặc dù đây không phải là tình huống chính xác vì bạn đang sử dụng trình giải quyết trực tiếp thay vì phương pháp không gian con krylov, có một số thông tin thú vị trên trang web của vienacl dưới điểm chuẩn. Nếu bạn xem xét điều này: http://viennacl.sourceforge.net/viennacl-benchmarks.html bạn sẽ nhận thấy rằng trong hầu hết các tình huống, CPU nhanh hơn CPU cho ma trận nhỏ hơn, điều này một phần là do bản chất của giải quyết lặp lại, nhưng nó cũng giống như họ nói kết quả của "chi phí khởi động hạt nhân GPU không thể tránh khỏi do độ trễ PCI-Express" có khả năng có ảnh hưởng tương tự cho bạn. – johnish
@johnish Tôi không chắc chắn rằng trong trường hợp này thời gian dài hơn nên được gán cho chi phí khởi động hạt nhân GPU do độ trễ PCI-Express. Đối với các ma trận có cùng kích thước, phép nhân ma trận trên GPU mất 0.000505s, vì vậy tôi sẽ kết luận rằng chi phí trên là <0.000505s, trong khi mldivide mất 4.775395s. Tôi sẽ kết luận rằng các độ trễ trong trường hợp này hoàn toàn bị che khuất bởi thời gian xử lý có thể dài hơn trên CPU đối với các ma trận "nhỏ", như bạn đã quan sát. Untile gần đây, Accelereyes Jacket thực hiện một công việc tốt cho các nhiệm vụ như vậy, nhưng có vẻ như nó đã được tích hợp trong Matlab bây giờ. – JackOLantern