2016-04-15 7 views
-1

私はGTX780を持っています。これは、wikipediaとそのデバイスに直接問い合わせるコードの出力の両方に応じて、計算機能3.5を備えています。ブロックサイズxのサイズ制限は2^31-1(2147483647)です。しかし、以下のコードは、(65535)の場合にのみ、a[0]=1を正常に設定します。これは、バージョン2.x以前のウィキペディアにリストされている制限です。Cudaグリッドのサイズの制限が低いと思われる

#include <iostream> 
#include <string> 

#define print(x) cout << #x << " = " << x << endl; 
#define arg_read(pos, init) argc>pos? stoi(argv[pos]): init; 

using namespace std; 

__global__ void f(int* a) 
{ 
    a[0] = 1; 
} 

int main(int argc, char* argv[]) 
{ 
    int blocks = arg_read(1, 1); 
    int* a; 
    cudaMalloc((void**) &a, sizeof(int)); //allocate a on the device 
    int b=100; 
    cudaMemcpy(a, &b, sizeof(int), cudaMemcpyHostToDevice); //copy b to a 
    f<<<blocks, 1>>>(a); //set a[0] = 1 
    cudaMemcpy(&b, a, sizeof(int), cudaMemcpyDeviceToHost); //copy a back to b 
    print(b); 
} 
+0

すべてのスレッドが同じ場所に書き込もうとすると競合状態や未定義の動作ではありませんか? –

+0

GPUに適したアーキテクチャスイッチでコンパイルします。 '-arch = sm_35' –

+0

@huseyintugrulbuyukisik noすべてのスレッドが**同じ値**を書いているなら、未定義の動作ではありません。書き込みが完了した後、その場所には書き込まれた値が含まれていることが保証されます。 –

答えて

0

本質的に同じproblem as hereであった。 -arch=sm_35タグを使って具体的にコンパイルする必要がありました。

nvcc -arch=sm_35 sandbox.cu -o sandbox.exe 
+1

あなたがリンクしている質問と同じ問題ではありません。リンクされた質問には、(GPUの)ブロックサイズが大きすぎます。ブロックとグリッドのサイズが逆になったら、コードはどのGPUでも実行できます(制限を超えません)。アーチスイッチでコンパイルすることは言及されていません。どのアーチスイッチもなしに。 –

関連する問題