0

最近、gtx550ti ブースト カードを購入しました。古い gf440 カードで動作していたプログラムが失敗します。ここに例があります。次のプログラムは、小さなカーネルでは問題なく動作しますが、大きなカーネルではうまくいきません。

#include "stdio.h"

__global__ void kernel(float * d_in, float * d_out){
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
int idx = x + y * blockDim.x * gridDim.x;
d_out[idx] = d_in[idx];
}


int main(){
    const dim3 gridSize(10,10);
    const dim3 blockSize(80,80);
    const int size = 800*800;
    float * h_in  = new float[size];
    float * h_out = new float[size];
    float * d_in;
    float * d_out;
    cudaMalloc((void**)&d_in, sizeof(float)*size);
    cudaMalloc((void**)&d_out, sizeof(float)*size);
    for(int i = 0; i < size; i++)
        h_in[i] = (float)i;

    cudaMemcpy(d_in, h_in, sizeof(float)*size, cudaMemcpyHostToDevice);
    kernel<<<gridSize,blockSize>>>(d_in, d_out);
    cudaMemcpy(h_out, d_out, sizeof(float)*size, cudaMemcpyDeviceToHost);

    for(int i = 0; i < size; i++)
        printf("%f\n",h_out[i]);

    cudaFree(d_in);
    cudaFree(d_out);
    return 0;
}

浮動小数点数でインデックスを出力することを期待していました。しかし、いくつかのランダムなフロートを出力します:

0.131061
2.520029
9.304665
0.000189
0.242134
0.525557
0.560013

サイズ 100*100

代わりに、サイズ 100*100 に切り替えると:

const dim3 gridSize(10,10);
const dim3 blockSize(10,10);
const int size = 100*100;

そして、それはうまくいきます(最後の5つの出力):

9995.000000
9996.000000
9997.000000
9998.000000
9999.000000

サイズ 500*500

しかし、より大きなサイズ 500*500 の場合:

const dim3 gridSize(10,10);
const dim3 blockSize(50,50);
const int size = 500*500;

間違ったインデックスを出力します (最後の 5 つの出力):

512139.000000
512140.000000
512141.000000
512142.000000
512143.000000

CUDA5.5をインストールしました。ありがとう!

4

1 に答える 1