Как использовать переменные устройства extern cuda

Мне нужно написать код в несколько файлов.cu. Но где я должен определить переменные устройства, которые используются для многих файлов.cu.

Пример

Файл common.h

__device__ int x;

Файл A.cu

__global__ void a() 

Файл B.cu

__global__ void b() 

a (), b () оба используют x. что я должен делать?

На языке C я должен написать что-то вроде extern device int x; Затем я определяю устройство int x в другом месте. Но в CUDA я не могу этого сделать. Если я это сделаю, он скажет мне ".........." ранее заявлено здесь

1 ответ

Решение

РЕДАКТИРОВАТЬ: @talonmies был прав (как обычно). Поэтому я удалил свой комментарий о CUDA 4.1

Кроме того, команды компиляции, которые я дал, были не совсем верны. Итак, позвольте мне заменить мой ответ тем, который наглядно работает и имеет надлежащие инструкции.

Для этого вам понадобится CUDA 5.0 и устройство с вычислительными возможностями 2.0 или выше.

Я уверен, что, возможно, есть лучший способ, но мне кажется, что это работает:

com.h:

#ifndef DEVMAIN
extern __device__ int x;
#endif

a.cu:

#include "com.h"
__global__ void a(){

  x = -5;
}

b.cu:

#include <stdio.h>
#define DEVMAIN
#include "com.h"

extern __global__ void a();
__device__ int x;

__global__ void b(){

  x = 5;
}

int main() {
  int temp=7;
  cudaMemcpyToSymbol(x,&temp, sizeof(int));
  a<<<1,1>>>();
  cudaMemcpyFromSymbol(&temp,x,sizeof(int));
  printf("in host : %d\n",temp);
  b<<<1,1>>>();
  cudaMemcpyFromSymbol(&temp,x,sizeof(int));
  printf("in host2 : %d\n",temp);
  return 0;
}

компилирования:

nvcc -arch=sm_20 -dc a.cu
nvcc -arch=sm_20 -dc b.cu
nvcc -arch=sm_20 -o ab a.o b.o

выход:

$ ./ab
in host : -5
in host2 : 5
$

Извините за мои предыдущие ошибки.

Другие вопросы по тегам