cuốn sách gpt4 ai đã làm

Hiệu suất nhân ma trận thưa x dày đặc không hiệu quả

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 00:43:05 45 4
mua khóa gpt4 Nike

上下文:Tôi sử dụng Eigen cho các mạng thần kinh nhân tạo có kích thước điển hình là khoảng 1000 nút mỗi lớp. Vì vậy, hầu hết thao tác là chuyển đổi ma trận có kích thước ~(1000,1000) M Nhân với vectơ có kích thước 1000 hoặc một loạt vectơ B,Biểu diễn dưới dạng ma trậnKích thước Bx1000.

Sau khi huấn luyện mạng nơ-ron, tôi sử dụng tính năng cắt tỉa - một kỹ thuật nén phổ biến và kết thúc bằng một ma trận thưa thớt (mật độ các tham số không trống từ 10% đến 50%).

Mục tiêu:Tôi muốn sử dụng ma trận thưa để nén và thứ hai là để tối ưu hóa hiệu suất, nhưng đó không phải là mục tiêu chính

câu hỏi: Tôi đang so sánh hiệu suất của phép nhân ma trận thưa và phép nhân ma trận dày đặc (chỉ tính thời gian nhân) cho các kích cỡ lô khác nhau và tôi đang quan sát những điều sau (sử dụng Eigen 3.2.8, MacBook Pro 64-bit, không có open_mp, và sử dụng tiêu chuẩn g++):

  • Khi B=1(ma trận
  • Với B=32:
    • Các phép toán ma trận dày đặc chỉ mất khoảng 10 lần thời gian B=1 - thật tuyệt - nó có hiển thị một số hiệu ứng vector hóa không?
    • Thời gian cần thiết cho các phép toán ma trận thưa thớt là thời gian cần thiết cho B=1 67 - Điều này có nghĩa là nó kém hiệu quả hơn so với việc xử lý 32 vectơ độc lập

Thời gian nhân MxN (ms) cho M thưa/dày đặc và N có kích thước 1000xB

Các số giống nhau nhưng hiển thị thời gian trên mỗi vectơ trong một lô có kích thước khác nhau đối với ma trận thưa thớt và dày đặc. Chúng tôi thấy rõ sự giảm thời gian đối với ma trận dày đặc khi kích thước lô tăng lên và việc tăng cường cho ma trận thưa thớt hiển thị một số sai được chuẩn hóa theo thời gian. =1

mã số:Tôi sử dụng các loại sau cho ma trận thưa thớt và dày đặc:

typedef SparseMatrix spMatFloat;
Ma trận typedef deMatRowFloat;

Những gì tôi muốn điểm chuẩn như sau:

o.noalias()=m*in.transpose();

其中 o là một ma trận dày đặc (1000xB),m là một ma trận dày đặc (1000x1000) hoặc bằng m.sparseView( ),而TRONGlà một ma trận dày đặc (Bx1000)

Mã hoàn chỉnh như sau (Thời gian trung bình cho 20 ma trận ngẫu nhiên khác nhau, mỗi phép tính nhân 50) - Thời gian của B=32 và B=1 như sau.

Mọi phản hồi/cảm giác chân thành đều được chào đón!


đợt 1 tỷ lệ 0,3 dày đặc 0,32 thưa thớt 0,29
đợt 32 tỷ lệ 0,3 dày đặc 2,75 thưa thớt 15,01

#include 
#include
#include
#include

sử dụng không gian tên Eigen;
sử dụng không gian tên boost::timer;

typedef SparseMatrix spMatFloat;
Ma trận typedef deMatRowFloat;

void bench_Sparse(const spMatFloat &m, const deMatRowFloat &in, deMatRowFloat &o) {
o.noalias()=m*in.transpose();
}

void bench_Dense(const deMatRowFloat &m, const deMatRowFloat &in, deMatRowFloat &o) {
o.noalias()=m*in.transpose();
}

int main(int argc, const char **argv) {
tỷ lệ thả nổi = 0,3;
int iter=20;
lô int=32;
float t_dense=0;
float t_sparse=0;

deMatRowFloat d_o1(batch,1000);
deMatRowFloat d_o2(batch,1000);
for(int k=0; k
deMatRowFloat d_m=deMatRowFloat::Zero(1000,1000);
deMatRowFloat d_b=deMatRowFloat::Random(batch,1000);
for(int h=0;h
int i=Rand()%1000;
int j=Rand()%1000;
d_m(i,j)=(Rand()%1000)/500.-1;
}
spMatFloat s_m=d_m.sparseView();
{
bộ đếm thời gian cpu_timer;
for(int k=0;k<50;k++) bench_Dense(d_m,d_b,d_o1);
cpu_times const elapsed_times(timer.elapsed());
nanosecond_type const đã trôi qua(elapsed_times.system+elapsed_times.user);
t_dense+=đã trôi qua/1000000.;
}
{
bộ đếm thời gian cpu_timer;
for(int k=0;k<50;k++) bench_Sparse(s_m,d_b,d_o2);
cpu_times const elapsed_times(timer.elapsed());
nanosecond_type const đã trôi qua(elapsed_times.system+elapsed_times.user);
t_sparse+=đã trôi qua/1000000.;
}
}
std::cout<<"batch\t"<<><><>
}

Kết quả mới sau khi ggael đề xuất:Tôi đã thử các cách kết hợp khác nhau và nhận thấy rằng khi thay đổi MB Thực sự có sự khác biệt lớn về hiệu suất khi RowMajor/Column.

Tóm lại, tôi M*B quan tâm đến cái nào M là (1000,1000) và B is(1000,batch): Tôi quan tâm đến việc so sánh hiệu suất của M thưa/dày đặc và khi lô tăng lên.

Tôi đã thử nghiệm 3 cấu hình:

  • M chuyên sâu, B chuyên sâu
  • M thưa thớt, B dày đặc
  • M thưa thớt và B dày đặc, nhưng phép nhân M*B được thực hiện thủ công theo từng cột.

Kết quả như sau - trong đó số là tỷ lệ thời gian trên mỗi cột của B=32/lần đối với B=1 với ma trận M có mật độ 0,3:

đây

Các vấn đề được báo cáo ban đầu là trường hợp xấu nhất (M ColMajor, B RowMajor). Đối với (M RowMajor, B ColMajor), có tốc độ tăng gấp 5 lần giữa B=32 và B=1 và hiệu suất của ma trận thưa thớt gần như tương đương với hiệu suất của ma trận dày đặc.

câu trả lời hay nhất

Trong Eigen, các sản phẩm vectơ ma trận và ma trận được tối ưu hóa cao cho đại số dày đặc và tận dụng tối đa lợi thế của vectơ hóa. Như bạn có thể thấy, tích ma trận mang lại hiệu quả cao hơn. Điều này là do các sản phẩm ma trận có thể được tối ưu hóa hơn nữa bằng cách tăng tỷ lệ giữa số phép tính số học và số lần truy cập bộ nhớ cũng như bằng cách sử dụng bộ nhớ đệm bộ nhớ.

Sau đó, đối với các sản phẩm có mật độ thưa thớt, có hai chiến lược:

  1. Quét ma trận thưa thớt nhiều lần bằng cách xử lý từng cột dày đặc bên phải. Đối với chiến lược này, tốt hơn nên sử dụng bộ lưu trữ theo cột cho các ma trận dày đặc (vế phải và kết quả). Trong Eigen 3.2, chiến lược này đã được mô phỏng bằng cách quét các cột theo cách thủ công.
  2. Chỉ quét ma trận thưa thớt một lần, xử lý các hàng ở phía bên phải dày đặc để có được vòng lặp lồng nhau nhất có thể. Đây là chính sách mặc định trong Eigen 3.2. Trong trường hợp này, tốt hơn nên sử dụng ma trận dày đặc (Ma trận) sử dụng bộ nhớ lớn theo hàng.

Cuối cùng, trong cả hai trường hợp, bạn có thể thử sử dụng bộ lưu trữ theo hàng và cột chính cho các ma trận thưa thớt và quyết định sự kết hợp nào giữa chiến lược và thứ tự lưu trữ cho các ma trận thưa thớt phù hợp nhất với trường hợp của bạn.

Về c++ - tính kém hiệu quả của phép nhân ma trận thưa x dày đặc, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/39547061/

45 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress