سؤال

أنا في محاولة لدمج CUDA في مشروع موجود، حيث يتم إنشاء العديد من Libs (DLLS). لقد بدأت بنبرة بسيطة للغاية يحسب منتج نقطة:

// dotProd_kernel.cu

__global__ void dotProd( double* result, double* vec1, double* vec2)
{
    int i = threadIdx.x;
 result[i] = vec1[i] * vec2[i];
}

يطلق عليه هذا النواة بواسطة برنامج نصي مضيف:

// doProd.cu

#include <cutil_inline.h>
#include <dotProd_kernel.cu>

extern "C" double CUDA_dot(THTensor *vec1, THTensor *vec2);

double CUDA_dot(THTensor *vec1, THTensor *vec2)
{
    // [content skipped]    

    // execute the kernel
    dotProd<<< 1, nbThreads >>>(device_vec1, device_vec2, device_result_array);

    // [content skipped]

    return sum;
}

قمت بإنشاء ملفات بناء باستخدام CMAKE، واستخدم Visual Studio 2008 Pro لتجميعها. إذا قمت ببساطة باستخدام ملف .cu مع وظيفة Foobar لا استدعاء أي kernel، فإنه ينفذ بشكل جيد. ولكن مع الرمز أعلاه، أحصل على الخطأ التالي:

c:\cuda\include\math_functions.h(3459) : error C2491: 'log1p' : definition of dllimport function not allowed

يتم تصدير التعليمات البرمجية الناتجة التي تسميه رمز CUDA ك DLL. هل هذه هي المشكلة؟

هل كانت مفيدة؟

المحلول 3

في الواقع، تحدد مكتبة CUDA وظيفة LOG1P، وكذلك كان جزءا غموضا من التعليمات البرمجية أحاول إضافة CUDA إلى. وبالتالي، كان هناك نوع من الصراع بين الاثنين. أنا ببساطة إعادة تسمية وظيفة في التعليمات البرمجية الخاصة بي، وقد عملت!

نصائح أخرى

لا أعرف حتى ما هو CUDA، لكنني سألقي نظرة على التعليمات البرمجية التي تحتوي على خطأ التحويل البرمجي (math_functions.h) وننظر إلى الخط 3459 ومعرفة ما يحاول القيام به والبدء من هناك. يبدو أنه لا علاقة له بما تحاول القيام به في التعليمات البرمجية التي نشرتها.

بالمناسبة، إذا كنت تستخدم CUDA 2.3 (أو، ويفضل 3.0)، فعليك أن تكون قادرا على التخلص من خارجي "C".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top