Mảng đồng phục chậm trong shader khiến FPS giảm


7

Tôi đang cố gắng sử dụng một mảng ma trận thống nhất trong trình đổ bóng tính toán của mình. Tuy nhiên, nó thực sự rất chậm. Tôi đã thu hẹp nó xuống dòng mã này:

uniform mat4 someMatrixArray[64]; 
...
vec4 result = vec4(0);
for (int i = 0; i < 2048; i++) {
    result += someMatrixArray[i%64][0] * 0.01;
}

Khi không truy cập someMatrixArray tôi nhận được hơn 700 khung hình / giây. Khi truy cập nó, tôi có 10 khung hình / giây. Bất cứ ai cũng có một ý tưởng những gì có thể gây ra điều này? Nó có thể là một vấn đề trình điều khiển?

Tôi đã cố gắng để hủy bỏ các vòng lặp (thông qua #pragma optionNV (unroll all)) nhưng điều đó không giúp được gì. Tôi đang sử dụng GTX670 với trình điều khiển mới nhất trên windows 7.

Biên tập:

Việc lắp ráp được tạo cho vòng lặp bên trong là:

MAD.F R0.xyz, c[196], {0.0099999998, 0, 0, 0}.x, R0;

Có vẻ như giá trị của resultcó thể được xác định tĩnh mà không cần phải được đánh giá trong shader. Tại sao không tính toán nó trên CPU và chuyển giá trị cuối cùng của resultshader thành đồng phục?
Nicolas Louis Guillemot

Đây chỉ là trường hợp thử nghiệm của tôi :) mã thực tế của tôi trông khác (Tôi đang cố gắng thực hiện tô bóng bị trì hoãn lát gạch)
tobspr

hãy thử chia số nguyên thay vì phép nhân float và xem những thay đổi bạn nhận được: result += someMatrixArray[i%64][0] / 100;
Tom 'Blue' Piddock

1
@Blue Điều đó thật thú vị nếu điều đó thực sự có ích. Tập lệnh ARB dường như không có phân chia / thêm kết hợp giống như để nhân / thêm. Về lý thuyết, nó sẽ chia nó thành hai hướng dẫn hoặc chuyển đổi nó thành phép nhân như một tối ưu hóa trình biên dịch. Mặc dù tôi đã nhìn thấy những thứ điên rồ hơn, nhưng chắc chắn nó sẽ không nằm ngoài khả năng. Bộ hướng dẫn là ở đây. Renderguild.com/gpuguide.pdf
Evan

1
Nếu tôi là bạn, tôi sẽ sử dụng một cái gì đó như developer.nvidia.com/nvidia-visual-profiler để hồ sơ shader chạy để xác định xem nút cổ chai của bạn đang đọc từ vị trí biến thống nhất đó hay chỉ đơn giản là số chu kỳ đồng hồ đã sử dụng vòng lặp. Vì mỗi vòng lặp đang chuyển sang một lệnh MAD duy nhất đọc và ghi vào cùng một thanh ghi, rất có thể nó đang đọc từ c [index] hoặc đơn giản là quá nhiều lần lặp.
Evan

Câu trả lời:


1

Có, việc truy cập bộ nhớ luôn có thể chậm hơn đáng kể so với việc không truy cập bộ nhớ. Đặc biệt trong một vòng lặp for thực thi 2000 lần trong một shader.

Tôi không nghĩ có gì đặc biệt đáng ngạc nhiên ở đây - chia nhiệm vụ thành các bước nhỏ hơn để mỗi bước có thể được thực thi song song và sử dụng lượng dữ liệu nhỏ hơn chắc chắn sẽ giúp ích.


Vâng, đó cũng là những gì tôi đã tìm ra :) Tôi đã chia nó thành nhiều lượt, và bây giờ nó hoạt động tốt
tobspr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.