0

ブロックごとのスレッドの最大数を動的に決定することは可能ですか? つまり、GPU に値を要求し、それを変数に格納する関数です。ご協力いただきありがとうございます。


ありがとう、私は次のコードでスレッドの最大数を決定しました:

int dev = 0;
cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, dev);

unsigned int maxThreads = deviceProp.maxThreadsPerBlock;

この数値を使用して、カーネルのブロックとスレッドを次の行で計算します。

unsigned int blocksNum = 1+((mSize-1)/maxThreads); // mSize is the size of array
unsigned int threadsNum = 1+((mSize-1)/blocksNum);
dim3 dimGrid(blocksNum, 1, 1);
dim3 dimBlock(threadsNum, 1, 1);
...
kernel<<<dimGrid,dimBlock>>>();

この形式でカーネルを呼び出すのは正しいですか?

助けてくれてありがとう。


OK、私は Nvidia の合計削減カーネル番号 6 を使用しており、次のコードでスレッドとブロックを決定するサンプル コードを使用しています。

unsigned int threadsNum = (mSize < maxThreads*2) ? nextPow2((mSize + 1)/ 2) : maxThreads;
unsigned int blocksNum = (mSize + (threadsNum * 2 - 1)) / (threadsNum * 2);

このコードは私の配列で動作します。

4

4 に答える 4

3

ドライバー API を使用して、特定のカーネル (ドライバー API 用語では関数と呼ばれます) のプロパティにアクセスできます。

CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK に等しいCUfunction_attribute値でAPI 呼び出しcuFuncGetAttributeを使用します。

これにより、以下が得られます。

ブロックあたりのスレッドの最大数。これを超えると関数の起動が失敗します。この数は、関数と、関数が現在ロードされているデバイスの両方によって異なります。

于 2013-02-21T22:19:34.527 に答える
2

デバイスのプロパティを照会し、maxThreadsPerBlockを確認します。

于 2013-02-21T21:21:14.390 に答える
1

はい、値(maxThreadsPerBlock)はcudaGetDevicePropertiesによって返されるプロパティの1つです。完全に機能する例については、deviceQueryサンプルをご覧ください。

于 2013-02-21T21:20:32.260 に答える
0

必要なのは、CUDA ランタイム API を使用している場合は cudaFuncGetAttributes であり、CUDA ドライバー API を使用している場合は RoBiK が彼の回答で指摘したように、CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK を指定した cuFuncGetAttribute です。どちらの関数も、それぞれの API ドキュメントの実行制御セクションに記載されています。

于 2013-12-20T14:20:12.910 に答える