سؤال

لدي نواة CUDA أقوم بتجميعها في ملف cubin دون أي علامات خاصة:

nvcc text.cu -cubin

يتم تجميعه، على الرغم من هذه الرسالة:

استشارية:لا يمكن معرفة ما يشير إليه المؤشر، بافتراض وجود مساحة ذاكرة عامة

وإشارة إلى سطر في بعض ملفات CPP المؤقتة.يمكنني أن أجعل هذا يعمل من خلال التعليق على بعض التعليمات البرمجية التي تبدو عشوائية والتي لا معنى لها بالنسبة لي.

النواة هي كما يلي:

__global__ void string_search(char** texts, int* lengths, char* symbol, int* matches, int symbolLength)
{
    int localMatches = 0;
    int blockId = blockIdx.x + blockIdx.y * gridDim.x;
    int threadId = threadIdx.x + threadIdx.y * blockDim.x;
    int blockThreads = blockDim.x * blockDim.y;

    __shared__ int localMatchCounts[32];

    bool breaking = false;
    for(int i = 0; i < (lengths[blockId] - (symbolLength - 1)); i += blockThreads)
    {
        if(texts[blockId][i] == symbol[0])
        {
            for(int j = 1; j < symbolLength; j++)
            {
                if(texts[blockId][i + j] != symbol[j])
                {
                    breaking = true;
                    break;
                }
            }
            if (breaking) continue;
            localMatches++;
        }
    }

    localMatchCounts[threadId] = localMatches;

    __syncthreads();

    if(threadId == 0)
    {
        int sum = 0;
        for(int i = 0; i < 32; i++)
        {
            sum += localMatchCounts[i];
        }
        matches[blockId] = sum;
    }
}

إذا قمت باستبدال الخط

localMatchCounts[threadId] = localMatches;

بعد الحلقة الأولى مع هذا الخط

localMatchCounts[threadId] = 5;

فإنه يجمع مع عدم وجود إشعارات.يمكن تحقيق ذلك أيضًا من خلال التعليق على أجزاء تبدو عشوائية من الحلقة أعلى السطر.لقد حاولت أيضًا استبدال مصفوفة الذاكرة المحلية بمصفوفة عادية دون أي تأثير.يمكن لأحد أن يقول لي ما هي المشكلة؟

النظام هو Vista 64bit، مقابل ما يستحقه.

يحرر:لقد أصلحت الكود حتى يعمل فعليًا، على الرغم من أنه لا يزال يُصدر إشعار المترجم.لا يبدو أن التحذير يمثل مشكلة، على الأقل فيما يتعلق بصحته (قد يؤثر على الأداء).

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

المحلول

تمثل مصفوفات المؤشرات مثل char** مشكلة في النوى، نظرًا لأن النوى لا يمكنها الوصول إلى ذاكرة المضيف.
فمن الأفضل لتخصيص واحد مستمر المخزن المؤقت وتقسيمه بطريقة تتيح الوصول المتوازي.
في هذه الحالة، سأحدد مصفوفة أحادية الأبعاد تحتوي على جميع السلاسل المتوضعة واحدة تلو الأخرى ومصفوفة أخرى أحادية الأبعاد، بحجم 2*numberOfStrings الذي يحتوي على إزاحة كل سلسلة داخل المصفوفة الأولى وطولها:

على سبيل المثال - التحضير للنواة:

char* buffer = st[0] + st[1] + st[2] + ....;
int* metadata = new int[numberOfStrings * 2];
int lastpos = 0;
for (int cnt = 0; cnt < 2* numberOfStrings; cnt+=2)
{
    metadata[cnt] = lastpos;
    lastpos += length(st[cnt]);
    metadata[cnt] = length(st[cnt]);
}
في النواة:
currentIndex = threadId + blockId * numberOfBlocks;
char* currentString = buffer + metadata[2 * currentIndex];
int currentStringLength = metadata[2 * currentIndex + 1];

نصائح أخرى

والمشكلة يبدو أن تترافق مع شار ** المعلمة. تحول هذا إلى شار * حلها التحذير، لذلك أظن أن CUDA قد تواجه مشاكل مع هذا النوع من البيانات. ربما CUDA يفضل أن يستخدم أحد صفائف 2D CUDA محددة في هذه القضية.

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