2013-12-10 4 views
0
/* Include Libs */ 
    #include <cuda.h> 
    #include <cuda_runtime.h> 
    #include <cuda_runtime_api.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <iostream> 


int main(void) 
{ 

int a=1; 
int c=2; 
int *deva, *devc; 

cudaMalloc((void**)&deva, sizeof(int)); 
cudaMalloc((void**)&devc, sizeof(int)); 

cudaMemcpy(deva, &a, sizeof(int), cudaMemcpyHostToDevice); 
cudaMemcpy(devc, &c, sizeof(int), cudaMemcpyHostToDevice); 

cudaMemcpy(&c, deva, sizeof(int), cudaMemcpyDeviceToHost); 
cudaMemcpy(&a, devc, sizeof(int), cudaMemcpyDeviceToHost); 

printf("\n%d %d\n", a, c); // Output (should be "2 1") 

cudaFree(deva); 
cudaFree(devc); 

return 0; 

} 

Этот простой код должен заменять a = 1 и c = 2, создавая вывод «2 1», но он ничего не делает, и это не единственный «простой» пример, основанный на учебник, который не работает, например, почему все учебники говорят, что я могу инициализировать a и c как указатели, а затем заполнять их значения, но программа не будет компилироваться, если я это сделаю? Что я здесь упускаю?Простой код CUDA не работает

+0

У вас нет ядра для запуска. –

+0

Код действительно работает для меня. –

+0

Вы можете выполнить проверку ошибок, как указано в [здесь] (http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for-errors-using-the-cuda- runtime-api) Скорее всего, вы сами найдете проблему. –

ответ

1

Ok, я применил this к параллельным частям моего кода, и результатом является одно сообщение об ошибке: «не обнаружено устройство с поддержкой CUDA». Поэтому я думаю, что что-то в сети работает неправильно или у меня нет всех разрешений.

UPDATE: сетевой администратор изменил некоторые настройки, и все работает сейчас.

1

Есть поток ядра с глобальной декларации

__global__ void swap(int *a,int *c) 
{ 
//Swapping using xor operator 
*a=*a^*c; 
*c=*a^*c; 
*a=*a^*c; 
} 

вызова Ядро потока от основной функции, как swap<<<N,1>>>(deva, devb, devc)

вы можете получить дополнительную справку с http://on-demand.gputechconf.com/gtc-express/2011/presentations/GTC_Express_Sarah_Tariq_June2011.pdf

+0

'__global__ void swap (void)'? Вы имели в виду '__global__ void swap (int * a, int * c)'? –

+0

@SagarMasuti я изменил его ... его фактический void swap (int * a, int * c) ... Спасибо u! – Arun

+0

Есть много проблем с этим кодом. Метод подкачки - плохая идея. Количество чтения и записи в глобальную память значительно выше, чем ядро, которое использует одно временное хранилище, и поэтому оно будет работать медленнее. Ядро, как написано, знает только, как обменивать одно значение, и отсутствует много аспектов нормального ядра cuda. Кроме того, вызов ядер с параметрами '<<> - это * плохой способ структурирования кода CUDA. Он представлен в связанной презентации, но предназначен только для обучения, поскольку учащиеся вводятся в концепции блоков и потоков. –

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