5

Tôi hiện đang có một song song cho vòng lặp tương tự như sau:Cách dễ nhất để sử dụng GPU cho song song cho vòng lặp

int testValues[16]={5,2,2,10,4,4,2,100,5,2,4,3,29,4,1,52}; 
parallel_for (1, 100, 1, [&](int i){ 
    int var4; 
    int values[16]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}; 
    /* ...nested for loops */ 
     for (var4=0; var4<16; var4++) { 
      if (values[var4] != testValues[var4]) break; 
     } 
    /* ...end nested loops */ 
} 

Tôi đã được tối ưu hóa nhiều như tôi có thể đến điểm rằng điều duy nhất tôi càng có thể làm là thêm nhiều tài nguyên hơn.

Tôi quan tâm đến việc sử dụng GPU để giúp xử lý tác vụ song song. Tôi đã đọc rằng các tác vụ song song đáng hổ thẹn như thế này có thể sử dụng một GPU hiện đại khá hiệu quả.

Sử dụng bất kỳ ngôn ngữ nào, cách dễ nhất để sử dụng GPU cho một song song đơn giản cho vòng lặp như thế này là gì?

Tôi không biết gì về kiến ​​trúc GPU hoặc mã GPU gốc.

+0

Nếu nhiệm vụ của bạn là một tác vụ tính toán số, hoặc nếu bạn có thể chuyển nó thành một vấn đề dựa trên ma trận, thì bạn có thể sử dụng MATLAB. Các MATLAB mới hỗ trợ cả song song cho ('parfor' từ Hộp công cụ tính toán song song) và phép toán ma trận trên GPU Nvidia CUDA. Cả hai đều tương đối không đau, chỉ yêu cầu những thay đổi khiêm tốn đối với mã MATLAB hiện có. –

+0

Một số thông tin khác về những gì bạn đang cố gắng thực sự làm ở đây có thể hữu ích.Hãy nhớ rằng việc chuyển dữ liệu từ CPU sang GPU phải gánh chịu chi phí đáng kể, do đó tính toán GPU chỉ mang lại hiệu suất tăng nếu bạn đang thực hiện rất nhiều công việc tính toán trên mỗi đơn vị dữ liệu đầu vào. Tính bình phương của mỗi số trong một véc-tơ không phải là một cách sử dụng tốt của GPGPU (hầu như không có bất kỳ công việc nào trên một đơn vị dữ liệu); tính toán FFT của một vector là một cách sử dụng tốt (rất nhiều công việc trên dữ liệu nhỏ). –

+0

Tôi có một số lồng nhau cho vòng lặp, trong vòng lặp trong cùng tôi đang sử dụng các chỉ số vòng lặp để tính toán 16 giá trị và so sánh chúng với mảng testValues ​​[]. Không nên có bất kỳ truy cập bộ nhớ đáng kể nào. Ngoài ra tôi đang sử dụng một thẻ AMD/ATI (6850). – Flash

Trả lời

2

như Li-aung Yip đã nói trong nhận xét, cách đơn giản nhất để sử dụng GPU là một cái gì đó giống như Matlab hỗ trợ hoạt động mảng và tự động (nhiều hoặc ít) di chuyển chúng đến GPU. nhưng để làm việc đó bạn cần phải viết lại mã của mình như là các hoạt động dựa trên ma trận thuần túy.

nếu không, hầu hết sử dụng GPU vẫn yêu cầu mã hóa trong CUDA hoặc OpenCL (bạn sẽ cần sử dụng OpenCL với thẻ AMD). ngay cả khi bạn sử dụng trình bao bọc cho ngôn ngữ yêu thích của mình, mã thực tế chạy trên GPU vẫn thường được viết bằng OpenCL (trông có vẻ mơ hồ như C). và do đó điều này đòi hỏi một số tiền hợp lý của học tập/nỗ lực. bạn có thể bắt đầu bằng cách tải xuống OpenCL từ AMD và đọc qua các tài liệu ...

cả hai tùy chọn đó đều yêu cầu học những ý tưởng mới, tôi nghi ngờ. những gì bạn thực sự muốn, tôi nghĩ, là một mức độ cao, nhưng vẫn còn truyền thống, tìm kiếm, ngôn ngữ nhắm vào gpu. Thật không may, họ dường như không tồn tại nhiều. ví dụ duy nhất tôi có thể nghĩ là theano - bạn có thể thử điều đó. ngay cả ở đó, bạn vẫn cần phải học python/numpy, và tôi không chắc chắn việc thực hiện theano vững chắc như thế nào, nhưng nó có thể là cách ít đau đớn nhất (ở chỗ nó cho phép một cách tiếp cận "truyền thống" dễ dàng hơn, nhưng một số người dường như thấy rằng rất khó nắm bắt, khái niệm).

ps nó không rõ ràng với tôi rằng một gpu sẽ giúp vấn đề của bạn, btw.

+0

Tôi quyết định sử dụng OpenCL - đường cong học tập không quá tệ. Tôi thấy dễ dàng hơn việc đấu tranh với các thư viện cố gắng chuyển đổi mã hiện có - vài trình bao bọc mà tôi có thể tìm thấy thất bại khá nhanh chóng và yêu cầu các kỹ thuật lập trình GPU. Matlab dường như chỉ hỗ trợ CUDA vào lúc này. – Flash

+0

ok, tuyệt. bạn đang gọi từ c? tôi thấy rằng pyopencl dễ hơn c - bạn vẫn lập trình phần opencl như nhau, nhưng có ít việc hơn trong việc chuẩn bị dữ liệu để gửi. nhưng sau đó tôi được sử dụng nhiều hơn để python hơn c ... –

1

Bạn có thể muốn kiểm tra cháy mảng.

http://www.accelereyes.com/products/arrayfire

Nếu bạn sử dụng OpenCL, bạn cần phải tải triển khai riêng biệt cho các nhà cung cấp thiết bị khác nhau, intel, AMD, và Nvidia.

0

Bạn có thể muốn xem xét OpenACC cho phép thực hiện song song thông qua chỉ thị. Bạn có thể chuyển mã của bạn (C/C++/Fortran) sang các hệ thống không đồng nhất trong khi duy trì mã nguồn vẫn chạy tốt trên một hệ thống đồng nhất. Hãy xem phần giới thiệu này video. OpenACC không phải là lập trình GPU, nhưng thể hiện sự song song trong mã của bạn, điều này có thể hữu ích để đạt được các cải tiến hiệu suất mà không có quá nhiều kiến ​​thức trong các ngôn ngữ cấp thấp như CUDA hoặc OpenCL. OpenACC có sẵn trong các trình biên dịch thương mại từ PGI, Cray và CAPS (PGI cung cấp cho người dùng mới bản dùng thử 30 ngày miễn phí).

Các vấn đề liên quan