2016-06-02 7 views
0

Я занимаюсь написанием кода CUDA и изучением структуры и идеалов массового параллельного программирования. В любом случае, я столкнулся с проблемой, которую я не совсем понимаю.Аргумент несовместим с параметром того же типа

Вот код:

#include <cuda_runtime.h> 
#include <stdio.h> 
#include <math.h> 

__global__ void cudaTest(struct led* input[]) 
{ 
    int ledNum = blockIdx.x * blockDim.x + threadIdx.x; 
} 

int main() 
{ 
    struct led 
    { 
     unsigned char red, green, blue; 
    }; 

    struct led* input[1200]; 
    struct led* dInput[1200]; 

    cudaMalloc((void**)&dInput, sizeof(struct led) * 1200); 
    cudaMemcpy(dInput, input, sizeof(struct led) * 1200,  cudaMemcpyHostToDevice); 
    cudaTest<<<4, 300>>>(dInput); 
    cudaMemcpy(input, dInput, sizeof(struct led) * 1200, cudaMemcpyDeviceToHost); 
    cudaDeviceSynchronize(); 
    cudaFree(dInput); 

    printf("Input: %d", *input); 

} 

Вопрос гряду через это при компиляции программы:

testCuda.cu (22): ошибка: аргумент типа "во главе **" является несовместим с параметром типа «во главе **»

cudaTest<<<4, 300>>>(dInput); 

Я не понимаю, это по понятным причинам ... Он говорит, что по существу то же самое, не совместимо с самим собой.

Я не знаю, если это проблема с тем, как я выделяю память для массива, с тем, как я инициализирую его, или что бы это ни было. Любая помощь приветствуется.

Редактирование: только для некоторого контекста этот код не имеет приложения, это тестовая программа, которую я использую для проверки кода, прежде чем я его внедряю в свой проект. Цель этой программы проста: выделить пространство для массива на графическом процессоре, перенести его на GPU, вызвать ядро ​​и перенести его.

+0

Не относится к C. – Olaf

+0

К сожалению, удалили тег. – WaffleMan0310

+0

Это, но я вижу, что он говорит, вам нужно больше, чем просто знание C, чтобы понять это. – WaffleMan0310

ответ

3

Компилятор не знает, что ваш struct led, когда он впервые встречает его как тип параметра в вашей функции ядра. Поэтому вам необходимо определить этот тип структуры, прежде чем использовать его, даже в качестве параметра функции. Эта конструкция, которая у вас есть, не будет корректно работать в обычных C или C++, поэтому базовая концепция здесь не специфична для CUDA.

Кроме того, для dInput мы не создаем выделение хоста для указателя, который мы намерены использовать в качестве указателя устройства. Поэтому просто объявите голый указатель, а затем используйте его в cudaMalloc, чтобы привязать его к нему.

попробовать это вместо того, что у вас есть:

#include <cuda_runtime.h> 
#include <stdio.h> 
#include <math.h> 

struct led 
{ 
    unsigned char red, green, blue; 
}; 

__global__ void cudaTest(led *input) 
{ 
    int ledNum = blockIdx.x * blockDim.x + threadIdx.x; 
    input[ledNum].red = 5; 
} 

int main() 
{ 

    led* input = new led[1200]; 
    led* dInput; 

    cudaMalloc((void**)&dInput, sizeof(struct led) * 1200); 
    cudaMemcpy(dInput, input, sizeof(struct led) * 1200,  cudaMemcpyHostToDevice); 
    cudaTest<<<4, 300>>>(dInput); 
    cudaMemcpy(input, dInput, sizeof(struct led) * 1200, cudaMemcpyDeviceToHost); 
    cudaDeviceSynchronize(); 
    cudaFree(dInput); 

    printf("Input: %d", input[0].red); 

} 
+0

Пожалуйста, не просто отправляйте код без объяснений, что пошло не так. – Olaf

+1

Wow ... Я полностью отбросил область действия ... – WaffleMan0310

+0

Для одного вы объявляли массив указателей на строковые структуры .. вместо указателя, указывающего на массив ведомых, который не выглядел так, как вы хотели. Я только что опубликовал ответ в качестве предложения, которое у меня не было времени, чтобы попробовать, так как я работаю :) – Rob

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