Разрешение предупреждений Thrust/CUDA "Невозможно определить, на какой указатель указывает..."

Я пытаюсь создать тривиальное приложение с помощью Thrust/CUDA 4.0 и получить много предупреждений "предупреждение: не могу указать, на какой указатель указывает, принимая глобальное пространство памяти"

Кто-нибудь еще видел это и как я могу отключить их или исправить свой код?

Спасибо,

Ade

Вот мой код.

hello.h

class DECLSPECIFIER Hello   
{ 
private:
    thrust::device_vector<unsigned long> m_device_data;

public:
    Hello(const thrust::host_vector<unsigned long>& data);
    unsigned long Sum();
    unsigned long Max();
};

Hello.cu

#include "Hello.h"

Hello::Hello(const thrust::host_vector<unsigned long>& data)
{
    m_device_data = data;
}

unsigned long Hello::Sum()
{
    return thrust::reduce(m_device_data.cbegin(), m_device_data.cend(), 0, thrust::plus<unsigned long>());
}

unsigned long Hello::Max()
{
    return *thrust::max_element(m_device_data.cbegin(), m_device_data.cend(), thrust::less<unsigned long>());
}

Выход

1>  Compiling CUDA source file Hello.cu...
1>  
1>  C:\SrcHg\blog\HelloWorld\HelloWorldCuda>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\bin\nvcc.exe" -gencode=arch=compute_10,code=\"sm_10,compute_10\" --use-local-env --cl-version 2008 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin"  -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include"  -G0  --keep-dir "Debug" -maxrregcount=32  --machine 32 --compile  -D_NEXUS_DEBUG -g    -Xcompiler "/EHsc /nologo /Od /Zi  /MDd " -o "Debug\Hello.cu.obj" "C:\SrcHg\blog\HelloWorld\HelloWorldCuda\Hello.cu" 
1>  Hello.cu
1>  tmpxft_00001fac_00000000-0_Hello.cudafe1.gpu
1>  tmpxft_00001fac_00000000-5_Hello.cudafe2.gpu
1>  Hello.cu
1>C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include\thrust/detail/internal_functional.h(197): warning : Cannot tell what pointer points to, assuming global memory space
1>C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include\thrust/detail/internal_functional.h(197): warning : Cannot tell what pointer points to, assuming global memory space
1>C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include\thrust/detail/internal_functional.h(197): warning : Cannot tell what pointer points to, assuming global memory space

Там много.

Ответ 1

Fermi использует единообразную адресацию общего и глобального пространства памяти, тогда как сообщения pre-Fermi не работают.

В случае с пред-Ферми, когда вы получаете адрес, вы не знаете, должен ли он быть общим или глобальным. Компилятор пытается понять это, но иногда это невозможно. Когда это произойдет, появляется сообщение "Предполагая, что глобальное" верно в 99,999% случаев, потому что, когда вы хотите использовать указатель на общую память, вы обычно явно принимаете адрес общей переменной, и компилятор может это распознать.

Для карт Fermi общий или глобальный может быть выведен во время выполнения (на основе адреса), и никакие предположения не должны выполняться компилятором.

Предположение: игнорировать эти предупреждения.

Ответ 2

Итак... понял это и подумал, что отправлю его здесь. Решение есть либо

Не используйте флаг -G для NVCC

или

Скомпилируйте для arch sm_20 (Fermi), если вы нацеливаете такое устройство

Это известное ограничение NVCC, а не ошибка Thrust. См:

http://groups.google.com/group/thrust-users/browse_thread/thread/1914198abf646c6d/8bc00e6030b0030b?#8bc00e6030b0030b

Ответ 3

если вы используете mirosoft visual studio: from project- > properties- > CUDA C/С++ → Device- > Code Generation; измените compute_10, sm_10 на compute_20, sm_20