2010-03-14 25 views
8

Tôi mới bắt đầu học OpenCL. Tôi đang cố gắng để có được một cảm giác về những gì hiệu suất đạt được mong đợi khi di chuyển các chức năng/thuật toán cho GPU.Chức năng tầm thường nhất nào có thể được tính toán trên GPU?

Hạt nhân cơ bản nhất được đưa ra trong hầu hết các hướng dẫn là một hạt nhân mà phải mất hai mảng các con số và tính tổng giá trị tại các chỉ số tương ứng và thêm chúng vào một mảng thứ ba, như vậy:

__kernel void 
add(__global float *a, 
    __global float *b, 
    __global float *answer) 
{ 
    int gid = get_global_id(0); 
    answer[gid] = a[gid] + b[gid]; 
} 

__kernel void 
sub(__global float* n, 
    __global float* answer) 
{ 
    int gid = get_global_id(0); 
    answer[gid] = n[gid] - 2; 
} 

__kernel void 
ranksort(__global const float *a, 
     __global float *answer) 
{ 
    int gid = get_global_id(0); 
    int gSize = get_global_size(0); 
    int x = 0; 
    for(int i = 0; i < gSize; i++){ 
    if(a[gid] > a[i]) x++; 
    } 
    answer[x] = a[gid]; 
} 

Tôi giả định mà bạn không bao giờ có thể biện minh cho tính toán này trên GPU, việc chuyển giao bộ nhớ sẽ ra trọng lượng thời gian nó sẽ mất tính này trên CPU bằng độ lớn (tôi có thể sai về việc này, vì thế câu hỏi này).

Những gì tôi đang tự hỏi là những gì sẽ là ví dụ tầm thường nhất nơi bạn mong chờ tăng tốc đáng kể khi sử dụng một hạt nhân OpenCL thay cho CPU?

Trả lời

6

nếu bạn có bộ ma trận đủ lớn, bạn có ý định thực hiện phép toán đại số tuyến tính, hoặc về cơ bản bạn thực hiện cùng một thao tác trên mỗi phần tử, tôi coi đó là một ví dụ nhỏ. ma trận nhân, bổ sung, fft, convolution, vv bạn sẽ thấy một chút của một tăng tốc mà không làm nhiều công việc. bây giờ nếu bạn muốn xem 100 lần tăng tốc thì bạn cần phải nghiên cứu kỹ về quản lý bộ nhớ và biết một chút công bằng về những gì đang diễn ra đằng sau hậu trường.

để bắt đầu, tôi khuyên bạn nên bắt đầu với pycuda vì nó khá đơn giản để bắt đầu vì nó cung cấp mức trừu tượng rất cao và sẽ cho phép bạn nhảy rất nhanh. kiểm tra khóa học này về tính toán song song bằng cách sử dụng cuda từ trường đại học illinois http://courses.ece.illinois.edu/ece498/al/ khi bạn sẵn sàng đi sâu hơn nữa.

+0

Liên kết bị hỏng. – user

3

phụ thuộc vào định nghĩa của tầm thường. theo ý kiến ​​của tôi, nó sẽ là sản phẩm ma trận ma trận, vì nó có O(3)/O(2) tính theo tỷ lệ bộ nhớ. Thuật toán có tỷ lệ tương tự, có khả năng được hưởng lợi từ việc cạnh tranh trên GPU.

+0

Matrix nhân là xa từ một ứng dụng nhỏ và không phải là ví dụ tốt nhất của một ứng dụng có thể hưởng lợi từ tính toán GPU. – Eric

0

Sau khi nhân ma trận Tôi có thể nói hình ảnh chập (chẳng hạn như làm mờ, giảm nhiễu vv). Khám phá AMD's tutorial.

2

Trong khi hạt nhân của bạn rõ ràng là rất tầm thường nó có thể là một ví dụ hữu ích, nó hoàn toàn bộ nhớ bị ràng buộc vì đối với mỗi yếu tố bạn có hai lần đọc và một ghi, và chỉ có một phép toán toán học. Có một số hướng dẫn để tính toán địa chỉ, vv, nhưng tất cả số tiền này thực tế không có gì so với chi phí truy cập bộ nhớ.

Giả sử các dữ liệu đã được trên GPU, bạn có thể được hưởng lợi từ băng thông rất cao của GPU vào bộ nhớ ngay cả đối với hạt nhân đơn giản này. Tất nhiên, GPU dựa vào bạn có đủ luồng để ẩn độ trễ của bộ nhớ, vì vậy kích thước nhóm làm việc cục bộ của bạn phải khá lớn (256 hoặc 512) và kích thước nhóm làm việc toàn cầu của bạn sẽ rất lớn (vd hàng trăm hàng ngàn) để điều này có hiệu quả, nhưng đó là loại điểm!

0

Điều gì là "tầm thường nhất" là vấn đề của ý kiến, nhưng tôi sẽ nói rằng việc tính toán hình ảnh của tập hợp Mandelbrot là một ứng dụng khá đơn giản khi sử dụng GPU. Mỗi điểm là hoàn toàn độc lập với mọi điểm khác, vì vậy bạn có thể bắt đầu một chuỗi cho mỗi điểm và nhận được tốc độ cực lớn. Bản thân công thức được lặp lại là một hàm bậc hai đơn giản. Tôi sử dụng nó như là một ví dụ trong một hướng dẫn có thể được tìm thấy trên blog của tôi here, chỉ cần tính toán các con số mà không cần tạo ra một hình ảnh để làm cho nó thậm chí còn đơn giản hơn. Hầu như bất kỳ sự lúng túng nào song song (xem mục nhập Wikipedia) là một vấn đề tốt để bắt đầu.

1

Tôi biết Câu hỏi khá cũ nhưng ... Tôi thấy rằng các tính toán của tập hợp Mandelbrot khá tối ưu cho GPU. Bạn có một vector đầu vào phức tạp (float2) và một đầu ra vô hướng (int) và bạn sẽ có hàng trăm hoạt động cho mỗi vé vào vector trung bình.

Nó có thể được sử dụng như một ứng dụng ví dụ điển hình, vì nó ...

  • có một tập dữ liệu đầu vào 2 chiều (tính toán hình ảnh)
  • bạn có thể giải thích lý do tại sao mặt sóng và 2 chế chiều là có lợi trong một số trường hợp
  • thể hiện kiểu dữ liệu vector
  • tạo ra một hình ảnh, đó là một cách nhanh chóng có thể kiểm chứng bằng mắt người (gỡ lỗi)
  • có thể dễ dàng mở rộng bằng cách: lập bản đồ màu (__const ant), float4 xử lý thay vì float2 (tối ưu hóa), tạo ra các vectơ đầu ra int4 (R, G, B, A) (tối ưu hóa). bước giảm (RGBA) => (RGB)
  • cần kiến ​​thức toán học là chấp nhận được (công thức đơn giản)

Kính trọng, Stefan

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