2011-02-25 63 views
1

我想知道如果我有(N)雙矢量,每個具有大的長度說10,000和我想要(由3對每個向量乘法)到線程的操作線程的成本,其通過使(N)線程。Java初學者:通過串行

我想知道如果有超過一個的操作串行一個利用並行(N)線程的成本是多少?成本(內存,速度等)?

或使用線程實際上是更好的主意,因爲我讀它會使用可用的內核?

+0

相關:什麼是一個線程的粗糙的「成本」(http://stackoverflow.com/questions/1492711/java-what-is-the-rough-cost-of-a-thread-cpu -cycles存儲器) – justkt

+0

說明明顯,我想,但因爲我不能看到它elsewere提到的:它沒有任何意義創建多個線程比你有內核,但除此之外,它取決於開銷創建一個線程與操作的整體運行時間相比較。你需要測試它來找出這些因素相交的地方。 –

+0

如果你想要大規模並行向量操作,你可以看看CUDA,但這對於Java來說會很棘手,而且非常不便攜。 –

回答

2

是:每個線程會佔用資源:至少記憶,但也可能OS進程或其他OS resouces。細節將取決於JVM的實現。

如果內存使用率變高,你也可能會採取的性能損失,由於更頻繁的GC,尋呼和電腦做來管理他們的記憶什麼都

0

當執行內存密集型操作,緩存的大小更可能比你的主內存大小重要。由於共享較低的緩存,因此在使用多個內核時,對這一個緩存的密集使用可能不會提供很大的可擴展性。不過,如果你減少每個內核使用的數據量或者你的操作是不平凡的,你可以接近線性的可擴展性得到

0

你不想爲每個向量創建新的線程(創建一個新線程的開銷重大)。但是,在thread pool中執行此項工作可能會利用多個內核。

聽起來好像:

  • 計算是足夠大,你會從利用多線程受益
  • 各個載體足夠大,它們可以被用來作爲工作的大塊

如果上述屬實,那麼它可能是有意義的使用ThreadPoolExecutor這將使你的每個向量發送到處理線程池。