-1

整数を定数メモリにコピーしてグローバル関数で使用するコードを記述しましたが、正しく機能しません。グローバル関数の「cuPrintf」が機能せず、何も出力されないということです。

「if(* num == 5)」のせいだと思いますが、削除したので「cuPrintf」は全部好きなように印刷してくれます!

「if(num == 5)」も試してみましたが、Visual Studioでコンパイルされず、エラーが表示されます。

「cuPrintf」では「num」は正しいのに、「if」ステートメントでは正しくないのはなぜですか。

「if」ステートメントで「num」をどのように使用する必要がありますか?

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include "stdio.h"
#include "stdlib.h"
#include "cuPrintf.cu"

__constant__ int* num;

__global__ void kernel(){
cuPrintf("\n num=%d\n",num);
if(*num == 5)
    cuPrintf("\n num is equal 5");
else
    cuPrintf("\n num is not equal 5");
}

void main(){    
int x;
printf("\n\nPlease enter x:");
scanf("%d",&x);
cudaMemcpyToSymbol( num, &x,sizeof(int)*1);

cudaPrintfInit();
kernel<<<1,1>>>();
cudaPrintfDisplay(stdout, true);
cudaPrintfEnd();

int wait;
scanf("%d",&wait);
}

私が変更した場合:

__constant__ int* num;

__constant__ int num;

また、変更します。

cudaMemcpyToSymbol( num, &x,sizeof(int)*1);

cudaMemcpyToSymbol( &num, &x,sizeof(int)*1);

それから

cuPrintf("\n num=%d\n",num);

任意の入力で「num=0」と表示されます!

4

1 に答える 1

3

「num」はポインタであってはなりません。私はあなたのコードを以下のものに変更しました、私のために働きます(printfにはSM2.0以降が必要であることに注意してください):

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include "stdio.h"
#include "stdlib.h"

__constant__ int num;

__global__ void kernel() {
    printf("\n num=%d\n", num);
    if (num == 5)
        printf("\n num is equal 5");
    else
        printf("\n num is not equal 5");
}

int main() {
    cudaError_t err;
    int x;
    printf("\n\nPlease enter x:");
    scanf("%d", &x);
    err = cudaMemcpyToSymbol(num, &x, sizeof(int) * 1);
    if (err != cudaSuccess) {
        printf("Error: %d\n", err);
        return 1;
    }

    kernel<<<1, 1>>>();
    err = cudaDeviceSynchronize();
    if (err != cudaSuccess) {
        printf("Error: %d\n", err);
        return 1;
    }
    return 0;
}
于 2013-02-06T17:36:44.900 に答える