5

特別なフラグなしでcubinファイルにコンパイルしているCUDAカーネルがあります。

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;

この行の最初のforループの後

localMatchCounts[threadId] = 5;

予告なしにコンパイルされます。これは、ラインの上のループの一見ランダムな部分をコメントアウトすることによっても達成できます。また、ローカルメモリアレイを通常のアレイに置き換えてみましたが、効果はありません。誰かが問題が何であるか教えてもらえますか?

システムはVista64ビットであり、その価値はあります。

編集:コードを修正して実際に機能するようにしましたが、それでもコンパイラー通知が生成されます。少なくとも正確さに関しては、警告が問題であるようには見えません(パフォーマンスに影響を与える可能性があります)。

4

2 に答える 2

0

問題は char** パラメータに関連しているようです。これを char* に変換すると警告が解決されたので、cuda がこの形式のデータに問題を抱えている可能性があると思われます。おそらく cuda は、この場合、特定の cuda 2D 配列を使用することを好みます。

于 2008-11-18T08:42:46.973 に答える