-1
私は便利なデバイス配列ポインタをスワップするために関数swap
を書いたが、それは動作していない、私はスワップ機能でローカル配列ポインタを交換していると私はそれに渡しているものではないと仮定します。CUDA - デバイスアレイポインタを交換するには?
__global__ void device_add_one(float *A, float *B)
{
for (int index = blockIdx.x * blockDim.x + threadIdx.x;
index < N;
index += blockDim.x * gridDim.x)
{
// just for the example
B[index] = A[index] + 1;
{
}
void swap(float *a, float *b)
{
float *temp = a;
a = b;
b = temp;
}
void loop(float *host_array, int size, int loops)
{
cudaMalloc(&A, (size * sizeof(float));
cudaMalloc(&B, (size * sizeof(float));
cudaMemcpy(A, host_array, (size * sizeof(float), cudaMemcpyHostToDevice);
for (int i = 0; i < loops; i++) {
device_add_one<<< 1, 254 >>>(A, B);
// swap pointers like this does not work
swap(A, B);
/* This works:
float *temp = a;
a = b;
b = temp;
*/
}
cudaMemcpy(host_array, A, (size * sizeof(float), cudaMemcpyDeviceToHost);
}
あなたの最初のメソッドは動作します。 [here](https://stackoverflow.com/questions/43482463/cuda-program-not-working-as-fast-as-expected/43485665#43485665)がその一例であり、その他もあります。あなたは完全なコードを示していないし、それがうまくいかない理由を説明していないので、ここで何を言いたいのか分からない。何かがうまくいかないと言っているときは、あなたは[mcve]を提供するはずです(https://stackoverflow.com/help/on-topic)。 –
一見すると、現在の解決法(ループ内のポインタを交換する)*は機能するはずです - どのようにして*動作しませんか? – Marco13
投稿されたコードにはさまざまな構文エラーがあります。あなたはおそらくそのコードをコンパイルすることはできませんでした。いろいろな構文エラーが修正され、必要に応じて適切な 'main'関数と他の定義が与えられた場合、私のテストによれば、あなたが示したコードは正常に動作します。この状態では、この質問はほとんど無責任なので、SOはこの場合の投票の終わりの理由を具体的に示しています。 –