Satır majör ve Sütun ana matris yerleşimi


16

Yoğun matris hesaplamalarının programlanmasında, sütun-büyük yerleşimin üstünden bir satır-büyük yerleşim seçmek için herhangi bir neden var mı?

Seçilen matrisin düzenine bağlı olarak, önbellek belleklerini hızlı bir şekilde etkili bir şekilde kullanmak için uygun kodu yazmamız gerektiğini biliyorum.

Sıra ana düzeni daha doğal ve daha basit görünüyor (en azından benim için). Ancak Fortran'da yazılmış LAPACK gibi büyük kütüphaneler sütun ana düzenini kullanır, bu nedenle bu seçimi yapmanın bir nedeni olmalıdır.


X sütun vektörü ile b = A * x hesaplamayı düşünürsek, ana A satırı için b (i) elde etmek için A (i,:) ^ T x vektörlerinin iç ürünlerini kullanabiliriz; sütun-majör için sadece skaler çarpma vektörlerine ihtiyacımız olabilir, sum_i A (:, i) x (i). Bana sütun büyük çok daha iyi görünüyor! Ne düşünüyorsun?
Hui Zhang

Sütun gibi sevmek için kendinizi eğitin. Vektörleri sütun veya görsel olarak satır olarak görselleştirdiğinizde kolaydır. Matris çarpımının görselleştirilmesini çok basitleştirir ve birçok yayınlanmış matematiği takip etmeyi kolaylaştırır.
Mike Dunlavey

Yanıtlar:


18

Sütun ana düzeni Fortran tarafından kullanılan şemadır ve bu yüzden LAPACK ve diğer kütüphanelerde kullanılır.

Genel olarak, bir dizinin öğelerine bellekte düzenlendiği sırada erişmek için bellek bant genişliği kullanımı ve önbellek performansı açısından çok daha verimlidir. Matrislerinizin nasıl depolandığına bağlı olarak, bundan yararlanan algoritmaları seçmek istersiniz.

dahili depolama Sütun ana biçiminin dahili depolanması


11

AX=XΛXmatris sütunlarda yazılan tüm özvektörleri içerir. Diğer şekilde yazılmış olduğunu asla göremezsiniz (ancak istatistiklerin sıra vektörleri gibi olduğunu duydum). Bu nedenle, en eski yazılımın sütun ana formatını alması doğaldı, böylece bir vektör kümesi olan bir matrisiniz varsa, herhangi bir tek vektörün depolanması bitişiktir. Böylece, geleneğin günümüze kadar taşındığını hayal ediyorum ve siz Fortran ile etkileşime girmek istiyorsanız, büyük sütun kullanmak istiyorsunuz. Böylece hemen hemen tüm yüksek verimli sayısal lineer cebir sütun majör yapılır.

C'nin ana satır olmasının nedeni, dizinin söz diziminin bir sonucudur; 3 satır x 2 sütun dizisi olarak double a[3][2]bildirirsiniz ve daha sonra endeksler önceki dizinlerden daha hızlı değişir, bu da 2D diziler için satırın büyük olmasını sağlar. Bunu soldan sağa doğal Batı okuma düzeni ile birleştirdiğinizde, satır büyüklüğünü daha doğal gösterir.


2
Bence bunlar zayıf argümanlar. '' 'Double a [3] [2]' '' deki son endeksin en hızlı değişmesi bir tesadüf değil - Fortran'daki bilinçli bir tasarım kararı ile aynı şekilde bilinçli bir tasarım kararıydı. '' 'real (3,2)' '' diziniz olduğunda bunu tersine yapın.
Wolfgang Bangerth

1
Ayrıca, hemen hemen tüm yüksek verimli sayısal lineer cebirin sütun ana olduğu artık doğru değildir. Bu hala BLAS ve LAPACK için geçerli olabilir, ancak son 15 yılda ortaya çıkan her büyük lineer cebir kütüphanesi için hiç doğru değildir: örneğin, hem PETSc hem de Trilinos sıralı büyük seyrek matris depolama formatlarını kullanır.
Wolfgang Bangerth

