Ошибка: идентификатор "blockIdx" не определен - PullRequest
9 голосов
/ 03 февраля 2012

Моя настройка для CUDA

Visual Studio 2010 и 2008 SP1 (требуется CUDA). Параллельный NSight 1.51 CUDA 4.0 RC или 3.2 и тяга

По сути, я следовал руководству: http://www.ademiller.com/blogs/tech/2011/03/using-cuda-and-thrust-with-visual-studio-2010/

Затем я успешно скомпилировал без сообщений об ошибках.

Итак, я попробовал больше примеров кода CUDA из Интернета. Эти ошибки всплыли на Visual Studios. Я все еще могу успешно скомпилировать без сообщений об ошибках, но эти ошибки только визуально выделены

  • «Ошибка: идентификатор« blockIdx »не определен.»
  • «Ошибка: идентификатор« blockDim »не определен».
  • «Ошибка: идентификатор« threadIdx »не определен.»

Вот скриншот.

http://i.imgur.com/RVBfW.png

Должен ли я быть обеспокоен? Это ошибка Visual Studios или моя конфигурация неверна? Любая помощь приветствуется. Спасибо, ребята!

P.S. Я очень новичок в Visual Studios и CUDA.

// incrementArray.cu
#include "Hello.h"
#include <stdio.h>
#include <assert.h>
#include <cuda.h>
void incrementArrayOnHost(float *a, int N)
{
  int i;
  for (i=0; i < N; i++) a[i] = a[i]+1.f;
}
__global__ void incrementArrayOnDevice(float *a, int N)
{
  int idx = blockIdx.x*blockDim.x + threadIdx.x;
  if (idx<N) a[idx] = a[idx]+1.f;
}
int main(void)
{
  float *a_h, *b_h;           // pointers to host memory
  float *a_d;                 // pointer to device memory
  int i, N = 10;
  size_t size = N*sizeof(float);
  // allocate arrays on host
  a_h = (float *)malloc(size);
  b_h = (float *)malloc(size);
  // allocate array on device 
  cudaMalloc((void **) &a_d, size);
  // initialization of host data
  for (i=0; i<N; i++) a_h[i] = (float)i;
  // copy data from host to device
  cudaMemcpy(a_d, a_h, sizeof(float)*N, cudaMemcpyHostToDevice);
  // do calculation on host
  incrementArrayOnHost(a_h, N);
  // do calculation on device:
  // Part 1 of 2. Compute execution configuration
  int blockSize = 4;
  int nBlocks = N/blockSize + (N%blockSize == 0?0:1);
  // Part 2 of 2. Call incrementArrayOnDevice kernel 
  incrementArrayOnDevice <<< nBlocks, blockSize >>> (a_d, N);
  // Retrieve result from device and store in b_h
  cudaMemcpy(b_h, a_d, sizeof(float)*N, cudaMemcpyDeviceToHost);
  // check results
  for (i=0; i<N; i++) assert(a_h[i] == b_h[i]);
  // cleanup
  free(a_h); free(b_h); cudaFree(a_d); 

  return 0;
}

Ответы [ 4 ]

33 голосов
/ 26 марта 2012

Это просто проблема с ключевым словом Visual Intellisense, проводимая самой VS.Коды могут быть успешно созданы, потому что VS запрашивает NVCC, который может найти и распознать эти ключевые слова, для выполнения строительных работ, вы можете просто добавить следующий код для решения этой проблемы в VS2010

 #include "device_launch_parameters.h"
2 голосов
/ 05 февраля 2012

Код скомпилирован правильно, это Visual Intellisense, который пытается разобрать код и отловить ошибки самостоятельно.Уловка, которую я обычно делаю, состоит в том, чтобы иметь «взломанный» заголовочный файл, который определяет все специфичные для CUDA символы (threadIdx, __device__ и т. Д.), А затем включаю его в файл .cu следующим образом:

#ifndef __CUDACC__
#include "myhack.h"
#endif

Таким образом, Intellisense будет читать myhack.h и не будет жаловаться на материал CUDA.Настоящий компилятор nvcc распознает макрос __CUDACC__ и не читает файл хака.

1 голос
/ 06 февраля 2012

В дополнение к ответу CygnusX1, следуйте этим указаниям , чтобы добавить ключевые слова CUDA, такие как blockDim, в свой файл usertype.dat для Visual Studio 2010.

Это должно устранить ошибки Intellisense для этих ключевых слов..

0 голосов
/ 01 марта 2019

Я все еще могу успешно скомпилировать без сообщений об ошибках, но эти ошибки выделены только визуально.

На самом деле я не мог скомпилировать с Visual Studio 2017;


Однако Этот ответ решил. В частности:

В контекстном меню для вашего main.cpp файла нажмите «Переименовать» и переименуйте его в .cu.

В контекстном меню для вашего файла .cu (который вы только что переименовали) выберите Свойства. Затем перейдите к разделу Общие и убедитесь, что для Тип элемента установлено значение CUDA C / C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...