Устранение предупреждений Thrust / CUDA "Невозможно определить, на какой указатель указывает ..." - PullRequest
10 голосов
/ 06 марта 2011

Я пытаюсь создать простое приложение с использованием 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

Их много.

Ответы [ 3 ]

12 голосов
/ 07 марта 2011

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

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

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

Suggeston: игнорируйте эти предупреждения.

4 голосов
/ 06 марта 2011

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

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

или

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

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

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

1 голос
/ 30 мая 2013

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

...