2014-11-05 2 views
1

Я возился с игрушечной программой для cuda.Ошибка сегментации с добавлением вектора в cuda

Я объявляю передачу массива с плавающей точкой, которая соответствует gpu и числу, каждому элементу этого массива float и передает его обратно в хост-систему и печатает массив. Однако это не работает, и это дает мне ошибку сегментации.

Вот код

#include <iostream> 
using namespace std; 

__global__ void kern(float *a, float *C){ 
    for (int i = 0; i < 3; i++) C[i] = a[i] + i; 
} 

int main(){ 
    float *A = new float[3]; 
    for(int i = 0; i < 3; i++){ 
     A[i] = i; 
    } 

    float * d; 
    float * C; 
    cudaMalloc(&C, sizeof(float)*3); 
    cudaMalloc(&d, sizeof(float)*3); 
    cudaMemcpy(&d, A, sizeof(float)*3, cudaMemcpyHostToDevice); 
    kern<<<1, 1>>>(d, C); 

    cudaMemcpy(&A, C, sizeof(float)*3, cudaMemcpyDeviceToHost); 

    cout << A[2]; 

} 

Кроме того, я не знаком с таНос большинство из моего опыта была с СРР и, следовательно, я более комфортно с новым типом данных []; есть ли эквивалент для Куды?

ответ

3

Изменить это:

cudaMemcpy(&d, A, sizeof(float)*3, cudaMemcpyHostToDevice); 
cudaMemcpy(&A, C, sizeof(float)*3, cudaMemcpyDeviceToHost); 

Для этого:

cudaMemcpy(d, A, sizeof(float)*3, cudaMemcpyHostToDevice); 
cudaMemcpy(A, C, sizeof(float)*3, cudaMemcpyDeviceToHost); 

Кроме того, это всегда лучше хранить код возврата CUDA звонков они дадут вам лучшее представление о том, что происходит не так.

Смежные вопросы