2015-04-02 6 views
0
__global__ void HYPER (int tFast, int tFastLenth, int kilo, int lenPrzvFast, double eps, int AF,double *arrINTLighFast, int *arrPrzvFncFst, int dv_ptr) 
    { 
    for(int j = 0;j<(tFast*tFastLenth);j++) 
     { arrINTLighFast[j]=0; 
     } 
      for(int j = 0;j<(kilo);j++) arrPrzvFncFst[j]=0; 
    for(int j = 1;j<(tFast*tFastLenth);j++) 
     { arrINTLighFast[j]= arrINTLighFast[j-1] + AF*exp(-j/(eps+tFast)); } 

    for(int j = 0;j<(tFast*tFastLenth-1);j++) 
     { 
      for(int i=(arrINTLighFast[j]);i< (arrINTLighFast[j+1]);i++) 
       {arrPrzvFncFst[i]=j;} 
     } 
    for(int j = 0;j<lenPrzvFast;j++) 
     { devvecPrzvFncFst61440Slow149998[j]= arrPrzvFncFst[j] ;} 
} 


int main (void) 
{ 
const int tFast = 9; 
const int tFastLenth = 6; 
double arrINTLighFast[tFast*tFastLenth]; 
int arrPrzvFncFst[61500]; 
int AF = 1000; 
int kilo = 1024; 
int kilo150 = 149998; 
const double eps=0.0000001; 
const int lenPrzvFast=61500; 

    thrust::host_vector<int> vecPrzvFncFst61440Slow149998; 
    int Len_vecPrzv=(lenPrzvFast+kilo150);  
    for (int j=0;j<Len_vecPrzv;j++) vecPrzvFncFst61440Slow149998.push_back(0); 
    for (int j=0;j<Len_vecPrzv;j++)  vecPrzvFncFst61440Slow149998 [j] = 0; 
    thrust::device_vector<int> devvecPrzvFncFst61440Slow149998 = vecPrzvFncFst61440Slow149998; 

    int *dv_ptr = thrust::raw_pointer_cast(devvecPrzvFncFst61440Slow149998.data()); 

    HYPER <<<blocks, threads>>>(tFast, tFastLenth, kilo, lenPrzvFast, eps, AF, arrINTLighFast, arrPrzvFncFst, dv_ptr); 

    thrust::host_vector<int> HostvecPrzvFncFst61440Slow149998 = devvecPrzvFncFst61440Slow149998; 
    std::cout << "Device vector is: " << std::endl; 
    for(int j = 0; j<vecPrzvFncFst61440Slow149998.size(); j++) 
      std::cout << "vecPrzvFncFst61440Slow149998[" << j << "] = " << HostvecPrzvFncFst61440Slow149998[j] << std::endl; 
return 0; 
} 

Существует проблема, я не могу использовать векторы в функции, поэтому я решил использовать упорную :: raw_pointer_cast. Однако у меня есть проблемы: во время компиляции у меня есть ошибка : идентификатор «devvecPrzvFncFst61440Slow149998» не определен. Во-вторых, я не могу defenitely узнать, как передать int * dv_ptr как для функции, так и для прототипа, есть ошибка : аргумент типа «int *» несовместим с параметром типа «int». Я смотрел из интернета, но нет никакого решения, как успешно решить проблемы, которые я уже упоминал вышекак бросить упорную :: device_vector <int> работать с сырым указателем

Спасибо за ваше время

ответ

3

Ваша функция ядра HYPER не имеет определенного параметра devvecPrzvFncFst61440Slow149998, поэтому, когда вы пытаетесь использовать что здесь:

for(int j = 0;j<lenPrzvFast;j++) 
    { devvecPrzvFncFst61440Slow149998[j]= arrPrzvFncFst[j] ;} 

Вы получите недостоверную ошибку идентификатора. Здесь нет никакой магии, ваше ядро ​​CUDA в основном должно соответствовать правилам обычной функции C. Если вы хотите использовать переменную, ее лучше указывать в параметрах функции (кроме глобальных переменных области и встроенных переменных, чего это не так).

Другая проблема вы упоминаете это связано с тем, что dv_ptr является указатель Тип:

int *dv_ptr = thrust::raw_pointer_cast(devvecPrzvFncFst61440Slow149998.data()); 

но вы пытаетесь передать его в положение параметра ядра:

HYPER <<<blocks, threads>>>(..., dv_ptr); 
           ^^^^^^ 

который ожидает обычный (не указатель):

__global__ void HYPER (..., int dv_ptr) 
          ^^^^^^^^^^ 

Следующий код имеет те вопросы фиксированной и компилируется для меня:

#include <thrust/host_vector.h> 
#include <thrust/device_vector.h> 

#define blocks 1 
#define threads 1 

__global__ void HYPER (int tFast, int tFastLenth, int kilo, int lenPrzvFast, double eps, int AF,double *arrINTLighFast, int *arrPrzvFncFst, int *dv_ptr) 
    { 
    for(int j = 0;j<(tFast*tFastLenth);j++) 
     { arrINTLighFast[j]=0; 
     } 
      for(int j = 0;j<(kilo);j++) arrPrzvFncFst[j]=0; 
    for(int j = 1;j<(tFast*tFastLenth);j++) 
     { arrINTLighFast[j]= arrINTLighFast[j-1] + AF*exp(-j/(eps+tFast)); } 

    for(int j = 0;j<(tFast*tFastLenth-1);j++) 
     { 
      for(int i=(arrINTLighFast[j]);i< (arrINTLighFast[j+1]);i++) 
       {arrPrzvFncFst[i]=j;} 
     } 
    for(int j = 0;j<lenPrzvFast;j++) 
     { dv_ptr[j]= arrPrzvFncFst[j] ;} 
} 


int main (void) 
{ 
const int tFast = 9; 
const int tFastLenth = 6; 
double arrINTLighFast[tFast*tFastLenth]; 
int arrPrzvFncFst[61500]; 
int AF = 1000; 
int kilo = 1024; 
int kilo150 = 149998; 
const double eps=0.0000001; 
const int lenPrzvFast=61500; 

    thrust::host_vector<int> vecPrzvFncFst61440Slow149998; 
    int Len_vecPrzv=(lenPrzvFast+kilo150); 
    for (int j=0;j<Len_vecPrzv;j++) vecPrzvFncFst61440Slow149998.push_back(0); 
    for (int j=0;j<Len_vecPrzv;j++)  vecPrzvFncFst61440Slow149998 [j] = 0; 
    thrust::device_vector<int> devvecPrzvFncFst61440Slow149998 = vecPrzvFncFst61440Slow149998; 

    int *dv_ptr = thrust::raw_pointer_cast(devvecPrzvFncFst61440Slow149998.data()); 

    HYPER <<<blocks, threads>>>(tFast, tFastLenth, kilo, lenPrzvFast, eps, AF, arrINTLighFast, arrPrzvFncFst, dv_ptr); 

    thrust::host_vector<int> HostvecPrzvFncFst61440Slow149998 = devvecPrzvFncFst61440Slow149998; 
    std::cout << "Device vector is: " << std::endl; 
    for(int j = 0; j<vecPrzvFncFst61440Slow149998.size(); j++) 
      std::cout << "vecPrzvFncFst61440Slow149998[" << j << "] = " << HostvecPrzvFncFst61440Slow149998[j] << std::endl; 
return 0; 
}