2012-01-13 15 views
15

Aşağıdaki iki satır arasındaki fark nedir? Başka bir deyişle_mm_load_ps vs. _mm_load_pd vs. etc

__m128 x = _mm_load_ps((float *) ptr); 
__m128 y = _mm_load_pd((double *)ptr); 

, neden yerine jenerik __m128 _mm_load(const void *) arasında, çok farklı _mm_load_xyz talimatlar vardır?

+3

'_mm_load_pd' için dönüş türü' __m128d' değil, '__m128' değil –

+0

@ PaulR: Bu, tüm dünyadaki hissi verir. Bunu hiç fark etmedim. İşaret ettiğin için teşekkürler. :) – Mehrdad

cevap

13

Farklı yönergelere karşılık geldiklerinden farklı iç öğeler vardır.

Farklı yükleme yönergeleri vardır; çünkü Intel, tek duyarlıklı vektörler veya tamsayı vektörleri olandan farklı bir fiziksel kayıt dosyası tarafından çift duyarlıklı vektörlerin desteklendiği bir işlemci tasarlama özgürlüğünü korumak veya farklı yürütme birimleri kullanmak ister. Bunlardan herhangi birinin uygun kayıt dosyasına veya iletme ağına yüklenmesi gerektiğini belirtmenin bir yolu yoksa, ek gecikme ekleyebilir.

Bunu düşünmenin bir yolu, farklı yönergelerin "aynı şeyi" gerçekleştirmesidir, ancak ek olarak, yüklenmekte olan verilerin gelecekteki yönergelere nasıl kullanılacağını anlatmak için işlemciye bir ipucu sağlar. Bu, işlemcinin, verilerin olabildiğince verimli bir şekilde kullanılacağından emin olmasını sağlayabilir veya işlemci tarafından göz ardı edilebilir.

Bunun yalnızca bir varsayım olmadığını unutmayın. Bir kayan nokta işlemi tarafından tüketilen veriyi yüklemek için bir tamsayı vektör yükünün (MOVDQA) kullanıldığı kayan nokta işlemi için veri elde etmek için kayan noktalı bir yük kullanmaktan daha fazla zaman gerektiren işlemciler vardır (ve tersi). . Konuyla ilgili daha fazla ayrıntı için Intel Optimizasyon Kılavuzu veya Agner Fog'un notlarına bakın. Gelecekte bu tür performans tehlikeleri riskini önlemek için verileri nasıl kullanacağınız ile eşleşen yükü kullanın.

+0

Whoops, boşver, yanılıyordum - dönüş çeşitleri farklı. Bu şimdi tam anlam ifade ediyor. :) +1 Çok teşekkürler. – Mehrdad

+0

@Mehrdad Bu, dün SSE sorunuzda bahsettiğim aynı etki alanı karmaşasıyla ilgilidir. – Mysticial

3

_mm_load_ps yükler 4 tek hassasiyetli kayar nokta 2 çift hassasiyetli kayar nokta

Bunlar farklı şeyler yapmak değerleri, bu yüzden sadece farklı işlevlere sahip mantıklı düşünmek

_mm_load_pd yükleri değer verir. Ayrıca, C'de aşırı yüklenme yok.

+0

Benimkinden daha iyi bir açıklama :) –

+0

Yani sadece bir semantik sorunu, CPU ile ilgili bir şey değil? – Mehrdad

+0

@Mehrdad, biz burada içsel olarak çalıştığımız için, bu işlevler uygulamalarında farklı olabilir, genellemeye izin vermeyebilir. –