2012-05-20 48 views
8

Tôi phải đọc ma trận 8192x8192 vào bộ nhớ. Tôi muốn làm điều đó càng nhanh càng tốt.
Ngay bây giờ tôi có cấu trúc này:Đọc tập tin nhanh nhất trong ứng dụng đa luồng

char inputFile[8192][8192*4]; // I know the numbers are at max 3 digits 
int8_t matrix[8192][8192]; // Matrix to be populated 

// Read entire file line by line using fgets 
while (fgets (inputFile[lineNum++], MAXCOLS, fp)); 

//Populate the matrix in parallel, 
for (t = 0; t < NUM_THREADS; t++){ 
    pthread_create(&threads[t], NULL, ParallelRead, (void *)t); 
} 

Trong chức năng ParallelRead, tôi phân tích mỗi dòng, làm atoi và cư trú trong ma trận. Song song là line-khôn ngoan như chủ đề t phân tích dòng t, t+ 1 * NUM_THREADS..

Trên một hệ thống hai lõi với 2 chủ đề, này có

Loading big file (fgets) : 5.79126 
Preprocessing data (Parallel Read) : 4.44083 

Có cách nào để tối ưu hóa này thêm nữa?

+3

Có lẽ bạn có thể bắt đầu các chủ đề phổ biến song song với i/o, khi có đủ dữ liệu. – vanza

+0

Thành thật mà nói, tôi hơi ngạc nhiên khi bạn quản lý để cải thiện hiệu năng * từ việc đọc cùng một tập tin từ nhiều chủ đề ... Khi đo điểm chuẩn, bạn có chắc là tập tin đó thực sự được đọc từ đĩa hay không không phải từ bộ nhớ cache? Ví dụ: – NPE

+0

@aix i hav đã sử dụng 2 chủ đề. Tôi đã song song phần tiền xử lý, đây là sau khi dữ liệu được đọc vào bộ nhớ. – sud03r

Trả lời

2

Một điều đáng xem xét là phân bổ hai bộ đệm đầu vào nhỏ hơn (giả sử chúng sẽ là 200 dòng).

Sau đó, có một luồng đọc dữ liệu vào bộ đệm đầu vào. Khi một bộ đệm đầu vào đầy, hãy chuyển nó vào chuỗi thứ hai thực hiện phân tích cú pháp. Chủ đề thứ hai này có thể sử dụng một nhóm luồng để phân tích đồng thời (kiểm tra OpenMP).

Bạn sẽ phải sử dụng khóa/mutex để đảm bảo rằng một trong hai luồng có quyền truy cập độc quyền.

Điều này sẽ tốt hơn vì việc phân tích cú pháp hiện tại đồng thời với việc đọc tệp và bạn truy cập bộ nhớ vào bộ đệm cục bộ hơn và phù hợp với bộ đệm CPU của bạn. Điều này có thể cải thiện tốc độ đọc và phân tích cú pháp.

Nếu fgets là nút cổ chai, bạn cũng có thể đọc tệp trong bộ nhớ dưới dạng nhị phân. Điều này có thể cải thiện tốc độ đọc, nhưng sẽ yêu cầu bạn phải phân tích thêm và sẽ làm cho việc tối ưu hóa ở trên khó thực hiện hơn.

2

Hãy thử một chuỗi phụ huynh tải mảng ký tự bằng cách sử dụng một cái gì đó giống như fread để tải mọi thứ trong 1 io dưới dạng chuỗi lớn tuyệt vời.

Để cha mẹ đi bộ chuỗi và tìm 1 dòng hoặc tính dòng đầu tiên dựa trên kích thước. Tay xử lý dòng đó cho một sợi. Dòng tiếp theo, rửa sạch, lặp lại, cho đến khi EOF. Đồng bộ hóa với các chủ đề. Làm xong.

1

Hiệu suất tốt nhất bạn có thể nhận được với tệp I/O là thông qua ánh xạ bộ nhớ. This is an example. Tôi sẽ bắt đầu từ một thiết kế đơn luồng và nếu xử lý sau tải chứng minh là một nút cổ chai làm cho nó song song.

22

Bạn nên làm theo cách này. Chủ đề có thể nhận được nhiều cpu chu kỳ của bạn nếu bạn có đủ lõi nhưng bạn vẫn chỉ có một đĩa cứng. Vì vậy, chắc chắn các chủ đề không thể cải thiện tốc độ đọc dữ liệu tập tin.

Chúng thực sự làm cho nó tồi tệ hơn nhiều. Đọc dữ liệu từ một tệp nhanh nhất khi bạn truy cập tệp tuần tự. Điều đó giảm thiểu số lượng đầu đọc tìm kiếm, bởi đến nay hoạt động đắt nhất trên một ổ đĩa. Bằng cách chia nhỏ việc đọc qua nhiều chủ đề, mỗi phần đọc một phần khác nhau của tệp, bạn đang làm cho đầu đọc liên tục nhảy qua lại. Rất, rất xấu cho thông lượng.

Chỉ sử dụng một chủ đề để đọc dữ liệu tệp. Bạn có thể chồng chéo nó với một số chu kỳ tính toán trên dữ liệu tệp bằng cách bắt đầu một chuỗi khi một đoạn dữ liệu tệp được tải.

Làm xem hiệu quả thử nghiệm.Khi bạn chạy lại chương trình của mình, thường sau khi chỉnh sửa mã của bạn một chút, có khả năng chương trình có thể tìm thấy dữ liệu tệp trong bộ đệm ẩn của tệp hệ thống để không cần phải đọc từ đĩa. Tốc độ bus rất nhanh, bộ nhớ, bản sao bộ nhớ. Rất có khả năng trên tập dữ liệu của bạn vì nó không phải là rất lớn và dễ dàng phù hợp với số lượng RAM một máy hiện đại có. Điều này không (thường) xảy ra trên một máy sản xuất. Vì vậy, hãy chắc chắn để xóa bộ nhớ cache để có được con số thực tế, bất cứ điều gì nó cần trên hệ điều hành của bạn.

+2

ông là _not_ đọc các tập tin song song, ông được chuyển đổi chuỗi int8_t 's song song với bộ nhớ. Không có gì sai với điều đó. – kratenko

+0

Tôi không bao giờ tuyên bố có bất cứ điều gì sai trái với điều đó. Tôi thực sự đề nghị chồng chéo lên đó với luồng đọc dữ liệu. –