2010-05-27 22 views
9

Açık işlev kodumda kendi işlevlerimi tanımlamak mümkün mü? Evet, basit bir örneği nerede görebilirim? Eğer gibi fonksiyonlar yazabilir here kod örnekleri dayanarakOpenCL kullanıcı tanımlı satır içi işlevleri

+0

Eski soruya ... Bir yanıttan ihtiyacınız başka bir şey? –

+2

Başlık gibi görünüyor ve soru farklı mı? Başlık, özellikle 'inline' için sorar, soru sadece bizim fonksiyonlarımızı tanımlayabilir miyiz soruyor ... –

cevap

5

:

inline int add(int a,int b) 
{ 
    return a+b; 
} 

(Örn DXTC veya bitonic sıralama örneklerde .cl dosyasına bakarak..)

Bilmiyorum Bu bir nvidia sadece uzatma olup olmadığını biliyorum ama OpenCL belgeleri "yardımcı fonksiyonlar" yanı sıra çekirdekler hakkında konuşuyor.

+0

Garip, OpenCL spec __device hakkında bir şey söylemiyor – dmessf

+0

Evet. Merak ettim merak ediyorum. Veya Apple bir uzantı olarak eklediyse. Bu yüzden beni değiştirdiyseniz, test edilene kadar tekrar tekrar modifiye ediyorum :-) – sigfpe

+0

Veya CUDA koduyla karıştırıyorsam. Ben her ikisiyle de oynuyordum. – sigfpe

3

OpenCL, yardımcı işlevleri destekler. Örnekler için sayfa 19/this link'a bakın. Sen parametresi şöyle dizeleri içinde işlevlerini yerleştirebilirsiniz

cl_program clCreateProgramWithSource (  
    cl_context context, 
    cl_uint count, 
    const char **strings, 
    const size_t *lengths, 
    cl_int *errcode_ret) 

programdır oluşturmak için kullanılan

+4

Link! = Işlevsel :( –

+1

@Garet: Teşekkürler – Yktula

+0

Oooh, .. orada iyi bir temel kart üzerinde çok yararlı bilgiler var .. güzel .. –

13

Fonksiyon ...

float AddVector(float a, float b) 
{ 
    return a + b; 
} 

kernel void VectorAdd(
    global read_only float* a, 
    global read_only float* b, 
    global write_only float* c) 
{ 
    int index = get_global_id(0); 
    //c[index] = a[index] + b[index]; 
    c[index] = AddVector(a[index], b[index]); 
} 

Şimdi bir kullanıcı tanımladığınız işlev "AddVector" ve bir çekirdek fonksiyonu "VectorAdd"

2

Biraz araştırdım ve şu soruya geri dönüp durdum: -P

Sonuçta yaptığım makroların kullanımıydı, çünkü satır içi uygulamalara bağlı olsa da, makrolar c99 OpenCL programları bağlamında büyük bir dezavantaja sahip değiller mi? örneğin:

#define getFilterBoardOffset(filter, inputPlane) \ 
    ((filter * gInputPlanes + inputPlane) * gFilterSizeSquared) 
#define getResultBoardOffset(n, filter) \ 
    ((n * gNumFilters + filter) * gOutputBoardSizeSquared) 

yerine:

inline float getFilterBoardOffset(float filter, int inputPlane) { 
    return (filter * gInputPlanes + inputPlane) * gFilterSizeSquared; 
} 
inline float getResultBoardOffset(float n, int filter) { 
    return (n * gNumFilters + filter) * gOutputBoardSizeSquared; 
}