AMD ve Nvidia GPU'lar için OpenCL arasındaki performans farklılıklarını değerlendirmeye çalışıyorum. Matris-vektör çarpımını gerçekleştiren bir çekirdeğim var. Çekirdeği iki farklı sistemde çalıştırıyorum, dizüstü bilgisayarım Ubuntu 12.04 ve CUDA 4.0 (OpenCL kitaplıklarını ve başlıklarını içeren) bir NVidia GT525m ve diğeri ise Ubuntu ile tekrar AMD Radeon HD7970 ile bir masaüstü. 12.04 ve en son Catalyst sürücüleri.Derleyici ile AMD OpenCL çekirdeğinde döngüler açmanın bir yolu var mı?
Nvidia OpenCL uygulaması için (~ 6x) büyük bir hız artışı sağlayan iki #pragma unroll
deyiminde çekirdeğim var. Ancak AMD OpenCL sürümü herhangi bir hızlanma üretmiyor. AMD APP çekirdek analizörü ile çekirdeğe bakıldığında, açma sayısının bilinmediği için açma işleminin kullanılmadığı hatası verilir. Yani benim sorum şu ki, #pragma unroll
AMD OpenCL ile çalışıyor mu yoksa bir alternatif var mı (belki de habersiz olduğum bir derleyici bayrağı). Ben (onlara yorum yaparak kontrol)
__kernel void mvKernel(__global float* a, const __global float* x, __global float* y, int m, int n)
{
float sum = 0.0f;
__global float* A;
int i;
int j = 0;
int indx = get_global_id(0);
__local float xs[12000];
#pragma unroll
for(i = get_local_id(0); i < n; i+= get_local_size(0)) {
xs[i] = x[i];
}
barrier(CLK_LOCAL_MEM_FENCE);
A = &a[indx];
#pragma unroll 256
for(i = 0; i < n; i++) {
sum += xs[i] * A[j];
j += m;
}
y[indx] = sum;
}
Bu aynı çekirdek hem uygulamalarda doğru sonuçlar üretir ama #pragma göz önüne sermek komutları AMD için bir şey yapmayın aşağıda çekirdek yer verdik.
Şu anda AMD makinesine erişimim yok, fakat hatırlayabildiğim kadarıyla çekirdek, açılı veya sıfırsız AMD kartında 3.7ms alıyorken, Nvidia kayıtsızca ~ 0.7 ms alıyor. ~ 1,17 ms unroll olmadan ve 2.88 ms ile derleyiciyi tüm derleyici optimizasyonunu kapatan '-cl-opt-disable' bayrağı ile derlersem, bu yüzden çok fazla bir hız gibi görünmüyor. Yarın derleyici günlüğüne bakacağım ve bunun ne verdiğini göreceğim. – andymr
Kayıtlar uygulanıyor, sanırım AMD mimarisi için kodumu daha iyi optimize etmem gerekiyor – andymr