C sözleşmesinin, muhtemelen doğal okuma düzenine dayanan bilinçli bir karar olduğunun farkındayım. Muhtemelen sayısal lineer cebir göz önünde bulundurularak tasarlanmadığı anlamına gelmekteydi, bu da onu sıradaki büyük tesadüf haline getirdi. İkinci olarak, seyrek matrisler için argümanı beklemek istemedim, sadece yoğun. Seyrek olarak, hem sıkıştırılmış satır hem de sütun formatlarıyla biraz karışık bir geri dönüş.
Victor Liu

5
Konuyu işaretlememek, ancak C başlangıçta B ve BCPL dillerini temel alan ve PDP-11 gibi kayan nokta numaralarına sahip olmayan sistemlerde çalışan bir sistem diliydi. Bunu sayısal olarak düşünerek tasarladıklarını söylemek oldukça zor.
Victor Liu

7
C'deki matrislerin son dizini en hızlı hareket ettirmesinin nedeni, C'nin matris içermemesidir. Şeffaf bellek blokları olarak veya dizilere işaretçi dizileri olarak şeffaf bir şekilde uygulanabilen vektörlerin vektörlerine sahiptir. Dizin sırasını Fortran ile uyumlu hale getirmek, Dennis Ritchie'nin radarında bile değildi (tahmin ediyorum).
Mike Dunlavey

2

Sütun-büyük düzen daha doğal görünüyor. Örneğin, filmi resimdeki resme dosyaya kaydetmek istiyorsanız, sütun sırasını kullandığınızı varsayalım ve bu çok sezgiseldir ve kimse onu satır-büyük sırada kaydetmeyecektir.

C / C ++ 'da programcıysanız, matrisler (Eigen, Armadillo, ...) için varsayılan sütun-büyük sıralamasıyla bazı üst düzey kütüphaneler kullanmalısınız. C / C ++ matris indekslemeyi hatırlatan bir şey sunsa da, sadece manyak satır-büyük sıra ile ham C işaretçileri kullanır.

Basitlik için sıra-büyük düzende olan her şey en azından garip oluşmuş kabul edilmelidir. Dilim dilim, sadece doğal düzen ve sütun büyük düzeni (Fortran gibi) anlamına gelir. Babalarımızın / annelerin bunu seçmelerinin çok iyi nedenleri vardı.

Ne yazık ki açıklığa kavuşmadan önce, muhtemelen deneyim eksikliğinden dolayı satır-büyük sırada çeşitli ilginç kütüphaneler oluşturuldu.

Sağ endeksin bellekte bir adımda daha hızlı değiştiği satır-büyük düzen tanımını hatırlamak için, örneğin A (x, y, z) bu z-endeksidir, farklı dilimlerdeki bellek piksellerinde bitişik olduğu anlamına gelir. istemiyorum. A filmi (x, y, t) için son dizin zaman t'dir. Filmi satır-büyük modunda kaydetmenin imkansız olduğunu hayal etmek zor değil.


2

mxn

  • mben,jbenxm+j
  • mben,jjxn+ben

Şimdi aşağıdaki algoritmayı düşünün:

for i from 1 to m
   for j from 1 to n
      do something with m(i,j)

benxm+j

Sonuç:

  1. evet, bir önemi var, ama seçim verinin erişim şekline bağlıdır. Önceki örnek için, sütun sırası kullanılıyorsa, yapabileceğiniz şey iki döngüyü değiştirmektir.

  2. genel kural: hızla değişen dizin, bellekteki ardışık konumlarla eşlenmelidir.

  3. daha da önemlisi, seçimin etkisinin ölçülmesi / karşılaştırılması esastır, çünkü birçok parametreye (verilerin boyutu, önbellek boyutu, kullanılan dilin çoklu indeksleri doğrusal bir endekse eşleme şekli, çalışma şekli) sistem sanal belleği yönetir, döngülerin kullandığınız lineer cebir kütüphanesinde yuvalanma şekli ...)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.