0

プロジェクトを CUDA 4.0、Nsight 2.0 から CUDA 4.2、Nsight 2.2 にアップグレードし、CUDA 4.2 で CUDPP を再コンパイルしました。アップグレード後にブレークポイントとステップ デバイス コードを適切に使用できますが、コードが cudppScan() 関数を呼び出すと、関数が操作を適切に実行し、値の正しいプレフィックスサムを返している場合でも、Nsight はアクセス違反を報告します。Nsight なしで実行されているコードをリリースまたはデバッグしても、問題は発生しません。この問題は、次のスニペットで再現できます。

#include <cassert>
#include <cudpp/cudpp.h>

//Cudpp testing
int main(int argc, char* argv[])
{
#define ARRAY_SIZE 32

unsigned int uiArraySize = sizeof(unsigned int)*ARRAY_SIZE;
unsigned int h_auiTest[ARRAY_SIZE];
for(int i = 0 ; i < ARRAY_SIZE ; ++i)
{
    h_auiTest[i] = 1;
}

unsigned int *d_auiTest;
GPUMALLOC((void**)&d_auiTest , uiArraySize);
TOGPU(d_auiTest , h_auiTest , uiArraySize);

unsigned int *d_auiOut;
GPUMALLOC((void**)&d_auiOut , uiArraySize);

CUDPPHandle cudppContext;
CUDPPHandle scanPlan;

CUDPP_SAFE_CALL(cudppCreate(&cudppContext));
CUDPPConfiguration scanConfig;
scanConfig.algorithm = CUDPP_SCAN;
scanConfig.datatype  = CUDPP_UINT;
scanConfig.op        = CUDPP_ADD;
scanConfig.options   = CUDPP_OPTION_EXCLUSIVE | CUDPP_OPTION_FORWARD;

cudppPlan(cudppContext , &scanPlan, scanConfig, ARRAY_SIZE , 1, 0);

cudppScan(scanPlan, d_auiOut, d_auiTest , ARRAY_SIZE);

FROMGPU(h_auiTest , d_auiOut , uiArraySize);

for(int i = 0 ; i < ARRAY_SIZE ; ++i)
{
    assert(h_auiTest[i] == i);
}
}
4

1 に答える 1

1

この問題の唯一の解決策は、プロジェクトを CUDA 4.0 にダウングレードすることです。

于 2012-08-10T19:22:18.403 に答える