私は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);
}
すべてのスレッドが同じ場所に書き込もうとすると競合状態や未定義の動作ではありませんか? –
GPUに適したアーキテクチャスイッチでコンパイルします。 '-arch = sm_35' –
@huseyintugrulbuyukisik noすべてのスレッドが**同じ値**を書いているなら、未定義の動作ではありません。書き込みが完了した後、その場所には書き込まれた値が含まれていることが保証されます。 –