Uygulamam için daha sonra bölünmüş ve daha küçük kovalara ayrılan bir grup nesneyi (int
s diyelim) ele almam gerekiyor. Bu amaçla, ilgili kovanın birinci eleman ve alt liste uzunlukları uzaklıklar ile verilir, tek bir sürekli diziVerimli kısmi indirimler, alt grupların ofsetleri ve uzunlukları verili
arr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14...}
elemanları ve bölümleri (sublists) hakkında bilgi depolamak.
Dolayısıyla, örneğin, aşağıdaki bölünmeler olmasına neden olur
offsets = {0,3,8,..}
sublist_lengths = {3,5,2,...}
verilen:
0 1 2 || 3 4 5 6 7 || 8 9 || ...
Ne aradığım azalmalar gibi algoritmalar, çalıştırmak için biraz genel ve etkili bir yoldur, yalnızca özel çekirdekler veya thrust
kitaplığı kullanarak kovalarda. kova toplarsak vermelidir:
3 || 25 || 17 || ...
:
seçenek 1: Özel çekirdekleri uğraşının bir biraz gerektirir paylaşılan belleğe kopyalar, doğru seçim blok ve ızgara boyutlarının ve tarama, azaltma, vb. gibi algoritmaların kendi gerçekleştirilmesi. Ayrıca, her bir işlem kendi özel çekirdeğini gerektirir. Genelde, ancak daha akıllı yolu var olabileceğini izlenimi var son birkaç gün için
thrust
kullandıktan sonra bunu nasıl bana açıktırseçenek 2: gelen tuşları bir dizi oluşturmak ofsetler (yukarıdaki örnekte
{0,0,0,1,1,1,1,1,2,2,3,...}
) vethrust::reduce_by_key
kullanın. Yine de fazladan bir liste oluşturmayı sevmiyorum.seçenek 3:
thrust::counting_iterator
ile birlikte kullanınthrust::transform_iterator
anında yukarıda verilen anahtar listesini oluşturmak için. Maalesef, cihazdaki ofset listesindeki endekslerin artışını gerektirmeyen ve paralelliği yitiren bir uygulamayla gelemiyorum.
Bunu gerçekleştirmenin en aklı başında ne olurdu?
Sıkıştırılmış seyrek satır matrisleriyle benzerlik beni de etkiledi. – talonmies