OpenCL kullanarak n boyutlu noktalar arasındaki Öklid mesafesini hesaplıyorum. İki n-boyutlu nokta listesi alıyorum ve ilk tablodaki her noktadan ikinci tablonun her noktasına kadar olan mesafeleri içeren bir dizi döndürmeliyim.OpenCL kullanarak mizaçsal dizi toplamı OpenCL
Benim yaklaşımım {Table2 {her noktasında ...} için} Tablo-1'de her noktası için (düzenli doble döngü yapmak ve sonra paralell noktaların her çifti için hesaplama yapmaktır.
Öklid mesafe daha sonra 3 bölüme ayrılır: 1. noktalarındaki her bir boyut arasındaki farkı alın. (ki her boyut için hala) arasındaki fark. 2. 4. elde edilen tüm değerleri toparlar. 3'te elde edilen değerin (bu adım bu örnekte atlanmıştır.)
Her şey bir çekicilik gibi çalışır Tüm farklılıkların toplamını (yani, yukarıda açıklanan prosedürün 3. adımını gerçekleştirerek, aşağıdaki kodun 49. satırını) toplamaya çalışın.
Test verileri olarak DescriptorLists kullanıyorum her biri 2 nokta ile: DescriptorList1: 001,002,003, ..., 127,128; (p1) 129,130,131, ..., 255,256; (p2)
TanımlayıcıList2: 000,001,002, ..., 126,127; (p1) 128,129,130, ..., 254,255; (p2)
Sonuçta elde edilen vektör şu değerlere sahip olmalıdır: 128, 2064512, 2130048, 128 Şu anda her koşula göre değişen rasgele sayılar alıyorum.
Neyi yanlış yaptığım konusunda herhangi bir yardım ya da ipucuna minnettarım. Umarım her şey çalışıyorum senaryo hakkında açıktır
#define BLOCK_SIZE 128
typedef struct
{
//How large each point is
int length;
//How many points in every list
int num_elements;
//Pointer to the elements of the descriptor (stored as a raw array)
__global float *elements;
} DescriptorList;
__kernel void CompareDescriptors_deb(__global float *C, DescriptorList A, DescriptorList B, int elements, __local float As[BLOCK_SIZE])
{
int gpidA = get_global_id(0);
int featA = get_local_id(0);
//temporary array to store the difference between each dimension of 2 points
float dif_acum[BLOCK_SIZE];
//counter to track the iterations of the inner loop
int loop = 0;
//loop over all descriptors in A
for (int i = 0; i < A.num_elements/BLOCK_SIZE; i++){
//take the i-th descriptor. Returns a DescriptorList with just the i-th
//descriptor in DescriptorList A
DescriptorList tmpA = GetDescriptor(A, i);
//copy the current descriptor to local memory.
//returns one element of the only descriptor in DescriptorList tmpA
//and index featA
As[featA] = GetElement(tmpA, 0, featA);
//wait for all the threads to finish copying before continuing
barrier(CLK_LOCAL_MEM_FENCE);
//loop over all the descriptors in B
for (int k = 0; k < B.num_elements/BLOCK_SIZE; k++){
//take the difference of both current points
dif_acum[featA] = As[featA]-B.elements[k*BLOCK_SIZE + featA];
//wait again
barrier(CLK_LOCAL_MEM_FENCE);
//square value of the difference in dif_acum and store in C
//which is where the results should be stored at the end.
C[loop] = 0;
C[loop] += dif_acum[featA]*dif_acum[featA];
loop += 1;
barrier(CLK_LOCAL_MEM_FENCE);
}
}
}
. OpenCL için yeni bir tercihim var, ve örnek kodu değiştirmem gerekiyorsa da, bana doğru bir şekilde yönlendirdi.Fark ettiğim önemli şeyler (deneme yanılma yöntemiyle): atılması gereken dizi konumlarına hitap etmeyen iş parçacıkları; SCAN döngüsü, kısmi sonuçları bir araya getirmek ve eklenecek şartları bulmak için sınır koşullarını kontrol etmek için yardımcı bir arabellek kullanarak, biraz ince ayarlamaya ihtiyaç duymuştur. Tekrar çok teşekkür ederim! Benim için çalışan kodu yayınlıyorum. – SebastianP