1

これが非常に基本的なものである場合は申し訳ありませんが、私はまだ C でできることをすべて学んでおり、これを行う方法がわかりません。

プログラムで int のペアを作成し、それらを格納する必要があります。私がこれまで行ってきた方法は、構造体を作成することです。

struct list_el {
    short *val; //first value
    short *val2; //second value
    struct list_el * next;
};
typedef struct list_el item;

通常のプログラムでリストをうまく反復できますが、これをCudaに送信したいのですが、構造体全体をCudaに転送する方法がわかりません(参照できることはわかっています)。このデータを構造化できる別の方法があるかどうか疑問に思っているので、おそらくその配列ですか?私が必要とする形式は単純なペアです (この 10:5、20:40 など)。最悪の場合、char文字列を使用してペアを文字として使用し、メイン配列がCudaにあるときにそれらを解析できると思いましたが、このリストのリストを作成するより良い方法があるかどうか疑問に思っていますか?

4

4 に答える 4

3

2 つの を参照するものを格納する代わりにint、 のコピーを保持するものを格納しますint

struct list_el {
    int val; //first value
    int val2; //second value
    struct list_el * next;
};
typedef struct list_el item;

参照を保持する方が好ましい場合もあれば、値を保持する方が好ましい場合もあります。何をしようとしているかに応じて、その仕事に適したツールを使用してください。

ちなみに、参照保持構造体はshorts への参照のみを保持していました。s への参照を実際に保持するにはint、必要です

struct list_el {
    int *val; //reference to first value
    int *val2; //reference to second value
    struct list_el * next;
};
typedef struct list_el item;

参照を保持している場合は、構造体参照を破棄する前に、プログラムの残りの部分で参照のメモリを破棄して、プログラムに関連付けられていないメモリにアクセスしないようにする必要があることに注意してください (これはエラーです)。

リストのような構造を使用したくない場合は、他の手法があります。

int val[2] = { 1, 2 };

2 つの s を格納intしますが、int は 2 つだけです。

int val[2][9];

2 の9 つのペアを格納intし、次のように簡単に表すこともできます。

int val[9][2];

そしてもちろん、古いスタンバイがあります

int val = 3;
int val2 = 4;
于 2012-06-12T14:22:39.113 に答える
3

2 つの別々の配列を使用できると仮定し、それらを CUDA で使用/読み取り/書き込みする方法を考えて、主にカーネル内のグローバル メモリからの合体アクセスのために、データを 2 つの配列に配置します。

int *h_val1, *h_val2; // allocate arrays in the host and initialize them

配列のサイズを N とし、配列をデバイス メモリに割り当てます。

int *d_val1, *d_val2;
cudaMalloc( (void**) &d_val1, N * sizeof(int) );
cudaMalloc( (void**) &d_val2, N * sizeof(int) );

ホストからデバイスのメモリにデータをコピーする

cudaMemcpy(h_val1, d_val1, N * sizeof(int), cudaMemcpyHostoToDevice);
cudaMemcpy(h_val2, d_val2, N * sizeof(int), cudaMemcpyHostoToDevice);

カーネルを構成して起動し、配列内の要素と同じ数のスレッドを実行します。

// kernel configuration
dim3 dimBlock = dim3 ( BLK_SIZE, 1, 1 );
dim3 dimGrid  = dim3 ( (N / BLK_SIZE) + 1 );

yourKernel<<<dimGrid, dimBlock>>>(d_val1, d_val2);

これを念頭に置いて、カーネルを実装します

__global__ void
yourKernel(int* val1, int* val2, N)
{
    // map from threadIdx/BlockIdx to index position
    int gid = threadIdx.x + blockIdx.x * blockDim.x;

   if (gid < N)
   {
        int r_val1 = val1[ idx ]; // load from global memory to register
        int r_val2 = val2[ idx ]; // load from global memory to register

        // do what you need to do with pair val1:val2
   }
}

CUDA 関数を呼び出すときは、エラーをチェックすることを忘れないでください。

于 2012-06-12T16:41:01.703 に答える
1

2 次元配列だけを使用するのはどうですか?

int pairs[30][2];

pairs[0][0] = 10;
pairs[0][1] = 5;
// etc.

テストする必要がありますが、テストしたと思います。次のようなこともできます

int pairs[][2] = {{10, 5}, {20, 40}, ...};

初期化用。

注: この方法は、ペアの数が事前にわかっていて、その数が (大量に) 増減しない場合にうまく機能します。ペアの数が大きく変動する場合は、構造体のリストに固執し、エドウィンの答えを使用する方が、長期的にはおそらく良いでしょう。

于 2012-06-12T14:22:54.573 に答える
1

二次元配列を持つことは良い解決策ですが、構造体の解決策を維持しているかのように答えます。

short int を構造体に格納しても問題はありませんが、値を short * に格納することはしません。新しい構造が必要なため、メモリを動的に割り当てる価値はありません。

このデータを格納する構造体の配列を持つことができます。の固定サイズ配列の例を次に示しitemます。

#include <stdio.h>

struct list_el {
    short val; //first value
    short val2; //second value
};
typedef struct list_el item;

item listA[20];

int main()
{
    listA[0].val = 1;
    listA[0].val2 = 2;

    printf("\n%i %i\n", listA[0].val, listA[0].val2);
    return 0
}

これらの構造体がいくつあるか事前にわからないという議論をしたとしても、次のように配列にスペースを割り当てるだけです。

#include <stdio.h>
#include <stdlib.h>

struct list_el {
    short val; //first value
    short val2; //second value
};
typedef struct list_el item;

item * p_list_el,  * pCurStruct;

int main()
{
    int idx;

    /* p_list_el is the pointer to the array. Don't modify.
       pCurStruct can be modified to walk the array. */

    p_list_el = malloc(sizeof(item) * 20);

    for(idx=0, pCurStruct=p_list_el; idx < 20; idx++)
    {
        pCurStruct[idx].val = idx;
        pCurStruct[idx].val2 = idx + 1;
    }


    for(idx=0, pCurStruct=p_list_el; idx < 20; idx++)
    {
        printf("\n%i %i\n", pCurStruct[idx].val, pCurStruct[idx].val2);
    }

    free(p_list_el);
}
于 2012-06-12T15:18:48.743 に答える