私はcudaベクトル型の仕組みを理解しようとしています。 n行とm列の行列を持ち、mは4で割り切れないとします。行列は線形化され、GPUメインメモリに格納されます。 float4データ型を使用して、2番目のベクトルの最初の要素を読み取ることは可能ですか?私はそれがどのように動作するかを見るために非常に単純なカーネルを書きましたが、私が使った方法に基づいて、第2のベクトルの最初の要素にアクセスすることはできません。ここでは、コードである:コードでベクトルのサイズが4で割り切れない場合のcuda vector type float 4の使用
#include<iostream>
#include <ctime>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
using namespace std;
#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
inline void gpuAssert(cudaError_t code, const char *file, int line, bool abort=true)
{
if (code != cudaSuccess)
{
fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
if (abort) exit(code);
}
}
__global__ void ker(float * a,int n, int m)
{
float4 f;
f=reinterpret_cast<float4*>(a)[1];
printf("%f %f %f %f,",f.x,f.y,f.z,f.w);
}
int main()
{
int n=2,m=5;
float *a=new float[n*m];
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
a[i*m+j]=rand()%10;
cout<<a[i*m+j]<<" ";
}
cout<<"\n";
}
float * dev_a;
cudaMalloc ((void**)&dev_a,sizeof(float)*m*n);
gpuErrchk(cudaMemcpy(dev_a, a, sizeof(float) * m* n, cudaMemcpyHostToDevice));
ker<<<1,1>>>(dev_a,n,m);
gpuErrchk(cudaPeekAtLastError());
cudaFree(dev_a);
delete []a;
return 0;
}
5私は行列の第2行の最初の4つの要素を印刷する方法、4で割り切れないので、私は、2行5列の行列を有しますフロート4を使用している間カーネルで?データは次のようである場合:
f=reinterpret_cast<float4*>(a)[1];
は、データチャンク9 4 2 5
とf=reinterpret_cast<float4*>(a)[2];
は私が欲しいものではありません9 1 0 0
(4 2 5 9
を読み込み、読み込み)。 float4を使用している間、第2行の最初の4つの要素を読み取ることができる方法はありますか?
4で割り切れるように各行の末尾に0のような余分な数字を埋め込む方法がありますが、データを操作しないで解決策を探しています。