Ладно, от этого у меня некоторое время болит голова, и я надеюсь, что некоторые эксперты здесь помогут мне с этим.
Короткая версия:
Я пытаюсь скомпилировать MAGMA и получать жалобы о пропущенных символах:
testing_cgemm.o:testing_cgemm.cpp:(.text+0x2e7): undefined reference to `cudaMalloc'
testing_cgemm.o:testing_cgemm.cpp:(.text+0xbff): undefined reference to `cudaFree'
Проверка этих символов как в 32, так и в 64-битном коде в библиотеках cuda, я получаю следующее:
$ /C/Coding/Mingw-w64-tdm/bin/nm C:/Program\ Files/NVIDIA\ GPU\ Computing\ Toolkit/CUDA/v4.0/lib/x64/cudart.lib | grep cudaMalloc
0000000000000000 I __imp_cudaMalloc
0000000000000000 T cudaMalloc
$ nm C:/Program\ Files/NVIDIA\ GPU\ Computing\ Toolkit/CUDA/v4.0/lib/Win32/cudart.lib | grep cudaMalloc
00000000 I __imp__cudaMalloc@8
00000000 T _cudaMalloc@8
Итак64-битные библиотеки выглядят хорошо, и они связывают правильно.Однако 32-битная библиотека (второй вывод) имеет некоторые украшения в имени метода.Вот где я застрял.
Вопросы
Что означают эти украшения?32-битные не простые C?Есть ли шанс связать их правильно?
Контекст
Я хочу скомпилировать MAGMA в Windows 7 (64-разрядная версия) (и 32- и 64-разрядная версия окончательно) и связать ее смоя программа скомпилирована с gcc.Проблема в том, что Cuda в Windows не поддерживает набор инструментов Mingw / MSys, с которым я знаком.Компиляция Cuda с использованием nvcc в Windows, кажется, требует компилятора Visual Studio C cl.exe.Я установил Cuda 4.0 (64-битная загрузка) и успешно скомпилировал примеры (используя VS2008) в 32- и 64-битном вариантах, доказав, что Cuda установлена в обеих битах.
MAGMA, тем не менее, не предоставляет решения для Visual Studio, и у меня недостаточно опыта для его создания, поскольку оно также включает в себя большую часть кода на Fortran, подлежащего компиляции.Поэтому я попытался использовать обе цепочки инструментов (MinGW и VS2008) вместе.Я применил файл make.inc к своим путям и выполнил сборку в три этапа.Сначала, используя Msys / Mingw для компиляции всего фортрановского контента, и после запуска ошибок nvcc, которые не могут найти cl.exe, я переключаюсь на командную строку VS (x86 или x64, в зависимости от разрядности, которая должна бытьвстроенный).Последние шаги заканчиваются файлом архива библиотеки libmagmablas.a, который выглядит правильно.
Однако тогда начинаются проблемы.Используя 64-битный компилятор TDM (gcc-4.5), кажется, что все работает правильно и для компиляции и компоновки примеров MAGMA, но .exe-файлы быстро перестают работать после вызова cuInit ().(Я думаю, что это ошибка / несовместимость компилятора, поскольку то же самое происходит, когда я компилирую примеры Cuda, используя этот набор инструментов Mingw-w64).Поэтому я переключился на 32-битный набор инструментов Mingw-w64, который смог скомпилировать примеры Cuda.Компиляция MAGMA с этим, повторение всех вышеупомянутых шагов идет хорошо до этапа связывания примеров MAGMA.Есть жалобы на отсутствие символов:
testing_cgemm.o:testing_cgemm.cpp:(.text+0x2e7): undefined reference to `cudaMalloc'
testing_cgemm.o:testing_cgemm.cpp:(.text+0xbff): undefined reference to `cudaFree'
Проверка этих символов в библиотеках cuda Получает следующее:
$ /C/Coding/Mingw-w64-tdm/bin/nm C:/Program\ Files/NVIDIA\ GPU\ Computing\ Toolkit/CUDA/v4.0/lib/x64/cudart.lib | grep cudaMalloc
0000000000000000 I __imp_cudaMalloc
0000000000000000 T cudaMalloc
$ nm C:/Program\ Files/NVIDIA\ GPU\ Computing\ Toolkit/CUDA/v4.0/lib/Win32/cudart.lib | grep cudaMalloc
00000000 I __imp__cudaMalloc@8
00000000 T _cudaMalloc@8
Таким образом, 64-битные библиотеки выглядят нормально, и они связываются правильно.Однако 32-битная библиотека (второй вывод) имеет некоторые украшения в имени метода.Вот где я застрял.
Что означают эти украшения?32-битные не простые C?Есть ли шанс связать их правильно?