2014-02-17 1 views
0

Я пытаюсь преобразовать следующий код c в CUDA .... В следующем коде у меня есть массив элементов [12, 13, 23, 24, 25] ... Я хочу выход, как [123, 234, 234, 245] .. Вы получите логику, посмотрев на код ...выбрать выбранные элементы после выполнения в ядре CUDA

#include <stdio.h> 
#define N 5 

int main(){ 

int i,j; 
int array[N] = { 12, 13, 23, 24, 25}; 
int new_array[(N-1)*N/2] = { 0 }; 

int k=0; 
for (i = 0; i < N; i++) 
    for(j = i+1; j < N; j++) 
    { 
     if((array[i]-array[i]%10) == (array[j]-array[j]%10)) 
     { 
     new_array[i*N+(j-(i+1))-(i)*(i+1)/2] = array[i]*10 + array[j]%10; 
     k++; 
    } 
    } 

for (i = 0; i < (N-1)*N/2; i++) printf("new_array[%d] = %d\n", i, new_array[i]); 

return 0; 
} 

Теперь проблема возникает, когда я пытаюсь его конвертировать в CUDA ядра ... Я получаю что-то в выходе, но я не знаю, как выбирать селективные элементы и хранить его в массиве ...

#include <stdio.h> 
#define N 5 
__global__ void kernel(int* new_array_d, int* array_d) { 

int i = threadIdx.x; 
int j = threadIdx.y; 

if (j > i && (array_d[i]-(array_d[i]%10)) == (array_d[j]-(array_d[j]%10))) 
     new_array_d[i*N+(j-(i+1))-(i)*(i+1)/2] = array_d[i]*10 + (array_d[j]%10); 
} 

int main(){ 

int array[N] = { 12, 13, 23, 24, 25}; 
int new_array[N-1)*N/2] = { 0 }; 

int* array_d;  cudaMalloc((void**)&array_d,N*sizeof(int)); 
int* new_array_d; cudaMalloc((void**)&new_array_d,(N-1)*N/2*sizeof(int)); 

cudaMemcpy(array_d,array,N*sizeof(int),cudaMemcpyHostToDevice); 

dim3 grid(1,1); 
dim3 block(N,N); 
kernel<<<grid,block>>>(new_array_d,array_d); 

cudaMemcpy(new_array,new_array_d,(N-1)*N/2*sizeof(int),cudaMemcpyDeviceToHost); 

for (int i = 0; i < (N-1)*N/2; i++) printf("new_array[%d] = %d\n", i, new_array[i]); 

return 0; 
} 

Должен ли я попробовать другой индекс или делать это только на процессоре ... ?? Пожалуйста, помогите мне ... Thnks заранее ...

пожалуйста Примечание: Я пытаюсь объединить элементы 12 и 13, только если число, кроме единицы место такое же ... 12 и 13 .. .. (есть 1 общий) ... делаем 12 * 10 + (13% 10) = 123

23 и 25 ..... (есть 2 общий) ... делаем 23 * 10 + (25% 10) = 235 ...

+1

Если вы собираетесь для публикации кода, по крайней мере, сделать эффект t, чтобы убедиться, что он компилируется ... – talonmies

+0

да. Я позабочусь ... спасибо за предложение – user3319055

ответ

2

Помимо вопроса компиляции, о котором сообщается в комментариях выше, ваш код, похоже, не показывает какой-либо логической проблемы. Вы наблюдаете разные результаты для значений неустановленных массивов правильно, потому что окончательные массивы new_array и new_array_d не были инициализированы.

Вы можете решить эту проблему, добавив в него следующие строки кода:

memset(new_array,0,(N-1)*N/2*sizeof(int)); 
cudaMemset(new_array_d, 0, (N-1)*N/2*sizeof(int)); 

Для вашего удобства я сообщаю ниже полный код вместе с инициализацией и ошибки CUDA проверки в смысле What is the canonical way to check for errors using the CUDA runtime API?, является важным вещь, которую вы забыли в вашем коде:

#include <stdio.h> 

#define N 7 

#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); } 
inline void gpuAssert(cudaError_t code, char *file, int line, bool abort=true) 
{ 
    if (code != cudaSuccess) 
    { 
     fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line); 
     if (abort) exit(code); 
    } 
} 

__global__ void kernel(int* new_array_d, int* array_d) { 

    int i = threadIdx.x; 
    int j = threadIdx.y; 

    if ((j > i) && ((array_d[i]-(array_d[i]%10)) == (array_d[j]-(array_d[j]%10)))) 
    new_array_d[i*N+(j-(i+1))-(i)*(i+1)/2] = array_d[i]*10 + (array_d[j]%10); 
} 

int main(){ 

    int array[N] = { 12, 13, 23, 24, 25, 32, 33}; 
    int new_array[(N-1)*N/2] = { 0 }; 

    int* array_d;  cudaMalloc((void**)&array_d,N*sizeof(int)); 
    int* new_array_d; cudaMalloc((void**)&new_array_d,(N-1)*N/2*sizeof(int)); 

    memset(new_array,0,(N-1)*N/2*sizeof(int)); 
    gpuErrchk(cudaMemset(new_array_d, 0, (N-1)*N/2*sizeof(int))); 
    gpuErrchk(cudaMemcpy(array_d,array,N*sizeof(int),cudaMemcpyHostToDevice)); 

    for (int i = 0; i < N; i++) 
     for(int j = i+1; j < N; j++) 
     { 
      if((array[i]-array[i]%10) == (array[j]-array[j]%10)) 
       new_array[i*N+(j-(i+1))-(i)*(i+1)/2] = array[i]*10 + array[j]%10;   
     } 

    for (int i = 0; i < (N-1)*N/2; i++) printf("new_array[%d] = %d\n", i, new_array[i]); 

    printf("\n\n"); 

    dim3 grid(1,1); 
    dim3 block(N,N); 
    kernel<<<grid,block>>>(new_array_d,array_d); 
    gpuErrchk(cudaPeekAtLastError()); 
    gpuErrchk(cudaDeviceSynchronize()); 

    gpuErrchk(cudaMemcpy(new_array,new_array_d,(N-1)*N/2*sizeof(int),cudaMemcpyDeviceToHost)); 

    for (int i = 0; i < (N-1)*N/2; i++) printf("new_array[%d] = %d\n", i, new_array[i]); 

    getchar(); 
    return 0; 
} 
Смежные вопросы