Проблема связывания Visual Studio с Cuda

Я занимаюсь программированием с помощью CUDA C. от nVidia. Я использую Visual Studio 2008 в качестве своего Среда разработки, и у меня возникают некоторые проблемы с некоторыми ссылками, и мне интересно, если кто-то знает способ исправить это или у него была такая же проблема, и может предложить решение.

Моя программа состоит из 3 файлов. 1 файл заголовка (stuff.h), 1 исходный файл C (stuff.c) и 1 файл C CUDA (main.cu). (Названия фальшивые, но это просто для иллюстрации).

Теперь все. h / stuff.c определяет / реализует некоторые вспомогательные функции, которые я вызываю из main.cu.

Я использую Visual Studio 2008 и Cuda.rules из SDK GPU Computing nVidia, и все компилируется нормально, но ... когда это происходит связать все файлы вместе это не удается. Похоже, что все функции, определенные в stuff.h (и реализованные в stuff.c), не связаны должным образом, поскольку они помечены как «неразрешенные внешние символы».

Каковы возможные причины и как можно исправить this?

Большое спасибо,

ExtremeCoder


Хорошо, так что мне удалось собрать все это. Кажется, все, что мне нужно было сделать, это изменить расширение файла реализации вещи с .c на .cpp (то есть компиляция как c ++ работает, а компиляция как c - нет!).

Что может быть причиной этого? Я предпочел бы сохранить все как .c вместо. S

7
задан Majd 23 December 2010 в 15:45
поделиться

5 ответов

Оператор >> выполняет сдвиг битов .

Выражение >> 1 почти * то же самое, что и / 2 , поэтому программист вычислял индекс colorList.Count / 2 , который ** медиана . Чтобы понять, почему это так, вам нужно взглянуть на двоичное представление задействованных чисел. Например, если в вашем списке 25 элементов:

n     : 0 0 0 1 1 0 0 1 = 25
         \ \ \ \ \ \ \
n >> 1: 0 0 0 0 1 1 0 0 = 12

Как правило, использование побитового оператора, когда вы действительно хотите выполнить деление, является плохой практикой. Вероятно, это преждевременная оптимизация, потому что программист думал, что будет быстрее выполнить побитовую операцию вместо деления. Было бы намного понятнее написать разделение, и я не удивлюсь, если производительность двух подходов будет сопоставима.

* Выражение x >> 1 дает тот же результат, что и x / 2 для всех положительных целых чисел и всех отрицательных четных чисел. Однако это дает другой результат для отрицательных нечетных целых чисел. Например, -101 >> 1 == -51 , тогда как -101 / 2 == -50 .

** На самом деле медиана определяется таким образом, только если список имеет нечетное количество элементов. Для четного числа элементов этот метод, строго говоря, не дает медианы.

12
ответ дан 6 December 2019 в 12:45
поделиться

Это побитовый оператор, определение, которое я только что взял из http://en.wikibooks.org/wiki/C_Sharp_Programming/Operators :

Бинарный оператор >> оценивает свои операнды и возвращает результирующий первый аргумент со сдвигом вправо на количество бит, указанное вторым аргументом. Он отбрасывает младшие биты, которые смещены за пределы размера его первого аргумента, и устанавливает новые старшие биты в знаковый бит первого аргумента или в ноль, если первый аргумент беззнаковый.

Его в основном делят на 2 ...

2
ответ дан 6 December 2019 в 12:45
поделиться

>> - это оператор побитового сдвига вправо, а сдвиг colorList.Count вправо на 1 более или менее эквивалентен colorList. Счетчик / 2 .

Сдвиг вправо a >> b можно определить как a / 2 ^ b .

Что касается того, почему вы использовали сдвиг вправо, а не деление на 2, я понятия не имею.

1
ответ дан 6 December 2019 в 12:45
поделиться

Это не очень читаемый код, в основном он просто делит число на 2.

>> - это оператор shift-right, сдвигающий все биты на одну позицию вправо.

0110 (6) становится 0011 (3)

0
ответ дан 6 December 2019 в 12:45
поделиться

Программисты на C (я был одним из них более 20 лет) обычно использовали побитовые сдвиги для умножения или деления на степень 2. Причина заключалась в том, что в более старых архитектурах (например, процессор 2 МГц, 32 КБ памяти и без диска) сдвиг происходил значительно быстрее и, как правило, компилировался в одну машинную инструкцию. Хотя сейчас я пишу в основном на C #, я все же по привычке иногда использую этот трюк. Еще одно распространенное соглашение C, которое никогда не видели большинство программистов на C #, - это присваивание, встроенное в условное выражение. Например:

if ( (a = getmeanumber()) == 0 )
   /* do something */ ;

В любом случае, что касается исходного вопроса и причин его использования, они в основном больше не существуют, за исключением ограниченной области встроенного программирования, где каждый байт и такт могли иметь значение.

1
ответ дан 6 December 2019 в 12:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: